Linux標準教科書 自分がよく知らなかった部分まとめ

今回読んだ本は以下から無料でダウンロードすることができます。

https://linuc.org/textbooks/linux/

### 3章 基本的なコマンド

#### 3.1.2ファイルやディレクトリの参照(ls)
lsのオプション

```
-t
最終更新時間によってソートをして出力する。

-r
逆順にソートして出力する
```

#### 3.1.5 ファイルのコピー(cp)
cpのオプション

```
-i
処理を行う時に確認をする。ファイルを上書きコピーするときなど、-iオプションをつけていると、確認の問い合わせをしてくれる。

-r
ディレクトリをコピーする。
cpはファイルをコピーする機能のみだが、-rをオプションをつけていると、ディレクトリの中にある全てのファイル・ディレクトリhに対してコピーを行うことができる。

-p
元ファイルの情報を保存する
コピーすると所有者、属性、更新日時などが新しい内容になってコピーされるが、古い情報を保持したままコピーするのがこのオプション
```

#### 3.1.6 ファイルの移動(mv)

mvのオプション

```
-i
cpと同じ

-f
確認を無視して強制的に処理を実行させるオプション
```

#### 3.2.3　ディレクトリの作成(mkdir)

mkdirのオプション

```
-p
指定されたディレクトリの上位ディレクトリも作成する
```

例)
例えば`dir1/dir2/dir/3`という構造のディレクトリを作成したい場合、

-pオプションを使用せずに作ろうとすると

```
mkdir dir1
mkdir dir1/dir2
mkdir dir1/dir2/dir3
```

としなければいけない。
もしいきなり`mkdir dir1/dir2/dir3`を打つと以下のエラーが起こる

```
mkdir: dir1/dir2: No such file or directory
```

-pオプションを使用することで一気に作成することができる。

```
mkdir -p dir1/dir2/dir３
```

### 4章 正規表現とパイプ

#### 4.1 標準入出力
> Linuxのプログラムには「1つの入り口と2つの出口」があります。それぞれを標準入力•標準出力•標準エラー出力といいます。
lsコマンドを打った場合、カレンとディレクトリのファイルとディレクトリの一覧が画面上に表示されます。このように結果が画面に表示されることを「標準出力に出力された」と表現します。

#### 4.2　リダイレクト
コンソールに出力された文字列はリダイレクトを使ってファイルに書き込むことができる。
リダイレクトは `>` を使って表す。

#### 4.3 標準エラー出力
エラーメッセージを画面に表示させずに指定したファイルに出力させるには

```
ls -l tekitou > ls-l-output-second 2>&1
```

とする。

標準出力と標準エラー出力が分かれている理由

> 標準出力と標準エラー出力が分かれているメリット
今までの話から、標準出力と標準エラー出力が分かれている意味はなんだろう？と思われるかもしれません。これは例えばスクリプトの実行時などをイメージすると分かりやすいと思います。次の例ではaaa.shの実行結果をbbb.logに書き込んでいます。
$ ./aaa.sh > bbb.log
このとき実行の結果、エラーが発生した場合、端末にエラーが表示されることになります。
$ ./aaa.sh > bbb.log
cat: aaa: No such file or directory
なぜなら、標準出力はすべてbbb.logにリダイレクトされますが、標準エラー出力はリダイレクトされていないからです。これによりスクリプト実行時にエラーが発生した場合はエラーに気づくことができます。

https://int-infra.hatenablog.com/entry/2016/04/24/013614

#### 4.5.2 様々な条件を用いたgrepコマンドの実行

grepのオプション

```
-e
文字列を検索パターンとして扱う

-i
検索パターンと入力ファイルの双方で、英大文字と小文字の区別を行わない

-v
検索パターンとマッチしなかった行を選択する。
```

### 第5章　基本的なコマンド2

#### 5.1 ファイルのタイムスタンプの変更(touch)

touchはファイルを作成するコマンドだと思ってましたが、実は違ったようです。

> touchコマンドを実行すると、ファイルのタイムうスタンプが現在日時に変更されます。ファイルが存在しない場合、touchコマンドは中身が空である0バイトのファイルを作成します。

#### 5.2.1 head

ファイルの先頭部分を標準出力する。
オプションをつけない場合は先頭から10行目を標準出力する。

headオプション

```
-n
先頭から指定した行を標準出力する

-c
先頭から指定したバイト分を標準出力する
```

