今度は“1つのジョブで複数のコマンドを実行している場合”で試してみましょう。動作を分かりやすくするために「ping localhost | tail -n 3」で試しています。「tail」は入力された内容の末尾を表示するコマンドです。ここでは「-n 3」で、末尾3行を表示させています。pingは基本的に出力が終了しませんので、何らかの方法でpingを終わらせない限り、tailも終了しません。
まずは、キー操作で試してみましょう。先ほど同じように2つの端末を使い、片方の端末で「ping localhost | tail -n 3」、もう片方で「ps -a -O stat」を実行しています。
pingとtailの画面では[CTRL]+[Z]で終了、「fg」で再開、[CTRL]+[C]で終了しています(画面4)。
それぞれのタイミングでpsコマンドを実行すると、以下の画面5のようになります。
次に、同じコマンドラインでpingとtailに対し、シグナルを送ってみます(画面6)。
ファイルの冒頭部分だけを表示したい、実行結果の最初だけを表示したいといった場合には「head」コマンドが便利です。例えば、「ls | head」ならば、lsコマンドの実行結果の先頭10行だけが表示されます。このとき、headコマンドが10行を出力し終わると、lsコマンド側にSIGPIPEが送られて、それに伴いlsコマンドは終了します。つまり、lsコマンドは“headコマンドが先頭10行を出力した時点で終了”しています。
lsコマンドやcatコマンドなどは特に問題ありませんが、「configure」や「make」のような“最後まで実行されている必要があるコマンド”の場合は別の手段を使う必要があります。
例えば、開始時の出力をちょっと確認したいだけであれば、実行直後に[CTRL]+[Z]で停止するか、[CTRL]+[S]で出力を止めて確認したらすぐ再開させればほとんど場合で用は足ります。きちんと確認したいのであれば、リダイレクトでログを保存しておき、後で確認するとよいでしょう。画面にも出力したいのであれば「tee」コマンドが便利です。
逆に、オプションの指定が正しいかどうかを確認したいような場合は、headが便利です。例えば、「find 〜 | head -3」のように実行しておくと、findコマンドで3つのファイルを見つけたところでコマンドが終了します。
“パイプの後ろにあるコマンドが終了すると、前のコマンドも終了”という動作を、pingコマンドで試してみましょう。例えば、「ping localhost | head -n 3」のようにすると、headコマンドが3行出力した時点でpingもheadも終了します(画面8)。
パイプの後ろにあるコマンドが終了したときのシグナルは「SIGPIPE」(読み手のいないパイプへの書き込みが発生)です。例えば、先ほどの「ping localhost | tail -n 3」でも、SIGPIPEが送られると直ちに終了することが分かります(画面9、画面10)。
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.