連載
» 2016年03月24日 05時00分 UPDATE

“応用力”をつけるためのLinux再入門(6):パイプとリダイレクトでコマンドを組み合わせて実行しよう (3/4)

[西村めぐみ,@IT]

パイプとリダイレクトの活用

 ここからは「find」コマンドを例に、パイプとリダイレクトを組み合わせて標準出力と標準エラー出力を操作する方法を幾つか紹介します。

 findコマンドはファイルを検索するコマンドで、「find 検索場所 検索条件」のように指定して実行します。例えば、「find / -name '*.log'」でルートディレクトリ下、つまり全てのディレクトリ下にある、拡張子が「.log」のファイルが全て表示されます。

※検索条件として指定している「-name '*.log'」の「*」はどんな文字でも、何文字でもよい、という意味の指定です。「*」記号や「'」記号の意味と使い方については、本連載であらためて取り上げます。



 findコマンドは、見つかったファイル名を標準出力に、ディレクトリにアクセス権がないので探せないような時のエラーメッセージは標準エラー出力に出力します。

 検索場所にルートディレクトリ(/)を指定すると、全てのディレクトリが検索されますが、一般ユーザーではアクセスできないような場所も含まれることから、実行結果(見つかったファイル)に混ざってエラーメッセージもたくさん表示されます(画面5)。

画面5 画面5 findコマンドの実行結果(検索結果とエラーメッセージが表示される)

 それでは、これをパイプやリダイレクトで操作してみましょう。

実行結果とエラーメッセージを別々に保存する

 「>」によるリダイレクトは、標準出力だけが対象となります。つまり「find / -name '*.log' >ファイル名」ではエラーメッセージは保存されません。

 エラーメッセージ、つまり標準エラー出力への出力をリダイレクトしたい場合は「2>」で指定します。

 bashでは内部で標準入力は「0」、標準出力は「1」、標準エラー出力は「2」の番号が割り振られています。従って、標準出力であることを明示したい場合は「1>」と指定します(画面6)。余談ですが、Windowsの「コマンドプロンプト(cmd.exe)」も「1>」と「2>」で、標準出力のリダイレクトと標準エラー出力のリダイレクトを区別できます。なお、この指定方法が可能なのはbashとzshで、tcshではできません。

画面6 画面6 見つけたファイルのリストは「1>」で「loglist.txt」に、エラーメッセージは「2>」で「errlist.txt」に出力(bash)

 標準出力と標準エラー出力への出力を合わせて保存したい場合は、「&>」を使って「find / -name '*.log' &>all.txt」のように指定します(画面7)。

画面7 画面7 「&>」でリダイレクトすると、標準出力と標準エラー出力を合わせた内容をファイルに保存できる(bash)

 tcshの場合は標準エラー出力だけをリダイレクトするという指定がないので、「(find / -name '*.log' > ファイル1) >& ファイル2」のように、一度「()」で囲むことで“サブシェル”と呼ばれる別の環境で標準出力の内容を保存し、「>&」で残りのメッセージ、つまりエラーメッセージを保存します(画面8)。

画面8 画面8 tcshの場合はサブシェルを使えば標準出力と標準エラー出力の両方をリダイレクトできる

全てのメッセージをmoreコマンドで表示する

 「find / -name '*.log' | more」のように、findコマンドの結果を単純にパイプでmoreコマンドに渡すと、標準出力だけがmoreに渡るため、エラーメッセージ(標準エラー出力)はそのまま流れていってしまいます。

 そこで、「find / -name '*.log' |& more」のようにすると、標準出力と標準エラー出力の内容を合わせて、つまり、findコマンドが出した全ての内容がmoreコマンドに渡るようになります(画面9)。

画面9 画面9 標準出力と標準エラー出力の両方をmoreコマンドで表示する

※bashの「|&」は「2>&1 |」の短縮形です。「2>&1」で標準エラー出力を標準出力に接続した上でパイプに渡す、という意味です。



Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。