5.3 テキストファイルのソート(sort)
> テキストファイルの中身をソートするにはsortコマンドが使えます。オプションでどのような順序でソートするか指定することができます。

sortオプション

```
-r
逆順でソートする

-k n
n列目のデータをソートする

-n
数値としてソートする
```

> オプションを特につけない場合は各行の一文字目をアルファベット順でソートされます。

#### 5.4 行の重複の消去(uniq)

> uniqコマンドを使うことで***直前の行と同じ内容があった場合***、対象行を***出力***しません。連続している同じ内容の行を1行にまとめることができます。

```
$ cat > uniq-sample
AAA
BBB
AAA
CCC
CCC
DDD
```

上記のようなテキストファイルがあったとしてuniqを使用すると以下のようになります。

```
$ uniq uniq-sample
AAA
BBB
AAA
CCC
DDD
```

これは使ったことも見たこともありませんでした。
またこのコマンドはあくまで重複したものを***出力***しないだけで中身のコードについてはそのままです。

#### 5.5 文字列の置き換え(tr)
trはtranslateの略です。

```
tr 文字列1 文字列2
```

文字列1を文字列2に変換します。

こちらもuniqと同じく***出力***に関してであり、ファイルないのコード自体の変化は起きていませんでした。



### 7章 管理者の仕事

#### 7.1.1 ユーザー
> メモリやファイルなどの様々な資源を利用するためにユーザーという最小単位で権限を定義できます。
ユーザの定義は`/etc/passwd`ファイルに記述します。
`useradd` => 新しいユーザーの追加
`usermod` => ユーザーの定義の変更
`userdel` => ユーザーの削除

#### 7.1.2 ユーザーの作成

```
useradd ユーザー名
```

オプション

```
-c コメント
コメントの指定

-g グループ名
グループ名は/etc/groupファイルで定義したグループ名

-G グループ名
補助グループを指定

-d
ホームディレクトリの指定

-s
シェルの指定

-u ユーザーID番号
ユーザーID番号を指定
```

```
// usersグループに所属するユーザーIDが1001のpenguinユーザーの作成
useradd -g users -u 1001 penguin
```

#### 7.1.5 グループ
> ユーザーは必ず1つ以上のグループに所属していて、主に所属するグループをプライマリグループと呼びます。グループの定義は `/etc/group`ファイルに記述します。

#### 7.1.6 グループの作成

```
groupadd グループ名
```

オプション

```
-g グループID番号
グループID番号を指定します。
```

```
groupadd -g 1001 linuc
グループID1001のlinucというグループの追加
/etc/groupファイルにlinucグループが追加される
```

#### 7.2　パスワードとパスワードファイル

> パスワードは `/etc/shadow`ファイルに暗号化されて記録されます。パスワードの変更はpasswdコマンドを使って行います。

#### 7.2.1 パスワードファイル(/etc/passwd)
ユーザーの情報は/etc/passwdファイルに保存され、1行に1ユーザーの情報を:で区切って記述します。

```
 account:password:UID:GID:GECOS:directory:shell
```

![スクリーンショット 2021-10-11 14.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/9e0fb40d-d14b-15d1-0e90-c355a69e08af.png)

#### 7.2.2 グループファイル(/etc/group)

グループの情報は/etc/groupファイルに保存されます。

```
 group_name:password:GID:user_list
```

![スクリーンショット 2021-10-11 14.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/edc736cc-5c48-9071-9ef5-5d0a7c6e22f8.png)

#### 7.2.3
ユーザーの権限を使うにはユーザー名とパスワードを使って認証する。
作成したユーザーはパスワードを登録するとログインができるようになる。
パスワードの設定にはパスワードが必要なため、まずrootユーザーでパスワードを登録してから
追加したユーザーでログインする必要がある。

#### 7.3.1 一般のユーザーとグループ

> アカウントを作成するとユーザー名と同様の名前のグループが作られ、ユーザーはそのユーザーグループに所属しているとシステムに登録されます。

例) もし`hogehoge`というアカウントを作成した場合、`hogehoge`というグループが作られ、ユーザーはそのグループに所属していると登録される。

#### 7.3.2 rootユーザー
> 利用に制限がないユーザー。アクセス権に関係なく、全てのユーザーのディレクトリへのアクセス、コンテンツの読み書きが行える

#### 7.3.3 suコマンド

