| http://www.opengroup.org/onlinepubs/9699919799/ | |
| Open Group Base Specifications Issue 7 | |
| http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html | |
| Shell & Utilities | |
| It says that any of the standard utilities may be implemented | |
| as a regular shell built-in. It gives a list of utilities which | |
| are usually implemented that way (and some of them can only | |
| be implemented as built-ins, like "alias"): | |
| alias | |
| bg | |
| cd | |
| command | |
| false | |
| fc | |
| fg | |
| getopts | |
| jobs | |
| kill | |
| newgrp | |
| pwd | |
| read | |
| true | |
| umask | |
| unalias | |
| wait | |
| http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html | |
| Shell Command Language | |
| It says that shell must implement special built-ins. Special built-ins | |
| differ from regular ones by the fact that variable assignments | |
| done on special builtin are *PRESERVED*. That is, | |
| VAR=VAL special_builtin; echo $VAR | |
| should print VAL. | |
| (Another distinction is that an error in special built-in should | |
| abort the shell, but this is not such a critical difference, | |
| and moreover, at least bash's "set" does not follow this rule, | |
| which is even codified in autoconf configure logic now...) | |
| List of special builtins: | |
| . file | |
| : [argument...] | |
| break [n] | |
| continue [n] | |
| eval [argument...] | |
| exec [command [argument...]] | |
| exit [n] | |
| export name[=word]... | |
| export -p | |
| readonly name[=word]... | |
| readonly -p | |
| return [n] | |
| set [-abCefhmnuvx] [-o option] [argument...] | |
| set [+abCefhmnuvx] [+o option] [argument...] | |
| set -- [argument...] | |
| set -o | |
| set +o | |
| shift [n] | |
| times | |
| trap n [condition...] | |
| trap [action condition...] | |
| unset [-fv] name... | |
| In practice, no one uses this obscure feature - none of these builtins | |
| gives any special reasons to play such dirty tricks. | |
| However. This section also says that *function invocation* should act | |
| similar to special built-in. That is, variable assignments | |
| done on function invocation should be preserved after function invocation. | |
| This is significant: it is not unthinkable to want to run a function | |
| with some variables set to special values. But because of the above, | |
| it does not work: variable will "leak" out of the function. |