do not require leading . for rl color prefix etension; fix for isearch in single-byte locales; next set of doc updates (SIGNALS); add warning for invalid job id; allow function names to be non-identifiers in posix mode

This commit is contained in:
Chet Ramey
2024-10-26 12:39:17 -04:00
parent 474743f2da
commit ee3b91dfd9
33 changed files with 2501 additions and 2264 deletions
+69 -71
View File
@@ -94,113 +94,111 @@ The following list is what's changed when 'POSIX mode' is in effect:
10. Redirection operators do not perform word splitting on the word in
a redirection.
11. Function names must be valid shell names. That is, they may not
contain characters other than letters, digits, and underscores, and
may not start with a digit. Declaring a function with an invalid
name in a non-interactive shell is a fatal syntax error.
12. Function names may not be the same as one of the POSIX special
11. Function names may not be the same as one of the POSIX special
builtins.
13. Tilde expansion is only performed on assignments preceding a
12. Tilde expansion is only performed on assignments preceding a
command name, rather than on all assignment statements on the line.
14. While variable indirection is available, it may not be applied to
13. While variable indirection is available, it may not be applied to
the # and ? special parameters.
15. Expanding the * special parameter in a pattern context where the
14. Expanding the * special parameter in a pattern context where the
expansion is double-quoted does not treat the $* as if it were
double-quoted.
16. A double quote character (") is treated specially when it
15. A double quote character (") is treated specially when it
appears in a backquoted command substitution in the body of a
here-document that undergoes expansion. That means, for example,
that a backslash preceding a double quote character will escape it
and the backslash will be removed.
17. Command substitutions don't set the ? special parameter. The
16. Command substitutions don't set the ? special parameter. The
exit status of a simple command without a command word is still the
exit status of the last command substitution that occurred while
evaluating the variable assignments and redirections in that
command, but that does not happen until after all of the
assignments and redirections.
18. Literal tildes that appear as the first character in elements of
17. Literal tildes that appear as the first character in elements of
the PATH variable are not expanded as described above under *note
Tilde Expansion::.
19. Command lookup finds POSIX special builtins before shell
18. Command lookup finds POSIX special builtins before shell
functions, including output printed by the type and command
builtins.
20. Even if a shell function whose name contains a slash was defined
19. Even if a shell function whose name contains a slash was defined
before entering POSIX mode, the shell will not execute a function
whose name contains one or more slashes.
21. When a command in the hash table no longer exists, Bash will
20. When a command in the hash table no longer exists, Bash will
re-search $PATH to find the new location. This is also available
with shopt -s checkhash.
22. Bash will not insert a command without the execute bit set into
21. Bash will not insert a command without the execute bit set into
the command hash table, even if it returns it as a (last-ditch)
result from a $PATH search.
23. The message printed by the job control code and builtins when a
22. The message printed by the job control code and builtins when a
job exits with a non-zero status is 'Done(status)'.
24. The message printed by the job control code and builtins when a
23. The message printed by the job control code and builtins when a
job is stopped is 'Stopped(SIGNAME)', where SIGNAME is, for
example, SIGTSTP.
25. If the shell is interactive, Bash does not perform job
24. If the shell is interactive, Bash does not perform job
notifications between executing commands in lists separated by ;
or newline. Non-interactive shells print status messages after a
foreground job in a list completes.
26. If the shell is interactive, Bash waits until the next prompt
25. If the shell is interactive, Bash waits until the next prompt
before printing the status of a background job that changes status
or a foreground job that terminates due to a signal.
Non-interactive shells print status messages after a foreground job
completes.
27. Bash permanently removes jobs from the jobs table after notifying
26. Bash permanently removes jobs from the jobs table after notifying
the user of their termination via the wait or jobs builtins.
It removes the job from the jobs list after notifying the user of
its termination, but the status is still available via wait, as
long as wait is supplied a PID argument.
28. The vi editing mode will invoke the vi editor directly when
27. The vi editing mode will invoke the vi editor directly when
the v command is run, instead of checking $VISUAL and
$EDITOR.
29. Prompt expansion enables the POSIX PS1 and PS2 expansions of
28. Prompt expansion enables the POSIX PS1 and PS2 expansions of
! to the history number and !! to !, and Bash performs
parameter expansion on the values of PS1 and PS2 regardless of
the setting of the promptvars option.
30. The default history file is ~/.sh_history (this is the default
29. The default history file is ~/.sh_history (this is the default
value the shell assigns to $HISTFILE).
31. The ! character does not introduce history expansion within a
30. The ! character does not introduce history expansion within a
double-quoted string, even if the histexpand option is enabled.
32. When printing shell function definitions (e.g., by type), Bash
does not print the function keyword.
31. When printing shell function definitions (e.g., by type), Bash
does not print the function keyword unless necessary.
33. Non-interactive shells exit if a syntax error in an arithmetic
32. Non-interactive shells exit if a syntax error in an arithmetic
expansion results in an invalid expression.
34. Non-interactive shells exit if a parameter expansion error occurs.
33. Non-interactive shells exit if a parameter expansion error occurs.
35. If a POSIX special builtin returns an error status, a
34. If a POSIX special builtin returns an error status, a
non-interactive shell exits. The fatal errors are those listed in
the POSIX standard, and include things like passing incorrect
options, redirection errors, variable assignment errors for
assignments preceding the command name, and so on.
36. A non-interactive shell exits with an error status if a variable
35. A non-interactive shell exits with an error status if a variable
assignment error occurs when no command name follows the assignment
statements. A variable assignment error occurs, for example, when
trying to assign a value to a readonly variable.
37. A non-interactive shell exits with an error status if a variable
36. A non-interactive shell exits with an error status if a variable
assignment error occurs in an assignment statement preceding a
special builtin, but not with any other simple command. For any
other simple command, the shell aborts execution of that command,
@@ -208,156 +206,156 @@ The following list is what's changed when 'POSIX mode' is in effect:
perform any further processing of the command in which the error
occurred").
38. A non-interactive shell exits with an error status if the
37. A non-interactive shell exits with an error status if the
iteration variable in a for statement or the selection variable
in a select statement is a readonly variable or has an invalid
name.
39. Non-interactive shells exit if FILENAME in . FILENAME is not
38. Non-interactive shells exit if FILENAME in . FILENAME is not
found.
40. Non-interactive shells exit if there is a syntax error in a script
39. Non-interactive shells exit if there is a syntax error in a script
read with the . or source builtins, or in a string processed by
the eval builtin.
41. Non-interactive shells exit if the export, readonly or unset
40. Non-interactive shells exit if the export, readonly or unset
builtin commands get an argument that is not a valid identifier,
and they are not operating on shell functions. These errors force
an exit because these are special builtins.
42. Assignment statements preceding POSIX special builtins persist in
41. Assignment statements preceding POSIX special builtins persist in
the shell environment after the builtin completes.
43. The command builtin does not prevent builtins that take
42. The command builtin does not prevent builtins that take
assignment statements as arguments from expanding them as
assignment statements; when not in POSIX mode, declaration commands
lose their assignment statement expansion properties when preceded
by command.
44. Enabling POSIX mode has the effect of setting the
43. Enabling POSIX mode has the effect of setting the
inherit_errexit option, so subshells spawned to execute command
substitutions inherit the value of the -e option from the parent
shell. When the inherit_errexit option is not enabled, Bash
clears the -e option in such subshells.
45. Enabling POSIX mode has the effect of setting the shift_verbose
44. Enabling POSIX mode has the effect of setting the shift_verbose
option, so numeric arguments to shift that exceed the number of
positional parameters will result in an error message.
46. Enabling POSIX mode has the effect of setting the
45. Enabling POSIX mode has the effect of setting the
interactive_comments option (*note Comments::).
47. The . and source builtins do not search the current directory
46. The . and source builtins do not search the current directory
for the filename argument if it is not found by searching PATH.
48. When the alias builtin displays alias definitions, it does not
47. When the alias builtin displays alias definitions, it does not
display them with a leading alias unless the -p option is
supplied.
49. The bg builtin uses the required format to describe each job
48. The bg builtin uses the required format to describe each job
placed in the background, which does not include an indication of
whether the job is the current or previous job.
50. When the cd builtin is invoked in logical mode, and the pathname
49. When the cd builtin is invoked in logical mode, and the pathname
constructed from $PWD and the directory name supplied as an
argument does not refer to an existing directory, cd will fail
instead of falling back to physical mode.
51. When the cd builtin cannot change a directory because the length
50. When the cd builtin cannot change a directory because the length
of the pathname constructed from $PWD and the directory name
supplied as an argument exceeds PATH_MAX when canonicalized, cd
will attempt to use the supplied directory name.
52. When the xpg_echo option is enabled, Bash does not attempt to
51. When the xpg_echo option is enabled, Bash does not attempt to
interpret any arguments to echo as options. echo displays each
argument after converting escape sequences.
53. The export and readonly builtin commands display their output
52. The export and readonly builtin commands display their output
in the format required by POSIX.
54. When listing the history, the fc builtin does not include an
53. When listing the history, the fc builtin does not include an
indication of whether or not a history entry has been modified.
55. The default editor used by fc is ed.
54. The default editor used by fc is ed.
56. fc treats extra arguments as an error instead of ignoring them.
55. fc treats extra arguments as an error instead of ignoring them.
57. If there are too many arguments supplied to fc -s, fc prints
56. If there are too many arguments supplied to fc -s, fc prints
an error message and returns failure.
58. The output of kill -l prints all the signal names on a single
57. The output of kill -l prints all the signal names on a single
line, separated by spaces, without the SIG prefix.
59. The kill builtin does not accept signal names with a SIG
58. The kill builtin does not accept signal names with a SIG
prefix.
60. The printf builtin uses double (via strtod) to convert
59. The printf builtin uses double (via strtod) to convert
arguments corresponding to floating point conversion specifiers,
instead of long double if it's available. The L length
modifier forces printf to use long double if it's available.
61. The pwd builtin verifies that the value it prints is the same as
60. The pwd builtin verifies that the value it prints is the same as
the current directory, even if it is not asked to check the file
system with the -P option.
62. The read builtin may be interrupted by a signal for which a trap
61. The read builtin may be interrupted by a signal for which a trap
has been set. If Bash receives a trapped signal while executing
read, the trap handler executes and read returns an exit status
greater than 128.
63. When the set builtin is invoked without options, it does not
62. When the set builtin is invoked without options, it does not
display shell function names and definitions.
64. When the set builtin is invoked without options, it displays
63. When the set builtin is invoked without options, it displays
variable values without quotes, unless they contain shell
metacharacters, even if the result contains nonprinting characters.
65. The test builtin compares strings using the current locale when
64. The test builtin compares strings using the current locale when
evaluating the < and > binary operators.
66. The test builtin's -t unary primary requires an argument.
65. The test builtin's -t unary primary requires an argument.
Historical versions of test made the argument optional in certain
cases, and Bash attempts to accommodate those for backwards
compatibility.
67. The trap builtin displays signal names without the leading
66. The trap builtin displays signal names without the leading
SIG.
68. The trap builtin doesn't check the first argument for a possible
67. The trap builtin doesn't check the first argument for a possible
signal specification and revert the signal handling to the original
disposition if it is, unless that argument consists solely of
digits and is a valid signal number. If users want to reset the
handler for a given signal to the original disposition, they should
use - as the first argument.
69. trap -p without arguments displays signals whose dispositions
68. trap -p without arguments displays signals whose dispositions
are set to SIG_DFL and those that were ignored when the shell
started, not just trapped signals.
70. The type and command builtins will not report a non-executable
69. The type and command builtins will not report a non-executable
file as having been found, though the shell will attempt to execute
such a file if it is the only so-named file found in $PATH.
71. The ulimit builtin uses a block size of 512 bytes for the -c
70. The ulimit builtin uses a block size of 512 bytes for the -c
and -f options.
72. The unset builtin with the -v option specified returns a fatal
71. The unset builtin with the -v option specified returns a fatal
error if it attempts to unset a readonly or non-unsettable
variable, which causes a non-interactive shell to exit.
73. When asked to unset a variable that appears in an assignment
72. When asked to unset a variable that appears in an assignment
statement preceding the command, the unset builtin attempts to
unset a variable of the same name in the current or previous scope
as well. This implements the required "if an assigned variable is
further modified by the utility, the modifications made by the
utility shall persist" behavior.
74. The arrival of SIGCHLD when a trap is set on SIGCHLD does not
73. The arrival of SIGCHLD when a trap is set on SIGCHLD does not
interrupt the wait builtin and cause it to return immediately.
The trap command is run once for each child that exits.
75. Bash removes an exited background process's status from the list
of such statuses after the wait builtin is used to obtain it.
74. Bash removes an exited background process's status from the list
of such statuses after the wait builtin returns it.
There is other POSIX behavior that Bash does not implement by default
even when in POSIX mode. Specifically: