シェルスクリプトやコンソール内でコマンドを実行させる際、各コマンドを連続して実行させたい場合や、コマンドの終了ステータスによって別のコマンドを実行させたい場合があります。
そこで本ブログでは、制御演算子(リスト演算子)を使ってコマンドを連結させる方法を紹介します。
なお、本ブログではコマンドを2つ使っていますが、複数コマンドの連結も可能です。
- 制御演算子(リスト演算子)に関しては、JMプロジェクトの以下の項目を参考にしてください。
定義
パイプライン (Pipeline)
リスト
制御演算子(リスト演算子) 「;」
コマンド1が終了したらコマンド2を実行させます。コマンドを;で連結すると、コマンド1の終了ステータスに関係なく、コマンド1の実行後にコマンド2が実行されます。
以下の例では、sleepコマンドで1秒間スリープした後、lsコマンドが実行されます。これはsleepコマンドが正常終了した例です。
root@armadillo:~# sleep 1 ; ls -l
total 4
drwxr-xr-x 4 root root 4096 Jan 7 21:48 test_app
次のコマンドはsleepの引数がないためsleepコマンドは異常終了しますが、;でコマンドを連結しているため、lsコマンドが実行されます。
root@armadillo:~# sleep ; ls -l
sleep: missing operand
Try 'sleep --help' for more information.
total 4
drwxr-xr-x 4 root root 4096 Jan 7 21:48 test_app
制御演算子(リスト演算子) 「&」
コマンド1をとコマンド2を並列で実行させます。各コマンドを&で連結すると、各コマンドはバックグラウンドで実行されます。
ブログ記事「Windows Subsystem for LinuxとX Windowの連携」の「4. Xクライアントの起動」に示した実行例では、xeyesやxclockを&で結んで、各コマンドを並列に実行しています。
atmark@PC-0050:~$ xeyes & xclock & gnome-terminal & xcalc & gedit .bashrc &
制御演算子(リスト演算子) 「&&」
コマンド1が正常終了した場合のみ、コマンド2が実行されます。
カレントディレクトリにはtest_appディレクトリのみ存在しています。
root@armadillo:~# ls -l
total 4
drwxr-xr-x 4 root root 4096 Jan 7 21:48 test_app
test_appディレクトリにcdコマンドで移動(cdコマンドは正常終了)した後、lsコマンドを実行するとtest_appディレクトリの内容が表示されます。
root@armadillo:~# cd test_app && ls -l
total 20
drwxr-xr-x 2 root root 4096 Jan 7 21:48 atmark
-rw-r--r-- 1 root root 142 Jan 7 16:51 md.js
drwxr-xr-x 5 root root 4096 Jan 7 16:43 node_modules
-rw-r--r-- 1 root root 534 Jan 7 16:43 package-lock.json
-rw-r--r-- 1 root root 270 Jan 7 16:43 package.json
ここで存在しないtest_dataディレクトリにcdコマンドを実行してlsコマンドを実行しても、cd test_dataが異常終了するため、lsコマンドは実行されません。
root@armadillo:~# cd test_data && ls -l
-bash: cd: test_data: No such file or directory
制御演算子(リスト演算子) 「|」
コマンド1の結果をコマンド2へ渡して結果を出力します。
/proc/interruptsには、IRQの割り込み回数が記録されています。
root@armadillo:~# cat /proc/interrupts
CPU0
16: 620894 GPC 55 Level i.MX Timer Tick
18: 6455 GPC 26 Level 2020000.serial
29: 0 GPC 80 Level 20bc000.wdog
35: 0 GPC 19 Level rtc alarm
44: 0 GPC 43 Level 2184000.usb
45: 0 GPC 42 Level 2184200.usb
46: 32594 GPC 118 Level 2188000.ethernet
47: 0 GPC 119 Level 2188000.ethernet
48: 55584 GPC 22 Level mmc0
49: 52 GPC 23 Level mmc1
50: 3 GPC 5 Level 21c8000.lcdif
51: 0 GPC 28 Level 21ec000.serial
52: 0 GPC 30 Level 21f4000.serial
63: 0 gpio-mxc 10 Edge SW1
181: 0 gpio-mxc 0 Edge 21ec000.serial
182: 0 gpio-mxc 1 Edge 21ec000.serial
183: 0 gpio-mxc 2 Edge 21ec000.serial
ここで特定の割り込みの回数だけ調べたい場合は、catコマンドとgrepコマンドをパイプで連結します。
以下の例では、mmc割り込みの回数を確認しています。
root@armadillo:~# cat /proc/interrupts | grep mmc*
48: 55587 GPC 22 Level mmc0
49: 52 GPC 23 Level mmc1
制御演算子(リスト演算子) 「||」
コマンド1が異常終了した場合のみ、コマンド2が実行されます。
カレントディレクトリにはtest_appディレクトリのみ存在しています。
root@armadillo:~# ls -l
drwxr-xr-x 4 root root 4096 Jan 7 21:48 test_app
ここで存在しないtest_dataにcdコマンドを実行するとcdコマンドは異常終了となります。
この状態を受けてtouchコマンドを||で連結すると、test_dataディレクトリが作成されます。
root@armadillo:~# cd test_data || touch test_data
-bash: cd: test_data: No such file or directory
root@armadillo:~# ls -l
total 4
drwxr-xr-x 4 root root 4096 Jan 7 21:48 test_app
-rw-r--r-- 1 root root 0 Jan 7 23:16 test_data