パイプとリダイレクトでコマンドを組み合わせて実行しよう:“応用力”をつけるためのLinux再入門(6)(3/4 ページ)
今回のテーマは「パイプ」と「リダイレクト」です。それぞれ、コマンドの出力を別のコマンドに渡したり、ファイルに保存したりすることができます。コマンドを組み合わせて実行する際にもよく使われるテクニックです。
パイプとリダイレクトの活用
ここからは「find」コマンドを例に、パイプとリダイレクトを組み合わせて標準出力と標準エラー出力を操作する方法を幾つか紹介します。
findコマンドはファイルを検索するコマンドで、「find 検索場所 検索条件」のように指定して実行します。例えば、「find / -name '*.log'」でルートディレクトリ下、つまり全てのディレクトリ下にある、拡張子が「.log」のファイルが全て表示されます。
※検索条件として指定している「-name '*.log'」の「*」はどんな文字でも、何文字でもよい、という意味の指定です。「*」記号や「'」記号の意味と使い方については、本連載であらためて取り上げます。
findコマンドは、見つかったファイル名を標準出力に、ディレクトリにアクセス権がないので探せないような時のエラーメッセージは標準エラー出力に出力します。
検索場所にルートディレクトリ(/)を指定すると、全てのディレクトリが検索されますが、一般ユーザーではアクセスできないような場所も含まれることから、実行結果(見つかったファイル)に混ざってエラーメッセージもたくさん表示されます(画面5)。
それでは、これをパイプやリダイレクトで操作してみましょう。
実行結果とエラーメッセージを別々に保存する
「>」によるリダイレクトは、標準出力だけが対象となります。つまり「find / -name '*.log' >ファイル名」ではエラーメッセージは保存されません。
エラーメッセージ、つまり標準エラー出力への出力をリダイレクトしたい場合は「2>」で指定します。
bashでは内部で標準入力は「0」、標準出力は「1」、標準エラー出力は「2」の番号が割り振られています。従って、標準出力であることを明示したい場合は「1>」と指定します(画面6)。余談ですが、Windowsの「コマンドプロンプト(cmd.exe)」も「1>」と「2>」で、標準出力のリダイレクトと標準エラー出力のリダイレクトを区別できます。なお、この指定方法が可能なのはbashとzshで、tcshではできません。
標準出力と標準エラー出力への出力を合わせて保存したい場合は、「&>」を使って「find / -name '*.log' &>all.txt」のように指定します(画面7)。
tcshの場合は標準エラー出力だけをリダイレクトするという指定がないので、「(find / -name '*.log' > ファイル1) >& ファイル2」のように、一度「()」で囲むことで“サブシェル”と呼ばれる別の環境で標準出力の内容を保存し、「>&」で残りのメッセージ、つまりエラーメッセージを保存します(画面8)。
全てのメッセージをmoreコマンドで表示する
「find / -name '*.log' | more」のように、findコマンドの結果を単純にパイプでmoreコマンドに渡すと、標準出力だけがmoreに渡るため、エラーメッセージ(標準エラー出力)はそのまま流れていってしまいます。
そこで、「find / -name '*.log' |& more」のようにすると、標準出力と標準エラー出力の内容を合わせて、つまり、findコマンドが出した全ての内容がmoreコマンドに渡るようになります(画面9)。
※bashの「|&」は「2>&1 |」の短縮形です。「2>&1」で標準エラー出力を標準出力に接続した上でパイプに渡す、という意味です。
Copyright © ITmedia, Inc. All Rights Reserved.