# 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}]"}
    726 views