一行で複数コマンドを実行

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行で複数コマンドを実行する場合、各コマンドが正常に
実行されている必要がある場合は「&&」を利用しましょう。