1.標準入出力
シェルがデータを処理する過程は以下のとおり(概念図)
入力 | ストリーム | 出力 |
---|---|---|
標準入力(stdin) キーボード ファイル記述子:0 | データを先頭から順に処理する | 標準出力(stdout)画面 ファイル記述子:1 標準エラー 出力(stderr)画面ファイル記述子:2 |
しかし、シェルにとってデータがどの段階のものかを区別するのに、ファイル記述子(ファイルディスクリプタ。IDのようなもの)を使う。
2.リダイレクト
ファイル記述子を変更すれば、標準の入出力を自由に変更できる機能。書式は以下のとおり。
リダイレクトの指定の仕方 | 結果 |
---|---|
コマンド > ファイル コマンド 1> ファイル | コマンドの出力を標準からファイルに変更。ファイル記述子「1」は省略可 |
コマンド >> ファイル コマンド 1>> ファイル | コマンドの出力をファイルの末尾に変更。ファイル記述子「1」は省略可 |
コマンド 2> ファイル | エラー出力を標準からファイルに変更。 |
コマンド 2>> ファイル | エラー出力をファイルの末尾に変更 |
コマンド < ファイル | 入力を標準からファイルに変更 |
コマンド > ファイル 2>&1 | 出力、エラー出力両方を標準からファイルに変更 |
コマンド >> ファイル 2>&1 | 出力、エラー出力両方をファイルの末尾に変更 |
注 記述子番号の後ろの><&の記号との間にはスペースを入れないこと。スペースを入れるとファイルと勘違いされてエラーになる。
例
$ ls goo
ls: cannot access 'goo': No such file or directory
標準入力から存在しないファイルを表示させようとしたら、そんなのないよと画面(標準出力)された。
$ ls goo > ls.txt
ls: cannot access 'goo': No such file or directory
標準入力から、ls.txt というファイルに出力させたが、これはファイルと画面に表示された
$ ls goo 2> ls.txt
エラー表示のみファイルに出力させた。
画面には何も表示されず、コマンドプロンプトに戻る。
$ cat ls.txt
ls: cannot access 'goo': No such file or directory
エラー出力がファイルに保存されている。
$
3.パイプ
あるコマンドの入力結果を、ファイルではなく別のコマンドの入力に利用する機能。
$ コマンド | 受け手のコマンド
□ 例1less と more
$ ls -al | less
コマンド ls -al の出力結果が | によって less の入力として利用される。その結果大量のデータも less によって1ページ図づく切られて表示される。確認しやすい
□ 例2 xargs
$ nano create.txt
file1
file2
file3
$ cat create.txt | xargs touch
file1~file3までのファイルが出来上がる。
これは、touch file1 file2 file3 を実行したのと同じですが、いっぱいファイル名を並べてコマンドを打つより、ファイル名のリストを作り、それを xargs コマンドで touch に出力結果を渡すことで、スッキリスマートにファイルを作成できる。
ちなみに、$ cat create.txt | touch は create.txt の内容をコピーしたtouch というファイルと作るだけ。
cat で表示された内容を touch コマンドは受け取ることができない。xargs コマンドの組み合わせにより標準入力からの入力が可能になる。
□ 例3 tee
tee [option] 出力ファイル名
コマンド1 | tee ファイル | コマンド2
コマンド1の出力結果をコマンド2の入力に連結すると同時に、ファイルにも出力します。
コメント