(Linuxの基本5)標準入出力・リダイレクト・パイプ

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の入力に連結すると同時に、ファイルにも出力します。

第6回目に続きます

コメント

タイトルとURLをコピーしました