# TLCL v19.01 輪読会 vol.10
2022/06/28 [@kdnakt](https://twitter.com/kdnakt)
---
## The Linux Command Line
- by William Shotts
- https://linuxcommand.org/tlcl.php
- Version 19.01A, Fifth Internet Edition
- Version 09.12, First Internet Edition
---
## 今日の範囲
### 6 - Redirection (p.54-60)
- Standard Input, Output, and Error
- Redirecting Standard Output
- Redirecting Standard Error
- Redirecting Standard Input
---
#### Standard Input, Output, and Error (p.54~)
- 多くのプログラムは出力がある
1. 実行結果
-> 標準出力stdout
3. 実行中のステータスやエラー
-> 標準エラーstderr
----
- Unixのテーマ:"Everything is a file"
- stdout, stderrは特殊なファイル
- デフォルトでは画面に出力される
=ディスクに保存されない
- 標準入力stdinはデフォルトではキーボード
- I/Oリダイレクション
- 入出力の接続先を変更できる
---
#### Redirecting Standard Output (p.55~)
- `>`リダイレクトオペレータ
- 標準出力の向き先を変える
- 出力先ファイル名が続く
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /usr/bin > ls-output.txt
$ ls -l ls-output.txt
$ less ls-output.txt
```
----
- エラーメッセージは画面に表示され続ける
- 存在しないファイルで[やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /bin/usr > ls-output.txt
$ ls -l ls-output.txt
```
- `ls`はエラーメッセージを標準出力に送らない
- 標準エラー
- 他のUnixプログラムも同様
----
- `>`リダイレクトオペレータ
- 常にファイルを先頭から上書き
- ファイルが存在しない場合は空ファイル作成
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ > ls-output.txt
$ ls -l ls-output.txt
```
----
- `>>`リダイレクトオペレータ
- ファイルに追記
- ファイルが存在しない場合は空ファイル作成
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /usr/bin >> ls-output.txt
$ ls -l /usr/bin >> ls-output.txt
$ ls -l /usr/bin >> ls-output.txt
$ ls -l ls-output.txt
```
---
#### Redirecting Standard Error (p.57~)
- ファイルディスクリプタ
- 0=stdin
- 1=stdout
- 2=stderr
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /bin/usr 2> ls-output.txt
$ ls -l ls-output.txt
```
----
##### リダイレクト順に注意
- stderrをstdoutへ
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
// 🙆♀️
$ ls -l /bin/usr >ls-output.txt 2>&1
// 🙅♂️
$ ls -l /bin/usr 2>&1 >ls-output.txt
```
----
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
- bashのショートカット
```
$ ls -l /bin/usr &> ls-output.txt
// 先ほどのこれと同じ意味
$ ls -l /bin/usr 2> ls-output.txt
```
----
##### 不要な出力を抑制する
- `/dev/null` という特別なファイル
- bit bucketともいう
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
- エラーメッセージを抑制する
```
$ ls -l /bin/usr 2> /dev/null
```
---
#### Redirecting Standard Input (p.58~)
- `cat`コマンド
- ファイルをconcatenate(結合)する
```
// 例:分割ダウンロードしたファイルの結合
// movie.mpeg.001 movie.mpeg.002 ... movie.mpeg.099
$ cat movie.mpeg.0* > movie.mpeg
```
※ワイルドカードはソートされて展開される
----
- 引数なしの`cat`コマンド
- 標準入力を受け付ける
- デフォルトではキーボード入力
- Ctrl+DでEOF(入力終了)
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
// 標準出力に結果表示
$ cat
The quick brown fox jumped over the lazy dog. // 最後にCtrl+D
// ファイルにリダイレクト
$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog. // 最後にCtrl+D
```
----
- `<`リダイレクトオペレーター
- ファイルを標準入力のソースにできる
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
// ファイルを入力ソースに
$ cat < lazy_dog.txt
The quick brown fox jumped over the lazy dog.
```
---
#### Pipelines (p.61~)
- パイプライン演算子(|)
- あるコマンドの標準出力を別のコマンドの標準入力に送る
- 標準入力を受け付けるコマンド
- 例: less
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /usr/bin | less
```
----
##### >と|の違い
- リダイレクト演算子(>)
- コマンドとファイルを繋ぐ
- サイレントにファイルを作成・上書きするので要注意
- パイプライン演算子(|)
- 出力と入力を繋ぐ
```
// リダイレクト(ファイル上書き)
# cd /usr/bin
# ls > less
// less実行
# ls | less
```
----
##### Filters (p.62~)
- パイプラインを駆使して複雑なデータ処理が可能
- その場合個々のコマンドをフィルタと呼ぶ
- 入力、加工、出力
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /bin /usr/bin | sort | less
```
----
###### UNIXの考え方
- Mike Gancarz
『UNIXという考え方―その設計思想と哲学』
- 定理9:すべてのプログラムをフィルタにする
- そのために、stdioをフル活用する
- ユーザーが実行時に入出力を指定
----
##### uniq (p.62~)
- 標準入力からデータを受け取る
- またはファイル名を引数にとる
- リストから重複を排除する
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /bin /usr/bin | sort | uniq | less
// 重複のみ表示
$ ls -l /bin /usr/bin | sort | uniq -d | less
```
----
##### wc (p.63)
- 行、単語、バイトの数をカウントする
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /usr/bin > ls-output.txt
$ wc ls-output.txt
// 行数のみ
$ ls -l /bin /usr/bin | sort | uniq | wc -l
```
----
##### grep (p.63~)
- パターンに合致する文字列を探す
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /bin /usr/bin | sort | uniq | grep zip
```
- -iオプション:大文字小文字区別しない
- -vオプション:パターンに合致しない行を出力
----
##### head/tail (p.64~)
- head:先頭10行を表示
- tail:末尾10行を表示
- -nオプション:行数を指定
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls -l /usr/bin > ls-output.txt
$ head -n 5 ls-output.txt
$ tail -n 5 ls-output.txt
// リアルタイムに確認
$ tail -f /var/log/messages
```
----
##### tee (p.65~)
- パイプラインの途中で結果をファイルに出力できる
- [やってみよう@Alpine](https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192)
```
$ ls /usr/bin | tee ls.txt | grep zip
(grep結果が出力される)
$ cat ls.txt
(lsの結果が出力されている)
```
{"metaMigratedAt":"2023-06-17T03:40:06.156Z","metaMigratedFrom":"YAML","title":"TLCL v19.01 輪読会 vol.10","breaks":"true","slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"df36d0f0-b67e-41ac-96b3-f3988326d230\",\"add\":5767,\"del\":244}]"}