次のページ 前のページ 目次へ

3. リダイレクトションについて(redirection)

3.1 理論と簡単なリファレンス

bash には、ファイル記述子(file descriptor)として、標準入力 (stdin)、標準出力(stdout)、そして標準エラー(stderr) の 3 つがあります。 ( std は standard の意味です。)

基本的に以下のことができます。

  1. stdoutfile にリダイレクト
  2. stderrfile にリダイレクト
  3. stdoutstderr にリダイレクト
  4. stderrstdout にリダイレクト
  5. stderrstdoutfile にリダイレクト
  6. stderrstdoutstdout にリダイレクト
  7. stderrstdoutstderr にリダイレクト

(リダイレクト構文では)数字の 1stdout を表し、 2stderr を表します。

*上記の項目それぞれについての簡単なメモ* less コマンドを使うと、 stdout (これはバッファに残ります)と stderr (スクリーンには 表示されますが、そのバッファを見ようとすると消去されてしまいます)の両方を見る ことができます。

3.2 サンプル: stdout を file へ

次の場合、プログラムの出力がファイルに書き込まれます。

        $ ls -l > ls-l.txt
        

上記では ls-l.txt というファイルが作成されます。そして、'ls -l' というコマンドを実行した場合にスクリーンに表示される 内容が、そのファイルに保存されます。

3.3 サンプル: stderr を file へ

次の場合、プログラムの stderr の出力がファイルに書き込まれます。

        $ grep da * 2> grep-errors.txt
        

上記では、grep-errors.txt というファイルが作成されます。そして、 そのファイルには、'grep da *' の出力のうち、読者が見ようとしている はずの stderr の部分が書き込まれています。

3.4 サンプル: stdout を stderr へ

次の場合、プログラムの stderr 出力が、stdout と同一の ファイル記述子に書き込まれます。

        $ grep da * 1>&2
        

上記では、コマンドの stdout の部分が stderr に送られます。 別のやり方があることに読者は気付いているかもしれません。

3.5 サンプル: stderr から stdout へ

次の場合、プログラムの stderr 出力が、stdout と同一のファイル 記述子に書き込まれます。

        $ grep * 2>&1
        

上記では、コマンドの stderr の部分が stdout に送られます。 したがって、もしパイプを使って less に流せば、通常なら stderr に書き込まれて消えてしまうはずの出力行が、 stdout に送られたこと で保持されているのを確認できます。

3.6 サンプル: stderr と stdout から file へ

次の場合、プログラムの全ての出力がファイルに入れられます。これは、完全に 黙ってコマンドを実行させたいような cron の実行項目を書く場合に適して います。

        $ rm -f $(find / -name core) &> /dev/null
        

cron プログラムの実行項目を思い浮かべてほしいのですが、上記は、 あらゆるディレクトリから "core" と呼ばれるファイルをすべて削除する ものです。 コマンドの出力を見えなくしてしまう場合は、そのコマンドがどういう処理をす るのか充分認識しておかなければいけません。


次のページ 前のページ 目次へ