1行に複数のコマンドの実行

CUIで作業する方は、常識かと思われますが、コマンドラインで実行する場合、以下のような構文で実行します。

コマンド オプション 引数

コマンドは、実行可能なプログラムまたはソースコードです。

オプションは、コマンドに対して動作を指示します。ハイフンに続けて指定します。

引数は、コマンドに値を渡します。通常、ファイル名を指定することが多いと思います。

実は、1行に複製のコマンドを実行できます。

方法は以下の通りです。

構文説明
コマンド1; コマンド2コマンド1に続けてコマンド2を実行する
コマンド1 & コマンド2コマンド1とコマンド2を同時に実行する
コマンド1 && コマンド2コマンド1が正常終了したときのみコマンド2を実行する
コマンド1 | コマンド2コマンド1の実行結果をコマンド2へ渡して実行する
コマンド1 || コマンド2コマンド1が正常終了しなかったときのみコマンド2を実行する
(コマンド1 ; コマンド2)コマンド1とコマンド2をひとまとまりとして実行する
{ コマンド1;コマンド2; }現在のシェル内でコマンド1に続けてコマンド2を実行する

コマンド1;コマンド2は、最初、コマンド1が実行されて、正常に終了してもエラーが出ても関係なくコマンド2が実行されます。

コマンド1&コマンド2は、バックグラウンドでコマンド1を実行し、かつコマンド2を実行します。

コマンド1&&コマンド2は、最初、コマンド1が実行されますが、正常終了しなければコマンド2が実行されないという条件でコマンド2が実行されます。

コマンド1 | コマンド2は、最初、コマンド1を実行し、その出力結果をコマンド2に渡し、実行します。パイプと呼ばれます。

コマンド1|| コマンド2は、最初、コマンド1が実行されますが、正常終了した場合、コマンド2は実行されないという条件でコマンド2が実行されます。

ここまでは、理解しやすいと思われます。

(コマンド1;コマンド2)は、一見、コマンド1;コマンド2と同じだと思われますが、実は違います。

(コマンド1;コマンド2)は、コマンド1が実行され、正常に終了してもエラーが出ても関係なくコマンド2が実行されますが、新たなシェルを起動して、そのシェル上で実行します。

一方、コマンド1;コマンド2では、現在のシェルで実行されます。

新たなシェルを起動して実行する場合と現在のシェルで実行する場合は、見た目では区別がつきません。

しかし、決定的な違いがあります。

一つは、新たなシェルで実行する場合”(コマンド1;コマンド2)“、シェル変数は反映されません。もう一つは、ディレクトリの移動ができません。

一方、現在のシェルで実行する場合 “コマンド1;コマンド2“、シェル変数は反映されますし、ディレクトリの移動もできます。

例を示します。シェル変数を設定しています。

$ x=hello ; y=world
$ echo $x
hello
$ echo $y
world
$ (x=hello ; y=world)
$ echo $x

$ echo $y

ディレクトリの移動をします。ホームディレクトリに子ディレクトリdir/があると仮定しています。

$ pwd
/mnt
$ cd  ; cd dir
$ pwd
/home/hoge/dir
$ pwd
/mnt
$ (cd  ; cd dir)
$ pwd
/mnt

pwdコマンドは、今いるディレクトリの場所を教えてくれるコマンドです。

{ コマンド1;コマンド2;}は、現在のシェルでコマンド1に続けてコマンド2を実行します。したがって、コマンド1;コマンド2と同じです。{ とコマンド1にはスペースがいります。コマンド2のあとには;を忘れずに。

また、(コマンド1 ; コマンド2){ コマンド1;コマンド2; }は、;以外にも&、&&、|、||、も使えます。

コマンドは3個でも4個でもつなげれます。

まとめ

;、&、&&、|、||、でコマンドをつなげることで1行で複数のコマンドを実行できます。

コマンド1; コマンド2{ コマンド1;コマンド2; }は現在のシェルで実行します。

(コマンド1;コマンド2)は、新たなシェルで実行します。