【リダイレクトとパイプについて】

                               
                        このHPはリダイレクトとパイプについてまとめたものです。



1-1 リダイレクト

コマンドの実行結果は、通常、画面上(端末上)に表示される。また、コマンドへの入力には、
一般的にはキーボードが使われる。この時、Linuxでは入出力先を、

◆標準入力(stdin)
⇒デフォルトではキーボード

◆標準出力(stdout)
⇒デフォルトではディスプレイ

◆標準エラー出力(stderr)
⇒通常はディスプレイ固定

という概念で処理する。









もし入出力を別のもの(ファイル等)にしたい時は、標準入力先、標準出力先を切り替え指定する。これを「リダイレクション」と呼ぶ。
リダイレクション操作を行うことを「リダイレクトする」という。

コマンドへの指示をキーボードからではなくファイルから入力したり、コマンドの実行結果を画面に表示する代わりにファイルに保存したりするには、リダイレクトを利用する。

まず、コマンドの実行結果を画面上に表示するのではなく、ファイルに保存する場合には、「>」を使う。
例えば、環境変数の一覧を表示する「printenv」コマンドの実行結果をファイルに書き込むには、次の様にする。

$ printenv > printenv.txt


しかし、上記の様にすると「printenv.txt」ファイルに何かデータが保存されていても、printenvコマンドの実行結果で上書きされてしまう。
上書きせずに既存のファイルの末尾に書き足すには「>>」を使う。

$ printenv >> printenv.txt


標準入力を切り替えるには、リダイレクト記号の「<」を使う。以下の例では、grepコマンドへの入力をlinux.txtとして、実行結果をkekka.txtに書き込んでいる。


grep "lpic" < linux.txt > kekka.txt


「<<」はヒアドキュメントと呼ばれ、末尾に指定する文字が現れるまで入力を続ける。例えば、以下の例の様にすると、「END]という文字を入力するまで、file.txtファイルにキーボードから文字を入力し続けることができる。

$ cat > file.txt << END

>abcde

>efghi

>END




■標準エラー出力

コマンドの出力先には、標準出力以外に、標準エラー出力というものもある。
これはコマンドの正常な実行結果以外(エラーなど)の出力先で、標準出力と同じく通常は画面に出力される。

標準出力と標準エラー出力を使い分けることで、エラーメッセージだけは表示せずファイルに保存する、といったことが可能になる。

標準エラー出力を利用するには、「2>」もしくは「2>>」を使う。


以下の例では、findコマンドのエラー出力のみをfind_error.txtファイルに書き出している。


$ find / -name abc 2> find_error.txt




■/dev/null

/dev/nullは”ヌルデバイス"と呼ばれる特別なファイル。以下の様な性質を持っている。

・入力先として、何も内容を返さない。
・出力先として指定しても、書き込んだデータはどこにも保存されずに消えてなくなる。

標準出力を/dev/nullにリダイレクトすると、本来はコマンドの結果が画面に表示されるところが、何も表示されなくなる。
この際には、標準エラー出力へのエラーメッセージだけが画面に表示される。


$ ls / /abcde > /dev/null

ls: /abcde にアクセスできません: そのようなファイルやディレクトリはありません



また、標準エラー出力を/dev/nullにリダイレクトすることもできる。こちらは、エラーメッセージが大量に出るときや、あらかじめわかっているエラーメッセージが表示されるときに、それらエラーメッセージを非表示にしてコマンドの通常の出力結果だけを読みたいときに役立つ。


$ ls / /abcde 2> /dev/null
/:
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt
proc  root  run  sbin  srv  sys  tmp  usr  var















1-2 パイプ

bashシェルでは、パイプを使ってあるコマンドの標準出力を次のコマンドの標準出力へと、
つなげることができる。
パイプを使って複数のコマンドを組み合わせれば、複雑な処理をすることも可能。

パイプは「|」記号で表す。以下の例では、ログファイルをcatコマンドで標準出力に出力し、
それをlessコマンドに渡して1画面ずつ表示している。

#cat /var/log/messages | less



■teeコマンド
teeコマンドは標準入力データ(通常はパイプで渡されたデータ)を、標準出力先とファイルに、分流させる機能を持つ。
lessコマンドの代わりに「teeコマンド」を使うと、コマンドの出力を画面に表示しつつ、ファイルにも保存することができる。

【書式】
コマンド tee ファイル名

〔オプション〕
-a  ファイルに上書きではなく追記する。

次の例では、「ls -l」コマンドの実行結果を画面に表示すると同時に、ls .logファイルにも保存ている。

ls -l | tee ls.log









■xargsコマンド

xargsコマンドは、あるコマンドの標準出力を、他のコマンドの引数として利用することができる
コマンド。標準入力として「引数のリスト」を与える。

xargs自体は、「xargs<実行したいコマンド>」という形式で実行し、ここで指定した<実行したいコマンド>が、標準入力から受けとったリストを引数として実行される。


【書式】
xargs 〔オプション〕〔コマンド〕〔引数〕

〔主なオプション〕
-n<引数の数> 1回のコマンド実行で使用できる引数の数を制限する。


例えば、findマンドで次の様なファイル一覧が出力されているとする。


$find .  -type f -name '*.txt'
./1.txt
./2.txt
./3.txt

これらのファイルに対して、lsコマンドで詳細情報を確認したい場合は以下の様に、xargsに
ls -lを指定する。

find . -type f -name '*.txt' | xargs ls -l

こうすると、xargsコマンドによって以下のようなコマンドラインが組み立てられ、実行されることになる。

ls -l   ./1.txt  ./2.txt  ./3.txt

これは、3つのファイルを引数としたlsコマンド。結果として、次のように3つのファイルの詳細情報が表示される。

-rw-rw-r--. 1 root root  7 Aug 10 23:33 1.txt
-rw-rw-r--. 1 root root 72 Aug 10 23:32 2.txt
-rw-rw-r--. 1 root root 50 Aug 10 23:34 3.txt




この例のように、findコマンドとセットでxargsコマンドを利用すれば、すべてのファイルに
対して任意のコマンドを実行することができる