一行で複数コマンドを実行
UNIXシェルで、複数のコマンドを1行で実行させるには、
「;(セミコロン)」と「&&」の二通りの方法がありますが、
意外と「&&」は知られていないような気がします。
「;」と「&&」の違い
まずは、どちらの書き方でも同じ動作をすることを確認するために、
次のコマンドを実行してみましょう
$ echo "ただいまの時間は?" ; date
ただいまの時間は?
2009年10月29日 (木) 21時23分23秒 JST
$ echo "ただいまの時間は?" && date
ただいまの時間は?
2009年10月29日 (木) 21時23分23秒 JST
続いて次ぎのコマンドを実行してみましょう
$ hoge ; date結果に違いが出ましたね?
-bash: hoge: command not found
2009年10月29日 (木) 21時23分23秒 JST
$ hoge && date
-bash: hoge: command not found
ここではじめに実行させた「hoge」は存在しないコマンドなので、
「command not found」とエラーになります。
「;」と「&&」の違いは至って簡単で、実行したコマンドの終了コードをみて
後に続く処理を実行「する」か「しない」かです。
「;」 … 終了コードにかかわらず、後続処理を実行する
「&&」… 正常終了していない場合、後続処理を実行しない
たとえば、自分でソースをコンパイルする際に
「make depend」「make」「make install」
の3つのmakeコマンドの実行が必要な場合、
# make depend; make; make insatllとすると、もし真ん中の「make」でコンパイルにコケてしまったとしても、
後続の「make install」まで実行されてしまいますが、
# make depend && make && make insatllとしておけば、makeがコケると異常終了(エラー)を察知して「make install」は
実行されなくなります。
以上の通り、1行で複数コマンドを実行する場合、各コマンドが正常に
実行されている必要がある場合は「&&」を利用しましょう。