読者です 読者をやめる 読者になる 読者になる

Man On a Mission

システム運用屋が、日々のあれこれを記録していくブログです。情報処理技術者試験の話題多し。高度試験の攻略についても書いてます。

【Linux】連続してコマンドを実行する(;と&&と||)

今日は、小ネタをひとつ。

Linuxコマンドラインで使用している際、時間がかかる処理をいくつか連続して実行したいことがあります。
例えば、ファイルサーバから大容量ファイルをコピーした後に、MD5チェックサムを出力して、その後にまた別のファイルを…というようなケースです。

この場合に、いちいち一つ一つコマンドを実行してると、無駄な待ち時間が発生します。連続実行させれば、この待ち時間を有効に使えるでしょう。
連続実行させるには、シェルスクリプト化しても良いのですが、せいぜい2、3コマンドのくらいの時は、コマンドを連結実行すると簡単です。

 複数のコマンドを連続実行する

コマンドを連続で実行するには、「;」か「&&」を使います。

例:
command1 ; command2
command1 && command2

なお、「;」や「&&」は、パイプやリダイレクトと同じくシェルの記法の一つで、「制御演算子」または「リスト演算子」と呼ばれます。
以下、説明。

「;」演算子

「;」演算子で複数コマンドを連結すると、順にコマンドが実行されます。

command1 ; command2

「&&」演算子

「;」と同じく、「&&」演算子で複数コマンドを連結すると、順にコマンドが実行されるのですが、前のコマンドが失敗すると、その後のコマンドは実行されません。

command1 && command2

command1が正常終了(終了コード0)の時のみ、command2が実行されます。

ここから蛇足。
実は、「&&」は、論理積(AND)演算子であり、if文などでも利用できます。
AND演算ですので、command1とcommand2の双方が真の時に、真を返します。

すなわち、command1が失敗した場合、かたっぽが偽になり、この時点で演算結果が「偽」であることがわかります。
もはや結果が出ているため、command2は評価されません。
(なんらかのプログラム言語を使われてる方ならご存知でしょうが、「短絡評価」と言います。)
この点を利用することで、「最初のコマンドが成功した場合にのみ、次のコマンドを実行する」という挙動を実現しています。

前のコマンドが失敗した時のみ、次のコマンドを実行する「||」演算子

また、「||」という演算子もあります。

command1 || command2

&&と違い、こちらは、command1が失敗の場合のみ、command2が実行されます。

「||」は、OR演算子となっており、command1、2のいずれかの結果が真(コード0)であれば、真を返します。
command1が真で終われば、当然、||演算も真となり、この時点で結果が出るため、command2は評価されません(短絡評価)。
この点を利用することで、「最初のコマンドが失敗した場合に、次のコマンドを実行する」という挙動を実現しています。

注意点

一般的なプログラム言語と違い、シェルの「&&」と「||」の優先順位は同じです。
そのため、左から順に評価されることにご注意ください。「&&」が優先されたりはしません。