bash
には、ファイル記述子(file descriptor)として、標準入力
(stdin
)、標準出力(stdout
)、そして標準エラー(stderr
)
の 3 つがあります。
( std は standard の意味です。)
基本的に以下のことができます。
stdout
を file
にリダイレクトstderr
を file
にリダイレクトstdout
を stderr
にリダイレクトstderr
を stdout
にリダイレクトstderr
と stdout
を file
にリダイレクトstderr
と stdout
を stdout
にリダイレクトstderr
と stdout
を stderr
にリダイレクト(リダイレクト構文では)数字の 1
は stdout
を表し、
2
は stderr
を表します。
*上記の項目それぞれについての簡単なメモ* less
コマンドを使うと、
stdout
(これはバッファに残ります)と stderr
(スクリーンには
表示されますが、そのバッファを見ようとすると消去されてしまいます)の両方を見る
ことができます。
次の場合、プログラムの出力がファイルに書き込まれます。
$ ls -l > ls-l.txt
上記では ls-l.txt
というファイルが作成されます。そして、'ls -l
' というコマンドを実行した場合にスクリーンに表示される
内容が、そのファイルに保存されます。
次の場合、プログラムの stderr
の出力がファイルに書き込まれます。
$ grep da * 2> grep-errors.txt
上記では、grep-errors.txt
というファイルが作成されます。そして、
そのファイルには、'grep da *
' の出力のうち、読者が見ようとしている
はずの stderr
の部分が書き込まれています。
次の場合、プログラムの stderr
出力が、stdout
と同一の
ファイル記述子に書き込まれます。
$ grep da * 1>&2
上記では、コマンドの stdout
の部分が stderr
に送られます。
別のやり方があることに読者は気付いているかもしれません。
次の場合、プログラムの stderr
出力が、stdout
と同一のファイル
記述子に書き込まれます。
$ grep * 2>&1
上記では、コマンドの stderr
の部分が stdout
に送られます。
したがって、もしパイプを使って less
に流せば、通常なら stderr
に書き込まれて消えてしまうはずの出力行が、 stdout
に送られたこと
で保持されているのを確認できます。
次の場合、プログラムの全ての出力がファイルに入れられます。これは、完全に
黙ってコマンドを実行させたいような cron
の実行項目を書く場合に適して
います。
$ rm -f $(find / -name core) &> /dev/null
cron
プログラムの実行項目を思い浮かべてほしいのですが、上記は、
あらゆるディレクトリから "core
" と呼ばれるファイルをすべて削除する
ものです。
コマンドの出力を見えなくしてしまう場合は、そのコマンドがどういう処理をす
るのか充分認識しておかなければいけません。