> suコマンドはすでに別のユーザーでログインしているユーザーが、一時的に他のユーザーになるためのコマンドです。suコマンドを実行する際、オプションとしてユーザーを指定しない場合はrootユーザーでシェルを起動します。

### 8章 ユーザ権限とアクセス権

#### 8.2.2　アクセス権の変更

> モードの指定にsetuidビットとsetgidビットとstickyビットという、特殊な属性があります。setuidビットあるいはsetsetgidビットがついたプログラムを実行すると、ファイル所有者あるいは所有グループの権限で実行されます。stickyビットがついたディレクトリ内のファイルは所有者以外が削除できなくなります。

setuidとsetgidは+sで、stickeyビットは+tで付与できる。

```
$ chmod u-s,g+s idbitfile
$ chmod +t idbitfile
```


https://docs.oracle.com/cd/E56342_01/html/E53949/secfile-69.html

#### 8.2.3 ファイル作成のモード

> ファイルを新規に作成すると、ユーザごとに規定されたパーミッションである644,もしくは664といったパーミッションが設定されてファイルが作成されます、umaskコマンドを使うことで、指定したパーミッションでファイルを作成するように制限できます。

```
umask [8真数のモードのマスク値]
```

### 9章 シェルスクリプト

#### 9.3.4

変数の参照は「$」をつけて行う。

```
$ abc=123
$ echo $abc 123
```

上記はシェル変数
パスを通すための環境変数は以下のように行う

```
export abc
```

https://qiita.com/kure/items/f76d8242b97280a247a1

#### 9.3.6 シェル変数

> シェル変数の一覧を表示する場合は,setコマンドを利用します。

```
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login
BASH_ALIASES=()
abc=aaabbbccc
```

#### 9.3.7 環境変数
> 環境変数の一覧を表示する場合は、envコマンドを利用します。

```
$ env
ABC=999999
HOSTNAME=host1.alpha.jp
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
```

#### 9.3.9 引数

引数は$1,$2......など$の後に引数の番号を指定することで参照することができます。

```
$ cat args.sh #!/bin/bash
echo '$1:' $1;
echo '$2:' $2;
echo '$3:' $3;
echo '$0:' $0;
echo '$#:' $#;

$ ./args.sh aaa bbb ccc
$1: aaa
$2: bbb
$3: ccc
```

#### 9.3.12 sourceコマンド

> sourceコマンドはbashなどのシェルの内部コマンドで、指定されたファイルを読み込んでシェル環境を設定します。

ここら辺雰囲気で使ってました

### 11章 プロセス管理

#### 11.1 プロセスとは
Linuxで実行中のプログラムを管理する単位をプロセスと呼ぶ。

- プロセス生成から消滅まっでの流れ

> ユーザーがシェルからコマンドを実行すると、シェルは子プロセスとして自分の分身を作ります。（これをforkと呼びます）。次に、シェルは子プロセスにコマンドの実行(これをexecと呼びます。)を任せ、子プロセスの終了を待ちます。子プロセスはコマンドの実行を終えると親プロセスに終了を伝え、消滅します。親プロセスは子プロセスの終了を受け取り、シェルプロンプトを表示し、ユーザーの次のコマンドに備えます。

#### 11.3 フォアグラウンドジョブとバックグラウンドジョブ

コマンドをバックグラウンドで起動するには、コマンドの後ろに&をつけて実行します。

```
my_heavy_script &
```

> 実行中のコマンドをバックグラウンドに切り替えるには (CTRL + X)でサスペンドしてから、bgコマンドでバッググラウンドで実行を継続させます。fgコマンドでフォアグラウンドに戻すこともできます。ジョブの状態はjobsコマンドで確認することができます。

#### 11.5 シグナル
> Linuxには、プロセスにシグナルというイベントを送信してプロセスを制御する機能があります。
シグナルには、シグナル番号およびシグナル名が割り当てられており、代表的なものに以下のシグナルがあります。

|シグナル番号|シグナル名|意味
|--|--|--
|1|HUP|ハングアップ
|2|INT|割り込み
|3|QUIT|強制停止
|9|KILL|強制終了
|15|TERM|終了

> ユーザがプロセスにシグナルを送信する方法は3つあります。

- シェルに割り当てられたキーの入力(例: ^C,^Z,^¥)
- killコマンド
- プログラムでkill()関数を呼ぶ

https://atmarkit.itmedia.co.jp/ait/articles/1708/04/news015.html