]> git.ipfire.org Git - thirdparty/bash.git/blame - POSIX
bash-5.1-alpha release
[thirdparty/bash.git] / POSIX
CommitLineData
95732b49
JA
16.11 Bash POSIX Mode
2====================
726f6388 3
a0c0a00f 4Starting Bash with the '--posix' command-line option or executing 'set
ccc6cda3 5-o posix' while Bash is running will cause Bash to conform more closely
0628567a
JA
6to the POSIX standard by changing the behavior to match that specified
7by POSIX in areas where the Bash default differs.
726f6388 8
a0c0a00f 9When invoked as 'sh', Bash enters POSIX mode after reading the startup
7117c2d2
JA
10files.
11
a0c0a00f 12The following list is what's changed when 'POSIX mode' is in effect:
726f6388 13
d233b485
CR
14 1. Bash ensures that the 'POSIXLY_CORRECT' variable is set.
15
16 2. When a command in the hash table no longer exists, Bash will
a0c0a00f
CR
17 re-search '$PATH' to find the new location. This is also available
18 with 'shopt -s checkhash'.
726f6388 19
712f80b0
CR
20 3. Bash will not insert a command without the execute bit set into the
21 command hash table, even if it returns it as a (last-ditch) result
22 from a '$PATH' search.
726f6388 23
d233b485 24 4. The message printed by the job control code and builtins when a job
712f80b0
CR
25 exits with a non-zero status is 'Done(status)'.
26
27 5. The message printed by the job control code and builtins when a job
a0c0a00f
CR
28 is stopped is 'Stopped(SIGNAME)', where SIGNAME is, for example,
29 'SIGTSTP'.
726f6388 30
712f80b0 31 6. Alias expansion is always enabled, even in non-interactive shells.
726f6388 32
712f80b0 33 7. Reserved words appearing in a context where reserved words are
95732b49
JA
34 recognized do not undergo alias expansion.
35
712f80b0 36 8. The POSIX 'PS1' and 'PS2' expansions of '!' to the history number
a0c0a00f
CR
37 and '!!' to '!' are enabled, and parameter expansion is performed
38 on the values of 'PS1' and 'PS2' regardless of the setting of the
39 'promptvars' option.
726f6388 40
712f80b0 41 9. The POSIX startup files are executed ('$ENV') rather than the
0628567a 42 normal Bash files.
726f6388 43
712f80b0 44 10. Tilde expansion is only performed on assignments preceding a
ccc6cda3 45 command name, rather than on all assignment statements on the line.
726f6388 46
712f80b0 47 11. The default history file is '~/.sh_history' (this is the default
a0c0a00f 48 value of '$HISTFILE').
ac50fbac 49
712f80b0 50 12. Redirection operators do not perform filename expansion on the
a0c0a00f 51 word in the redirection unless the shell is interactive.
726f6388 52
712f80b0 53 13. Redirection operators do not perform word splitting on the word in
bb70624e
JA
54 the redirection.
55
712f80b0 56 14. Function names must be valid shell 'name's. That is, they may not
ccc6cda3 57 contain characters other than letters, digits, and underscores, and
cce855bc 58 may not start with a digit. Declaring a function with an invalid
ccc6cda3 59 name causes a fatal syntax error in non-interactive shells.
726f6388 60
712f80b0 61 15. Function names may not be the same as one of the POSIX special
ac50fbac
CR
62 builtins.
63
712f80b0 64 16. POSIX special builtins are found before shell functions during
0628567a 65 command lookup.
726f6388 66
712f80b0 67 17. When printing shell function definitions (e.g., by 'type'), Bash
d233b485
CR
68 does not print the 'function' keyword.
69
712f80b0 70 18. Literal tildes that appear as the first character in elements of
a0c0a00f
CR
71 the 'PATH' variable are not expanded as described above under *note
72 Tilde Expansion::.
73
712f80b0 74 19. The 'time' reserved word may be used by itself as a command. When
495aee44 75 used in this way, it displays timing statistics for the shell and
a0c0a00f 76 its completed children. The 'TIMEFORMAT' variable controls the
495aee44
CR
77 format of the timing information.
78
712f80b0 79 20. When parsing and expanding a ${...} expansion that appears within
495aee44
CR
80 double quotes, single quotes are no longer special and cannot be
81 used to quote a closing brace or other special character, unless
82 the operator is one of those defined to perform pattern removal.
83 In this case, they do not have to appear as matched pairs.
84
712f80b0 85 21. The parser does not recognize 'time' as a reserved word if the
a0c0a00f 86 next token begins with a '-'.
495aee44 87
712f80b0 88 22. The '!' character does not introduce history expansion within a
a0c0a00f
CR
89 double-quoted string, even if the 'histexpand' option is enabled.
90
712f80b0 91 23. If a POSIX special builtin returns an error status, a
ccc6cda3 92 non-interactive shell exits. The fatal errors are those listed in
0628567a 93 the POSIX standard, and include things like passing incorrect
ccc6cda3
JA
94 options, redirection errors, variable assignment errors for
95 assignments preceding the command name, and so on.
726f6388 96
712f80b0 97 24. A non-interactive shell exits with an error status if a variable
ccc6cda3
JA
98 assignment error occurs when no command name follows the assignment
99 statements. A variable assignment error occurs, for example, when
cce855bc 100 trying to assign a value to a readonly variable.
ccc6cda3 101
712f80b0 102 25. A non-interactive shell exits with an error status if a variable
495aee44
CR
103 assignment error occurs in an assignment statement preceding a
104 special builtin, but not with any other simple command.
105
712f80b0 106 26. A non-interactive shell exits with an error status if the
a0c0a00f
CR
107 iteration variable in a 'for' statement or the selection variable
108 in a 'select' statement is a readonly variable.
109
712f80b0 110 27. Non-interactive shells exit if FILENAME in '.' FILENAME is not
a0c0a00f
CR
111 found.
112
712f80b0 113 28. Non-interactive shells exit if a syntax error in an arithmetic
a0c0a00f
CR
114 expansion results in an invalid expression.
115
712f80b0 116 29. Non-interactive shells exit if a parameter expansion error occurs.
a0c0a00f 117
712f80b0 118 30. Non-interactive shells exit if there is a syntax error in a script
a0c0a00f
CR
119 read with the '.' or 'source' builtins, or in a string processed by
120 the 'eval' builtin.
ccc6cda3 121
d233b485 122 31. While variable indirection is available, it may not be applied to
a0c0a00f 123 the '#' and '?' special parameters.
ac50fbac 124
d233b485
CR
125 32. When expanding the '*' special parameter in a pattern context
126 where the expansion is double-quoted does not treat the '$*' as if
127 it were double-quoted.
128
129 33. Assignment statements preceding POSIX special builtins persist in
0628567a 130 the shell environment after the builtin completes.
ccc6cda3 131
712f80b0 132 34. The 'command' builtin does not prevent builtins that take
a0c0a00f
CR
133 assignment statements as arguments from expanding them as
134 assignment statements; when not in POSIX mode, assignment builtins
135 lose their assignment statement expansion properties when preceded
136 by 'command'.
137
712f80b0 138 35. The 'bg' builtin uses the required format to describe each job
a0c0a00f
CR
139 placed in the background, which does not include an indication of
140 whether the job is the current or previous job.
141
712f80b0 142 36. The output of 'kill -l' prints all the signal names on a single
a0c0a00f
CR
143 line, separated by spaces, without the 'SIG' prefix.
144
712f80b0 145 37. The 'kill' builtin does not accept signal names with a 'SIG'
a0c0a00f
CR
146 prefix.
147
712f80b0 148 38. The 'export' and 'readonly' builtin commands display their output
0628567a 149 in the format required by POSIX.
d166f048 150
712f80b0 151 39. The 'trap' builtin displays signal names without the leading
a0c0a00f 152 'SIG'.
28ef6c31 153
712f80b0 154 40. The 'trap' builtin doesn't check the first argument for a possible
b80f6443 155 signal specification and revert the signal handling to the original
95732b49
JA
156 disposition if it is, unless that argument consists solely of
157 digits and is a valid signal number. If users want to reset the
a0c0a00f
CR
158 handler for a given signal to the original disposition, they should
159 use '-' as the first argument.
b80f6443 160
712f80b0
CR
161 41. 'trap -p' displays signals whose dispositions are set to SIG_DFL
162 and those that were ignored when the shell started.
163
d233b485 164 42. The '.' and 'source' builtins do not search the current directory
a0c0a00f 165 for the filename argument if it is not found by searching 'PATH'.
28ef6c31 166
d233b485 167 43. Enabling POSIX mode has the effect of setting the
a0c0a00f
CR
168 'inherit_errexit' option, so subshells spawned to execute command
169 substitutions inherit the value of the '-e' option from the parent
170 shell. When the 'inherit_errexit' option is not enabled, Bash
171 clears the '-e' option in such subshells.
28ef6c31 172
d233b485
CR
173 44. Enabling POSIX mode has the effect of setting the 'shift_verbose'
174 option, so numeric arguments to 'shift' that exceed the number of
175 positional parameters will result in an error message.
176
177 45. When the 'alias' builtin displays alias definitions, it does not
a0c0a00f 178 display them with a leading 'alias ' unless the '-p' option is
b80f6443 179 supplied.
28ef6c31 180
d233b485 181 46. When the 'set' builtin is invoked without options, it does not
28ef6c31
JA
182 display shell function names and definitions.
183
d233b485 184 47. When the 'set' builtin is invoked without options, it displays
7117c2d2
JA
185 variable values without quotes, unless they contain shell
186 metacharacters, even if the result contains nonprinting characters.
187
d233b485 188 48. When the 'cd' builtin is invoked in LOGICAL mode, and the pathname
a0c0a00f
CR
189 constructed from '$PWD' and the directory name supplied as an
190 argument does not refer to an existing directory, 'cd' will fail
7117c2d2 191 instead of falling back to PHYSICAL mode.
ccc6cda3 192
d233b485
CR
193 49. When the 'cd' builtin cannot change a directory because the length
194 of the pathname constructed from '$PWD' and the directory name
195 supplied as an argument exceeds PATH_MAX when all symbolic links
196 are expanded, 'cd' will fail instead of attempting to use only the
197 supplied directory name.
198
199 50. The 'pwd' builtin verifies that the value it prints is the same as
95732b49 200 the current directory, even if it is not asked to check the file
a0c0a00f 201 system with the '-P' option.
95732b49 202
d233b485 203 51. When listing the history, the 'fc' builtin does not include an
95732b49
JA
204 indication of whether or not a history entry has been modified.
205
d233b485 206 52. The default editor used by 'fc' is 'ed'.
95732b49 207
d233b485 208 53. The 'type' and 'command' builtins will not report a non-executable
a0c0a00f
CR
209 file as having been found, though the shell will attempt to execute
210 such a file if it is the only so-named file found in '$PATH'.
95732b49 211
d233b485 212 54. The 'vi' editing mode will invoke the 'vi' editor directly when
a0c0a00f
CR
213 the 'v' command is run, instead of checking '$VISUAL' and
214 '$EDITOR'.
95732b49 215
d233b485 216 55. When the 'xpg_echo' option is enabled, Bash does not attempt to
a0c0a00f 217 interpret any arguments to 'echo' as options. Each argument is
95732b49
JA
218 displayed, after escape characters are converted.
219
d233b485 220 56. The 'ulimit' builtin uses a block size of 512 bytes for the '-c'
a0c0a00f 221 and '-f' options.
3185942a 222
d233b485 223 57. The arrival of 'SIGCHLD' when a trap is set on 'SIGCHLD' does not
a0c0a00f 224 interrupt the 'wait' builtin and cause it to return immediately.
0001803f
CR
225 The trap command is run once for each child that exits.
226
d233b485 227 58. The 'read' builtin may be interrupted by a signal for which a trap
ac50fbac 228 has been set. If Bash receives a trapped signal while executing
a0c0a00f
CR
229 'read', the trap handler executes and 'read' returns an exit status
230 greater than 128.
ac50fbac 231
d233b485 232 59. Bash removes an exited background process's status from the list
a0c0a00f 233 of such statuses after the 'wait' builtin is used to obtain it.
95732b49 234
0628567a
JA
235There is other POSIX behavior that Bash does not implement by default
236even when in POSIX mode. Specifically:
ccc6cda3 237
a0c0a00f
CR
238 1. The 'fc' builtin checks '$EDITOR' as a program to edit history
239 entries if 'FCEDIT' is unset, rather than defaulting directly to
240 'ed'. 'fc' uses 'ed' if 'EDITOR' is unset.
28ef6c31 241
a0c0a00f
CR
242 2. As noted above, Bash requires the 'xpg_echo' option to be enabled
243 for the 'echo' builtin to be fully conformant.
28ef6c31 244
95732b49 245Bash can be configured to be POSIX-conformant by default, by specifying
a0c0a00f 246the '--enable-strict-posix-default' to 'configure' when building (*note
95732b49 247Optional Features::).
28ef6c31 248