Linux再入門してみた

# はじめに
[新しいLinuxの教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Linux&qid=1584175006&sr=8-1)をよんでLINUXに再入門してみました。

# ターミナル
ユーザーがコンピュータへ入出力する際に利用する専用のハードウェアのことただし、現在は物理的なターミナルを**ソフトウェア**によって実装た**ターミナルエミュレータが利用される**

いろんな呼ばれ方

* ターミナルエミュレータ
* 端末
* 仮想端末
* 端末エミュレータ
* 端末ウインドウ
* コンソール
* コンソール端
* など

# シェル
bash

##  シェルのトラブル対応
* Ctr+s 画面表示をロック
* Ctr+q 画面表示のロックを解除

シェル上ではCtr + キーを **^キー**で表現する

## コマンド履歴
Ctr + r

```
(reverse-i-search)`':
```
一文字入力するごとに履歴を検索するモード
さらに

* `Ctr + r`と押せば一つ前の検索結果へ移動
* Enterで検索結果を実行
* 現在の検索結果を表示したまま、コマンドラインに戻る
* `Ctr + g`で結果をはき　、プロンプトに戻る
* `Ctr + s`で一つ戻るけど、画面ロックに割当られているので、解除する必要あり

# コマンド
## find
* ファイルの種類で探す
  - -type f ファイル (デフォルト)
  - -type d ディレクトリ
  - -type l シンボリックリンク

```
find ./ -type f -name aaa.txt -print
```

# bash
## シェル変数
bash 内部で使用される変数。bashが参照しているので、特別な意味を持つシェル変数が多く用意されていろいカスタマイズすることができる

* PS1
  - プロンプト設定
* PATH
  - コマンド検索パス
* LANG
  - 現在のロケール。シェルのメッセージの表示言語や日付の書式
  - 自動的に環境変数として設定される
  
```
var1="aaaaaa"
echo $val1
```

## 環境変数
* 外部コマンドはファイルシステム上に存在するコマンド
* 組み込みコマンドはシェル自体に内蔵しているコマンド

**環境変数は外部コマンドからでも値を参照できる**
**多くのシェル変数が環境変数として設定されている**

```
printenv
export シェル変数名
```

## bashの設定ファイル
ログインシェルの読み込む順番

```
/etc/profile
↓
~/.bash_profile
↓
~/.bashrc
```

非ログインシェルの読み込む順番

```
~/.bashrc
```

使い分け

* /etc/profile
  - **すべてのユーザに共通の設定項目**

* ~/.bash_profile
  - **ログイン時に一度だけ設定すればよい項目**

* ~/.bashrc
  - **bashを起動ｓるたびに毎回設定する必要がある項目**

**多くの設定はbashを起動するたびに毎回設定する必要があるので.bashrに書けばよい**

# ユーザーとグループとパーミッション
* グループは同じ役割をもつユーザーをまとめたもの
* システム管理者の権限をもたせたいユーザにはwheelグループに所属させればよい
* デフォルトでユーザーはユーザー名と同じグループに所属する

## ファイルパーミッション

```bash

-rw-r--r--.  1 root root      21554 Nov 15  2018 test
```

オーナー:グループ：その他ユーザー

## ディレクトリのパーミッション

```bash

drwxr-xr-x   2 root root       4096 Mar 14 17:00 test-test
```

ファイルを削除できるかどうかはディレクトリのパーミッションで決まる
ディレクトリでxが設定されている場合、ｃｄでそのディレクトリに移動したり、ディレクトリ下にあるファイルの読み書きができる

# ルートユーザー
## su

```
su - //　rootユーザーの環境に初期化されて
su   // 環境変数やカレントディレクトリなど現在の環境を維持したままユーザーだけが切り替わる
```

## sudo
別のユーザとしてコマンドを実行するために利用

```
sudo cat /etc/shadow
```
現在ユーザーのパスワードを求められる
許可されていればコマンドを実行できる

ユーザーへのsudo許可

/etc/sudoers
visudoコマンドで編集する

wheelグループに所属させるとすべてのコマンドが実行できる

```
<ユーザーor%グループ> <マシン名>=(<権限>)<コマンド>
%wheel ALL=(ALL) ALL
```

sudo を使って、rootユーザーでの操作は最小限にする

# プロセス
* メモリジュオで実行状態にあるプログラム
* 実行ユーザーが設定されていちえ、他人のプロセスを勝手に操作することもできない
* すでに存在している別のプロセスをもとに作成される。親子関係。
* デーモン  ターミナルに接続していないプロセス

## psコマンド プロセスの表示
TTYはターミナルを意味している。
ハイフンをつけるのはUNIXオプション
ハイフンをつけないのはBSDオプション。BSDオプションが主流らしい。

現在のターミナルで実行しているプロセス

```
# ps
  PID TTY          TIME CMD
24021 pts/0    00:00:00 su
24022 pts/0    00:00:00 bash
26512 pts/0    00:00:00 ps
```

**現在のユーザー**が実行中のプロセス
fは親子も示す

```
# ps xf
```

システムで動作しているすべてのプロセスを表示

```
# ps ax
```

よく使うやつ

```
# ps auxfwww  // xで詳細 wwwで表示幅を制限しない
```

UNIXオプション(ハイフンつける)

```
# ps -ef  //eですべてのプロセスを表示 fで親子
```

## killコマンド
シグナルを送信するコマンド

kill -シグナル名

デフォルトはTERM

```
kill -TERM プロセスID
```

TERMは終了。
プログラムの種類によってはTERMシグナルを受信したときに現在の状態を保存したり、一時ファイルを削除したりして終了するので、まずはkillしてそのあと強制終了させたほうがよい


# リダイレクト
標準エラー出力はプログラムのエラーメッセージを出力するためのチャンネル

標準エラー出力のリダイレクト

```
ls aaaaa 2> aaa.txt
```

標準出力(1)と標準エラー出力(2)をまとめる
2を1へ

```
ls aaaa > aaaa.txt 2>&1
```
標準出力をaaaa.txtへ。標準エラー出力を1とおなじものへ。
&1は標準出力を表す

/dev/null

エラーメッセージを非表示にする

```
ls / /xxxxx 2> /dev/null
```

# grep
正規表現は``で囲む。
grep 't[ef]'

正規表現を使う場合は拡張正規表現を使えるgrep -E を指定すればよい

## 拡張正規表現
* 使えるメタ文字を増やした拡張正規表現
* grep -E で使える。 -Eをつけないと普通の正規表現。