特殊組み込みコマンド
特殊組み込みコマンドは、以下の特性を持つ
- 対応する外部コマンドがなくても必ず実行される
- 同名の関数で動作を上書きできない
- シェルが対話モードでないとき (≒ シェルスクリプトを実行中のとき)、以下のエラーが発生するとシェルは直ちに終了する
- コマンドの構文誤り
- リダイレクト失敗
- 変数代入失敗
- 特殊組み込みコマンドに対して行った変数代入は特殊組み込みコマンド実行終了後も残る
$ foo=1 eval 'echo $foo' # 特殊組み込みコマンド
1
$ bar=2 cat /dev/null # 普通のコマンド
$ echo foo=$foo bar=$bar
foo=1 bar=
特殊組み込みコマンド:
- .
- :
- break
- continue
- eval
- exec
- exit
- export
- readonly
- return
- set
- shift
- times
- trap
- unset
準特殊組み込みコマンド
POSIX には「準特殊」なる用語は出てこないが、ここでは便宜上その様に呼んでおく。
準特殊組み込みコマンドは、対応する外部コマンドがなくても必ず実行される。(他の点は普通の組み込みコマンドと同じ)
準特殊組み込みコマンド:
- alias
- bg
- cd
- command
- false
- fc
- fg
- getopts
- hash
- jobs
- kill
- newgrp (注)
- pwd
- read
- true
- type
- ulimit
- umask
- unalias
- wait
(注) 実際に newgrp を組み込みコマンドとして有するシェルは少ない。
普通の組み込みコマンド
特殊組み込みコマンドでも準特殊組み込みコマンドでもない組み込みコマンドは、普通の組み込みコマンドである。
普通の組み込みコマンドは、POSIX では「外部コマンドを起動する代りにシェルが直接コマンドの機能を実行することによって高速化を図るもの」との位置付けなので、明確にどのコマンドが組み込みでどれが外部コマンドであるかの規定は無い。これは、厳密には「対応する外部コマンドが存在しなければ組み込みコマンドも存在しないと見做される」ことを意味するが、この点を厳格にチェックするシェルは少ない。
以下に、多くのシェルに共通の組み込みコマンドを挙げる。POSIX の欄のチェックは、POSIX にコマンドの定義があるものを指す。一部のシェルでは、以下のいくつかのコマンドは組み込みコマンドではなくエイリアスである。
コマンド | POSIX | bash | dash | zsh | ksh | mksh | yash |
---|---|---|---|---|---|---|---|
[ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
dirs | ✓ | ✓ | ✓ | ||||
disown | ✓ | ✓ | ✓ | ✓ | |||
echo | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
history | ✓ | ✓ | ✓ | ||||
let | ✓ | ✓ | ✓ | ✓ | |||
local | ✓ | ✓ | |||||
popd | ✓ | ✓ | ✓ | ||||
✓ | ✓ | ✓ | ✓ | ||||
printf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
pushd | ✓ | ✓ | ✓ | ||||
test | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
typeset | ✓ | ✓ | ✓ | ✓ | ✓ |