またまたシェルに関する機能の解説です。 ここで紹介するのは、複数のコマンドを順に実行する方法です。 順に実行する、といってもパイプラインのようにコマンド間での情報の受け渡しは行いません。
複数のコマンドを連続して実行させるには3通りの方法があります。 1つ目は command1 を実行した後に command2 を実行するという方法で、
command1 ; command2
のように記述します。 command1 の実行結果に関わらず command2 が実行されます。
2つ目は command1 を実行してエラーが発生しなければ command2 を実行するという方法で、
command1 && command2
と記述します。 command1 の実行結果がエラーとなった場合には command2 は実行されません。
3つ目は command1 を実行してエラー発生した場合のみ command2 を実行するという方法で、
command1 || command2
と記述します。 command1 の実行結果がエラーでなかった場合には command2 は実行されません。
では、実際にやってみましょう。 端末を開き、キーボードから cd ; cd Documents ; ls と入力して、Enterキーを押してください。
cd ; cd Documents ; ls
以下のようにホームディレクトリの下の Documents ディレクトリの内容が表示されます。
taro@myhostname:~$ cd ; cd Documents ; ls 対象のファイル.txt taro@myhostname:~/Documents$
では次に、存在しないディレクトリに移動して ls コマンドを実行してみましょう。
キーボードから cd ; cd NotFound ; ls と入力して、Enterキーを押してください。
cd ; cd NotFound ; ls
以下のようにエラーメッセージが表示され、ホームディレクトリの内容が表示されます。
taro@myhostname:~/Documents$ cd ; cd NotFound ; ls -bash: cd: NotFound: そのようなファイルやディレクトリはありません Desktop Downloads Pictures Templates filename stdout Documents Music Public Videos stderr testfile taro@myhostname:~$
このようにディレクトリへの移動に失敗しても、次のコマンドが実行されています。 そのため、ホームディレクトリの内容が表示されてしまいました。
では次に、ディレクトリへの移動が成功した場合のみ ls コマンドを実行し、移動できなかった場合には "Error" というメッセージを表示するように修正してみましょう。
キーボードから cd ; cd Documents && ls || echo Error と入力して、Enterキーを押してください。
cd ; cd Documents && ls || echo Error
以下のようにホームディレクトリの下の Documents ディレクトリの内容が表示されます。 狙い通りの動きです。
taro@myhostname:~$ cd ; cd Documents && ls || echo Error 対象のファイル.txt taro@myhostname:~/Documents$
続いては、ディレクトリへの移動がエラーとなる場合です。 キーボードから cd ; cd NotFound && ls || echo Error と入力して、Enterキーを押してください。
cd ; cd NotFound && ls || echo Error
以下のように cd コマンドが表示しているエラーメッセージに続き、"Error" という独自のメッセージも表示されています。 ls コマンドは実行されていません、成功です。
taro@myhostname:~/Documents$ cd ; cd NotFound && ls || echo Error -bash: cd: NotFound: そのようなファイルやディレクトリはありません Error taro@myhostname:~$
シェルでは、一度のコマンドライン入力で複数のコマンドを連続して実行させることができます。 なお、パイプラインのようにコマンド間での情報の受け渡しは行われません。
複数のコマンドを連続して実行させるには3通りの方法があり、
command1 ; command2
のように記述すると、command1 の実行結果に関わらず command2 が実行されます。
command1 を実行してエラーが発生しなければ command2 を実行させる場合には、
command1 && command2
と記述します。
command1 を実行してエラー発生した場合のみ command2 を実行させたい場合には、
command1 || command2
と記述します。
これらを組み合わせ、
command1 ; command2 && command-if-success || command-if-error
と記述することもできます。