ここで紹介するコマンドの種類は、
- 単純なコマンド
- パイプライン
- リスト
- 複合コマンド
- 関数定義コマンド
になります。
単純なコマンド
単純なコマンドは、変数の代入やリダイレクションが含まれ、それに続く単語やリダイレクションがオプションであるシーケンスで構成されます。
変数の代入やリダイレクションとして認識されない単語は展開され、残ったフィールドの最初がコマンド名として、残りはコマンドの引数として扱われます。
各変数の代入は、チルダ展開、パラメータ展開、コマンド置換、算術展開、およびクォート除去が行われた後に値が割り当てられます。
コマンド名が存在しない場合、リダイレクションはサブシェル環境で実行され、その結果に応じてコマンドの実行ステータスが決まります。リダイレクションの失敗はエラーとし、終了ステータスがゼロ以外になります。以下はサブシェル環境でのリダイレクションの例になります。
1 2 3 4 |
$ (echo "aaa"; echo "bbb") >output $ cat output aaa bbb |
コマンド名が存在する場合、通常のコマンドの検索と実行が行われます。コマンド名がない場合でも、コマンド内にコマンド置換が含まれている場合、そのコマンド置換の結果がコマンドの終了ステータスに影響します。それ以外の場合、コマンドはゼロの終了ステータスで完了します。
パイプライン
パイプラインは、制御演算子「|」で区切られた 1 つ以上のコマンドのシーケンスです。最後を除いたコマンドにシェルはパイプを作成して、コマンドの標準出力を次のコマンドの標準入力に接続します。
1 2 |
$ echo aaa | sed s/aaa/bbb/ bbb |
パイプラインがバックグラウンドでない場合、シェルは最後のコマンドの完了を待ち、すべてのコマンドの完了を待つことがあります。
1 2 3 |
$ (echo aaa; echo aaa; sleep 3) | sed s/aaa/bbb/ | sed s/bbb/ccc/ ccc ccc |
リスト
リストは、';' または'&' の演算子で区切られた複数のAND-ORリストの連続です。
AND-OR リストは、"&&" または "||" という演算子で区切られた複数のパイプラインの連続です。
演算子 "&&" と "||" は等しい優先順位で左結合性を持ち、";" や "&" は前のリストを順次実行または非同期実行させます。
';'で区切られたコマンドは順番に実行されます。
コマンドが '&' で終了すると、シェルはそのコマンドをサブシェル内で非同期に実行します。そのコマンドの終了を待たずに次のコマンドを実行します。
'&&'のANDリストは終了ステータスが0の場合に次のコマンドが実行されます。
'||'のORリストは終了ステータスが0以外の場合に次のコマンドが実行されます。
1 2 3 4 5 6 7 |
$ true $ echo $? 0 $ true && echo test test $ true || echo test $ |
複合コマンド
複合コマンドは、始まりに予約語または制御演算子があり、終わりに対応する終端予約語または演算子があります。
また、それぞれの複合コマンドの後に、終端予約語と同じ行にリダイレクションを指定することができます。
各リダイレクションは、明示的に上書きされない限り、その複合コマンド内のすべてのコマンドに適用されます。
複合コマンドに該当するものとして、グループコマンド、for文、case文、if文、while文、until文があります。
グループコマンドで'('を使ったものはサブシェル環境で実行され、'{'を使ったものは現在のプロセス環境で実行されます。
グループコマンドの'('と'{'で違いが出る例として、cdコマンドでディレクトリを移動する際に違いが出ます。
コマンドが終了した際に'('の場合は現在の環境に影響が出ず、'{'の場合は現在のディレクトリが変化したままになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
( compound-list ) { compound-list ; } { compound-list } for name [ in [word ... ]] do compound-list done case word in [(] pattern1 ) compound-list ;; [[(] pattern[ | pattern] ... ) compound-list ;;] ... [[(] pattern[ | pattern] ... ) compound-list] esac if compound-list then compound-list [elif compound-list then compound-list] ... [else compound-list] fi while compound-list-1 do compound-list-2 done until compound-list-1 do compound-list-2 done |
Bashでは、他にユーザーに選択を要求するselect文があります。
1 |
select name [in words …]; do commands; done |
関数定義コマンド
関数は、新しい位置パラメータを持つ複合コマンドを呼び出すための名前です。関数は「関数定義コマンド」で定義されます。
1 |
fname ( ) compound-command [io-redirect ...] |
関数の宣言時は、関数の定義内の展開やリダイレクションは実行されず、
関数内でのリダイレクションや変数割り当ては、関数の実行時に実行されます。
関数が実行されると、その関数内のコマンドが実行され、一時的に位置パラメータが変更されます。
関数の実行が完了すると、位置パラメータと特別なパラメータ # は元の値に戻ります。関数内で return コマンドが実行されると、関数の実行が終了し、呼び出し元の次のコマンドが実行されます。
上記はPOSIXでの構文ですが、Bashではfunctionキーワードを入れた関数定義コマンドも利用できます。
1 |
function fname [()] compound-command [ redirections ] |