From d5ab50bc0214f07222d5a6d2597f5e0d7e3f1f52 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Mon, 4 Dec 2023 16:40:00 -0500 Subject: [PATCH] fix for ssh infinite loop when SSH_SOURCE_BASHRC is defined and bash is run in a comsub in .bashrc; implement posix interp 1009 in posix mode --- .gitignore | 1 + CWRU/CWRU.chlog | 26 ++++++ MANIFEST | 1 + POSIX | 91 ++++++++++--------- builtins/evalstring.c | 3 + builtins/set.def | 4 + doc/bash.info | 201 ++++++++++++++++++++++-------------------- doc/bashref.info | 201 ++++++++++++++++++++++-------------------- doc/bashref.log | 32 +++---- doc/bashref.pdf | Bin 815170 -> 815459 bytes doc/bashref.texi | 7 ++ shell.c | 4 +- tests/varenv.right | 18 ++++ tests/varenv.tests | 1 + tests/varenv24.sub | 102 +++++++++++++++++++++ variables.c | 41 +++++++++ variables.h | 2 + 17 files changed, 482 insertions(+), 253 deletions(-) create mode 100644 tests/varenv24.sub diff --git a/.gitignore b/.gitignore index b9eafe3a..2c10177c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ *.dSYM .build .made +.*~ config.h config.status diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index e241bfc6..baf1677b 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -8083,3 +8083,29 @@ subst.c lib/readline/display.c - rl_redisplay: make sure lpos is initialized to 0 if local_prompt is NULL + +shell.c + - run_startup_files: make sure ssh_reading_startup_files is set to 0 + in more places; still dependent on SSH_SOURCE_BASHRC + +builtins/evalstring.c + - should_suppress_fork: make sure ssh_reading_startup_files is 0 in + order to suppress a fork. It will never be non-zero unless someone + enables SSH_SOURCE_BASHRC. + Fixes https://issues.redhat.com/browse/RHEL-5653 + +variables.c + - posix_unbind_tempvar: new function to implement POSIX interp 1009, + which says that `x=4 unset x' not only unsets the variable in the + temporary environment but the most recent scope as well. + +variables.h + - posix_unbind_tempvar: extern declaration + +builtins/set.def + - unset_builtin: if we are unsetting a variable that is in some + temporary environment, and the shell is in posix mode, call + posix_unbind_tempvar to implement the right posix behavior + +doc/bashref.texi + - update posix mode section with change to unset for interp 1009 diff --git a/MANIFEST b/MANIFEST index 49e69fe4..c6c4817c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1623,6 +1623,7 @@ tests/varenv20.sub f tests/varenv21.sub f tests/varenv22.sub f tests/varenv23.sub f +tests/varenv24.sub f tests/version f tests/version.mini f tests/vredir.tests f diff --git a/POSIX b/POSIX index 2018afa8..528300ef 100644 --- a/POSIX +++ b/POSIX @@ -157,12 +157,19 @@ The following list is what's changed when 'POSIX mode' is in effect: variable, or encounters a variable name argument that is an invalid identifier, which causes a non-interactive shell to exit. - 27. A non-interactive shell exits with an error status if a variable + 27. 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. + + 28. 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. - 28. A non-interactive shell exits with an error status if a variable + 29. 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, @@ -170,160 +177,160 @@ 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"). - 29. A non-interactive shell exits with an error status if the + 30. 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. - 30. Non-interactive shells exit if FILENAME in '.' FILENAME is not + 31. Non-interactive shells exit if FILENAME in '.' FILENAME is not found. - 31. 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. - 32. Non-interactive shells exit if a parameter expansion error occurs. + 33. Non-interactive shells exit if a parameter expansion error occurs. - 33. Non-interactive shells exit if there is a syntax error in a script + 34. 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. - 34. While variable indirection is available, it may not be applied to + 35. While variable indirection is available, it may not be applied to the '#' and '?' special parameters. - 35. Expanding the '*' special parameter in a pattern context where the + 36. Expanding the '*' special parameter in a pattern context where the expansion is double-quoted does not treat the '$*' as if it were double-quoted. - 36. Assignment statements preceding POSIX special builtins persist in + 37. Assignment statements preceding POSIX special builtins persist in the shell environment after the builtin completes. - 37. The 'command' builtin does not prevent builtins that take + 38. The 'command' builtin does not prevent builtins that take assignment statements as arguments from expanding them as assignment statements; when not in POSIX mode, assignment builtins lose their assignment statement expansion properties when preceded by 'command'. - 38. The 'bg' builtin uses the required format to describe each job + 39. 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. - 39. The output of 'kill -l' prints all the signal names on a single + 40. The output of 'kill -l' prints all the signal names on a single line, separated by spaces, without the 'SIG' prefix. - 40. The 'kill' builtin does not accept signal names with a 'SIG' + 41. The 'kill' builtin does not accept signal names with a 'SIG' prefix. - 41. The 'export' and 'readonly' builtin commands display their output + 42. The 'export' and 'readonly' builtin commands display their output in the format required by POSIX. - 42. The 'trap' builtin displays signal names without the leading + 43. The 'trap' builtin displays signal names without the leading 'SIG'. - 43. The 'trap' builtin doesn't check the first argument for a possible + 44. 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. - 44. 'trap -p' without arguments displays signals whose dispositions + 45. '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. - 45. 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'. - 46. Enabling POSIX mode has the effect of setting the + 47. 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. - 47. Enabling POSIX mode has the effect of setting the 'shift_verbose' + 48. 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. - 48. When the 'alias' builtin displays alias definitions, it does not + 49. When the 'alias' builtin displays alias definitions, it does not display them with a leading 'alias ' unless the '-p' option is supplied. - 49. When the 'set' builtin is invoked without options, it does not + 50. When the 'set' builtin is invoked without options, it does not display shell function names and definitions. - 50. When the 'set' builtin is invoked without options, it displays + 51. 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. - 51. When the 'cd' builtin is invoked in logical mode, and the pathname + 52. 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. - 52. When the 'cd' builtin cannot change a directory because the length + 53. 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 all symbolic links are expanded, 'cd' will fail instead of attempting to use only the supplied directory name. - 53. The 'pwd' builtin verifies that the value it prints is the same as + 54. 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. - 54. When listing the history, the 'fc' builtin does not include an + 55. 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'. + 56. The default editor used by 'fc' is 'ed'. - 56. If there are too many arguments supplied to 'fc -s', 'fc' prints + 57. If there are too many arguments supplied to 'fc -s', 'fc' prints an error message and returns failure. - 57. The 'type' and 'command' builtins will not report a non-executable + 58. 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'. - 58. The 'vi' editing mode will invoke the 'vi' editor directly when + 59. The 'vi' editing mode will invoke the 'vi' editor directly when the 'v' command is run, instead of checking '$VISUAL' and '$EDITOR'. - 59. When the 'xpg_echo' option is enabled, Bash does not attempt to + 60. When the 'xpg_echo' option is enabled, Bash does not attempt to interpret any arguments to 'echo' as options. Each argument is displayed, after escape characters are converted. - 60. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' + 61. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' and '-f' options. - 61. The arrival of 'SIGCHLD' when a trap is set on 'SIGCHLD' does not + 62. 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. - 62. The 'read' builtin may be interrupted by a signal for which a trap + 63. 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. The 'printf' builtin uses 'double' (via 'strtod') to convert + 64. 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. - 64. Bash removes an exited background process's status from the list + 65. Bash removes an exited background process's status from the list of such statuses after the 'wait' builtin is used to obtain it. - 65. A double quote character ('"') is treated specially when it + 66. 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. - 66. The 'test' builtin compares strings using the current locale when + 67. The 'test' builtin compares strings using the current locale when processing the '<' and '>' binary operators. - 67. The 'test' builtin's '-t' unary primary requires an argument. + 68. 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. - 68. Command substitutions don't set the '?' special parameter. The + 69. 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 diff --git a/builtins/evalstring.c b/builtins/evalstring.c index 41198a94..fedacdfc 100644 --- a/builtins/evalstring.c +++ b/builtins/evalstring.c @@ -118,6 +118,8 @@ should_optimize_fork (COMMAND *command, int subshell) /* This has extra tests to account for STARTUP_STATE == 2, which is for -c command but has been extended to command and process substitution (basically any time you call parse_and_execute in a subshell). */ +/* ssh_reading_startup_files will never be non-zero unless someone goes + and uncomments SSH_SOURCE_BASHRC in config-top.h */ int should_suppress_fork (COMMAND *command) { @@ -128,6 +130,7 @@ should_suppress_fork (COMMAND *command) *bash_input.location.string == '\0' && parser_expanding_alias () == 0 && job_control_active_p () == 0 && + ssh_reading_startup_files == 0 && should_optimize_fork (command, subshell)); } diff --git a/builtins/set.def b/builtins/set.def index 0b9ae8f5..6e70d4e0 100644 --- a/builtins/set.def +++ b/builtins/set.def @@ -1016,9 +1016,13 @@ unset_builtin (WORD_LIST *list) #endif tem = unbind_variable (nameref_cell (var)); } + else if (posixly_correct && var && tempvar_p (var)) + tem = posix_unbind_tempvar (name); else tem = unbind_variable (name); } + else if (posixly_correct && unset_function == 0 && nameref == 0 && var && tempvar_p (var)) + tem = posix_unbind_tempvar (name); else tem = unset_function ? unbind_func (name) : (nameref ? unbind_nameref (name) : unbind_variable (name)); diff --git a/doc/bash.info b/doc/bash.info index eff23a09..30026b0c 100644 --- a/doc/bash.info +++ b/doc/bash.info @@ -7401,12 +7401,19 @@ startup files. variable, or encounters a variable name argument that is an invalid identifier, which causes a non-interactive shell to exit. - 27. A non-interactive shell exits with an error status if a variable + 27. 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. + + 28. 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. - 28. A non-interactive shell exits with an error status if a variable + 29. 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, @@ -7414,160 +7421,160 @@ startup files. perform any further processing of the command in which the error occurred"). - 29. A non-interactive shell exits with an error status if the + 30. 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. - 30. Non-interactive shells exit if FILENAME in '.' FILENAME is not + 31. Non-interactive shells exit if FILENAME in '.' FILENAME is not found. - 31. 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. - 32. Non-interactive shells exit if a parameter expansion error occurs. + 33. Non-interactive shells exit if a parameter expansion error occurs. - 33. Non-interactive shells exit if there is a syntax error in a script + 34. 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. - 34. While variable indirection is available, it may not be applied to + 35. While variable indirection is available, it may not be applied to the '#' and '?' special parameters. - 35. Expanding the '*' special parameter in a pattern context where the + 36. Expanding the '*' special parameter in a pattern context where the expansion is double-quoted does not treat the '$*' as if it were double-quoted. - 36. Assignment statements preceding POSIX special builtins persist in + 37. Assignment statements preceding POSIX special builtins persist in the shell environment after the builtin completes. - 37. The 'command' builtin does not prevent builtins that take + 38. The 'command' builtin does not prevent builtins that take assignment statements as arguments from expanding them as assignment statements; when not in POSIX mode, assignment builtins lose their assignment statement expansion properties when preceded by 'command'. - 38. The 'bg' builtin uses the required format to describe each job + 39. 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. - 39. The output of 'kill -l' prints all the signal names on a single + 40. The output of 'kill -l' prints all the signal names on a single line, separated by spaces, without the 'SIG' prefix. - 40. The 'kill' builtin does not accept signal names with a 'SIG' + 41. The 'kill' builtin does not accept signal names with a 'SIG' prefix. - 41. The 'export' and 'readonly' builtin commands display their output + 42. The 'export' and 'readonly' builtin commands display their output in the format required by POSIX. - 42. The 'trap' builtin displays signal names without the leading + 43. The 'trap' builtin displays signal names without the leading 'SIG'. - 43. The 'trap' builtin doesn't check the first argument for a possible + 44. 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. - 44. 'trap -p' without arguments displays signals whose dispositions + 45. '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. - 45. 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'. - 46. Enabling POSIX mode has the effect of setting the + 47. 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. - 47. Enabling POSIX mode has the effect of setting the 'shift_verbose' + 48. 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. - 48. When the 'alias' builtin displays alias definitions, it does not + 49. When the 'alias' builtin displays alias definitions, it does not display them with a leading 'alias ' unless the '-p' option is supplied. - 49. When the 'set' builtin is invoked without options, it does not + 50. When the 'set' builtin is invoked without options, it does not display shell function names and definitions. - 50. When the 'set' builtin is invoked without options, it displays + 51. 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. - 51. When the 'cd' builtin is invoked in logical mode, and the pathname + 52. 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. - 52. When the 'cd' builtin cannot change a directory because the length + 53. 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 all symbolic links are expanded, 'cd' will fail instead of attempting to use only the supplied directory name. - 53. The 'pwd' builtin verifies that the value it prints is the same as + 54. 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. - 54. When listing the history, the 'fc' builtin does not include an + 55. 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'. + 56. The default editor used by 'fc' is 'ed'. - 56. If there are too many arguments supplied to 'fc -s', 'fc' prints + 57. If there are too many arguments supplied to 'fc -s', 'fc' prints an error message and returns failure. - 57. The 'type' and 'command' builtins will not report a non-executable + 58. 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'. - 58. The 'vi' editing mode will invoke the 'vi' editor directly when + 59. The 'vi' editing mode will invoke the 'vi' editor directly when the 'v' command is run, instead of checking '$VISUAL' and '$EDITOR'. - 59. When the 'xpg_echo' option is enabled, Bash does not attempt to + 60. When the 'xpg_echo' option is enabled, Bash does not attempt to interpret any arguments to 'echo' as options. Each argument is displayed, after escape characters are converted. - 60. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' + 61. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' and '-f' options. - 61. The arrival of 'SIGCHLD' when a trap is set on 'SIGCHLD' does not + 62. 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. - 62. The 'read' builtin may be interrupted by a signal for which a trap + 63. 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. The 'printf' builtin uses 'double' (via 'strtod') to convert + 64. 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. - 64. Bash removes an exited background process's status from the list + 65. Bash removes an exited background process's status from the list of such statuses after the 'wait' builtin is used to obtain it. - 65. A double quote character ('"') is treated specially when it + 66. 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. - 66. The 'test' builtin compares strings using the current locale when + 67. The 'test' builtin compares strings using the current locale when processing the '<' and '>' binary operators. - 67. The 'test' builtin's '-t' unary primary requires an argument. + 68. 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. - 68. Command substitutions don't set the '?' special parameter. The + 69. 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 @@ -12968,61 +12975,61 @@ Node: Directory Stack Builtins300543 Node: Controlling the Prompt304800 Node: The Restricted Shell307762 Node: Bash POSIX Mode310369 -Node: Shell Compatibility Mode326623 -Node: Job Control334868 -Node: Job Control Basics335325 -Node: Job Control Builtins340324 -Node: Job Control Variables346116 -Node: Command Line Editing347269 -Node: Introduction and Notation348937 -Node: Readline Interaction350557 -Node: Readline Bare Essentials351745 -Node: Readline Movement Commands353531 -Node: Readline Killing Commands354488 -Node: Readline Arguments356406 -Node: Searching357447 -Node: Readline Init File359630 -Node: Readline Init File Syntax360888 -Node: Conditional Init Constructs384910 -Node: Sample Init File389103 -Node: Bindable Readline Commands392224 -Node: Commands For Moving393425 -Node: Commands For History395473 -Node: Commands For Text400464 -Node: Commands For Killing404439 -Node: Numeric Arguments407140 -Node: Commands For Completion408276 -Node: Keyboard Macros412464 -Node: Miscellaneous Commands413149 -Node: Readline vi Mode419515 -Node: Programmable Completion420419 -Node: Programmable Completion Builtins428196 -Node: A Programmable Completion Example439313 -Node: Using History Interactively444558 -Node: Bash History Facilities445239 -Node: Bash History Builtins448247 -Node: History Interaction453335 -Node: Event Designators457145 -Node: Word Designators458680 -Node: Modifiers460542 -Node: Installing Bash462347 -Node: Basic Installation463481 -Node: Compilers and Options467200 -Node: Compiling For Multiple Architectures467938 -Node: Installation Names469627 -Node: Specifying the System Type471733 -Node: Sharing Defaults472447 -Node: Operation Controls473117 -Node: Optional Features474072 -Node: Reporting Bugs485289 -Node: Major Differences From The Bourne Shell486620 -Node: GNU Free Documentation License503475 -Node: Indexes528649 -Node: Builtin Index529100 -Node: Reserved Word Index536198 -Node: Variable Index538643 -Node: Function Index555774 -Node: Concept Index569630 +Node: Shell Compatibility Mode327011 +Node: Job Control335256 +Node: Job Control Basics335713 +Node: Job Control Builtins340712 +Node: Job Control Variables346504 +Node: Command Line Editing347657 +Node: Introduction and Notation349325 +Node: Readline Interaction350945 +Node: Readline Bare Essentials352133 +Node: Readline Movement Commands353919 +Node: Readline Killing Commands354876 +Node: Readline Arguments356794 +Node: Searching357835 +Node: Readline Init File360018 +Node: Readline Init File Syntax361276 +Node: Conditional Init Constructs385298 +Node: Sample Init File389491 +Node: Bindable Readline Commands392612 +Node: Commands For Moving393813 +Node: Commands For History395861 +Node: Commands For Text400852 +Node: Commands For Killing404827 +Node: Numeric Arguments407528 +Node: Commands For Completion408664 +Node: Keyboard Macros412852 +Node: Miscellaneous Commands413537 +Node: Readline vi Mode419903 +Node: Programmable Completion420807 +Node: Programmable Completion Builtins428584 +Node: A Programmable Completion Example439701 +Node: Using History Interactively444946 +Node: Bash History Facilities445627 +Node: Bash History Builtins448635 +Node: History Interaction453723 +Node: Event Designators457533 +Node: Word Designators459068 +Node: Modifiers460930 +Node: Installing Bash462735 +Node: Basic Installation463869 +Node: Compilers and Options467588 +Node: Compiling For Multiple Architectures468326 +Node: Installation Names470015 +Node: Specifying the System Type472121 +Node: Sharing Defaults472835 +Node: Operation Controls473505 +Node: Optional Features474460 +Node: Reporting Bugs485677 +Node: Major Differences From The Bourne Shell487008 +Node: GNU Free Documentation License503863 +Node: Indexes529037 +Node: Builtin Index529488 +Node: Reserved Word Index536586 +Node: Variable Index539031 +Node: Function Index556162 +Node: Concept Index570018  End Tag Table diff --git a/doc/bashref.info b/doc/bashref.info index c7ecab62..064eab3f 100644 --- a/doc/bashref.info +++ b/doc/bashref.info @@ -7402,12 +7402,19 @@ startup files. variable, or encounters a variable name argument that is an invalid identifier, which causes a non-interactive shell to exit. - 27. A non-interactive shell exits with an error status if a variable + 27. 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. + + 28. 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. - 28. A non-interactive shell exits with an error status if a variable + 29. 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, @@ -7415,160 +7422,160 @@ startup files. perform any further processing of the command in which the error occurred"). - 29. A non-interactive shell exits with an error status if the + 30. 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. - 30. Non-interactive shells exit if FILENAME in '.' FILENAME is not + 31. Non-interactive shells exit if FILENAME in '.' FILENAME is not found. - 31. 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. - 32. Non-interactive shells exit if a parameter expansion error occurs. + 33. Non-interactive shells exit if a parameter expansion error occurs. - 33. Non-interactive shells exit if there is a syntax error in a script + 34. 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. - 34. While variable indirection is available, it may not be applied to + 35. While variable indirection is available, it may not be applied to the '#' and '?' special parameters. - 35. Expanding the '*' special parameter in a pattern context where the + 36. Expanding the '*' special parameter in a pattern context where the expansion is double-quoted does not treat the '$*' as if it were double-quoted. - 36. Assignment statements preceding POSIX special builtins persist in + 37. Assignment statements preceding POSIX special builtins persist in the shell environment after the builtin completes. - 37. The 'command' builtin does not prevent builtins that take + 38. The 'command' builtin does not prevent builtins that take assignment statements as arguments from expanding them as assignment statements; when not in POSIX mode, assignment builtins lose their assignment statement expansion properties when preceded by 'command'. - 38. The 'bg' builtin uses the required format to describe each job + 39. 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. - 39. The output of 'kill -l' prints all the signal names on a single + 40. The output of 'kill -l' prints all the signal names on a single line, separated by spaces, without the 'SIG' prefix. - 40. The 'kill' builtin does not accept signal names with a 'SIG' + 41. The 'kill' builtin does not accept signal names with a 'SIG' prefix. - 41. The 'export' and 'readonly' builtin commands display their output + 42. The 'export' and 'readonly' builtin commands display their output in the format required by POSIX. - 42. The 'trap' builtin displays signal names without the leading + 43. The 'trap' builtin displays signal names without the leading 'SIG'. - 43. The 'trap' builtin doesn't check the first argument for a possible + 44. 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. - 44. 'trap -p' without arguments displays signals whose dispositions + 45. '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. - 45. 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'. - 46. Enabling POSIX mode has the effect of setting the + 47. 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. - 47. Enabling POSIX mode has the effect of setting the 'shift_verbose' + 48. 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. - 48. When the 'alias' builtin displays alias definitions, it does not + 49. When the 'alias' builtin displays alias definitions, it does not display them with a leading 'alias ' unless the '-p' option is supplied. - 49. When the 'set' builtin is invoked without options, it does not + 50. When the 'set' builtin is invoked without options, it does not display shell function names and definitions. - 50. When the 'set' builtin is invoked without options, it displays + 51. 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. - 51. When the 'cd' builtin is invoked in logical mode, and the pathname + 52. 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. - 52. When the 'cd' builtin cannot change a directory because the length + 53. 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 all symbolic links are expanded, 'cd' will fail instead of attempting to use only the supplied directory name. - 53. The 'pwd' builtin verifies that the value it prints is the same as + 54. 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. - 54. When listing the history, the 'fc' builtin does not include an + 55. 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'. + 56. The default editor used by 'fc' is 'ed'. - 56. If there are too many arguments supplied to 'fc -s', 'fc' prints + 57. If there are too many arguments supplied to 'fc -s', 'fc' prints an error message and returns failure. - 57. The 'type' and 'command' builtins will not report a non-executable + 58. 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'. - 58. The 'vi' editing mode will invoke the 'vi' editor directly when + 59. The 'vi' editing mode will invoke the 'vi' editor directly when the 'v' command is run, instead of checking '$VISUAL' and '$EDITOR'. - 59. When the 'xpg_echo' option is enabled, Bash does not attempt to + 60. When the 'xpg_echo' option is enabled, Bash does not attempt to interpret any arguments to 'echo' as options. Each argument is displayed, after escape characters are converted. - 60. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' + 61. The 'ulimit' builtin uses a block size of 512 bytes for the '-c' and '-f' options. - 61. The arrival of 'SIGCHLD' when a trap is set on 'SIGCHLD' does not + 62. 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. - 62. The 'read' builtin may be interrupted by a signal for which a trap + 63. 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. The 'printf' builtin uses 'double' (via 'strtod') to convert + 64. 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. - 64. Bash removes an exited background process's status from the list + 65. Bash removes an exited background process's status from the list of such statuses after the 'wait' builtin is used to obtain it. - 65. A double quote character ('"') is treated specially when it + 66. 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. - 66. The 'test' builtin compares strings using the current locale when + 67. The 'test' builtin compares strings using the current locale when processing the '<' and '>' binary operators. - 67. The 'test' builtin's '-t' unary primary requires an argument. + 68. 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. - 68. Command substitutions don't set the '?' special parameter. The + 69. 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 @@ -12969,61 +12976,61 @@ Node: Directory Stack Builtins300765 Node: Controlling the Prompt305025 Node: The Restricted Shell307990 Node: Bash POSIX Mode310600 -Node: Shell Compatibility Mode326857 -Node: Job Control335105 -Node: Job Control Basics335565 -Node: Job Control Builtins340567 -Node: Job Control Variables346362 -Node: Command Line Editing347518 -Node: Introduction and Notation349189 -Node: Readline Interaction350812 -Node: Readline Bare Essentials352003 -Node: Readline Movement Commands353792 -Node: Readline Killing Commands354752 -Node: Readline Arguments356673 -Node: Searching357717 -Node: Readline Init File359903 -Node: Readline Init File Syntax361164 -Node: Conditional Init Constructs385189 -Node: Sample Init File389385 -Node: Bindable Readline Commands392509 -Node: Commands For Moving393713 -Node: Commands For History395764 -Node: Commands For Text400758 -Node: Commands For Killing404736 -Node: Numeric Arguments407440 -Node: Commands For Completion408579 -Node: Keyboard Macros412770 -Node: Miscellaneous Commands413458 -Node: Readline vi Mode419827 -Node: Programmable Completion420734 -Node: Programmable Completion Builtins428514 -Node: A Programmable Completion Example439634 -Node: Using History Interactively444882 -Node: Bash History Facilities445566 -Node: Bash History Builtins448577 -Node: History Interaction453668 -Node: Event Designators457481 -Node: Word Designators459019 -Node: Modifiers460884 -Node: Installing Bash462692 -Node: Basic Installation463829 -Node: Compilers and Options467551 -Node: Compiling For Multiple Architectures468292 -Node: Installation Names469984 -Node: Specifying the System Type472093 -Node: Sharing Defaults472810 -Node: Operation Controls473483 -Node: Optional Features474441 -Node: Reporting Bugs485661 -Node: Major Differences From The Bourne Shell486995 -Node: GNU Free Documentation License503853 -Node: Indexes529030 -Node: Builtin Index529484 -Node: Reserved Word Index536585 -Node: Variable Index539033 -Node: Function Index556167 -Node: Concept Index570026 +Node: Shell Compatibility Mode327245 +Node: Job Control335493 +Node: Job Control Basics335953 +Node: Job Control Builtins340955 +Node: Job Control Variables346750 +Node: Command Line Editing347906 +Node: Introduction and Notation349577 +Node: Readline Interaction351200 +Node: Readline Bare Essentials352391 +Node: Readline Movement Commands354180 +Node: Readline Killing Commands355140 +Node: Readline Arguments357061 +Node: Searching358105 +Node: Readline Init File360291 +Node: Readline Init File Syntax361552 +Node: Conditional Init Constructs385577 +Node: Sample Init File389773 +Node: Bindable Readline Commands392897 +Node: Commands For Moving394101 +Node: Commands For History396152 +Node: Commands For Text401146 +Node: Commands For Killing405124 +Node: Numeric Arguments407828 +Node: Commands For Completion408967 +Node: Keyboard Macros413158 +Node: Miscellaneous Commands413846 +Node: Readline vi Mode420215 +Node: Programmable Completion421122 +Node: Programmable Completion Builtins428902 +Node: A Programmable Completion Example440022 +Node: Using History Interactively445270 +Node: Bash History Facilities445954 +Node: Bash History Builtins448965 +Node: History Interaction454056 +Node: Event Designators457869 +Node: Word Designators459407 +Node: Modifiers461272 +Node: Installing Bash463080 +Node: Basic Installation464217 +Node: Compilers and Options467939 +Node: Compiling For Multiple Architectures468680 +Node: Installation Names470372 +Node: Specifying the System Type472481 +Node: Sharing Defaults473198 +Node: Operation Controls473871 +Node: Optional Features474829 +Node: Reporting Bugs486049 +Node: Major Differences From The Bourne Shell487383 +Node: GNU Free Documentation License504241 +Node: Indexes529418 +Node: Builtin Index529872 +Node: Reserved Word Index536973 +Node: Variable Index539421 +Node: Function Index556555 +Node: Concept Index570414  End Tag Table diff --git a/doc/bashref.log b/doc/bashref.log index fd66d5b2..265a18a0 100644 --- a/doc/bashref.log +++ b/doc/bashref.log @@ -1,12 +1,12 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/MacPorts 2021.58693_0) (preloaded format=pdfetex 2021.8.30) 24 NOV 2023 12:20 +This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/MacPorts 2021.58693_0) (preloaded format=pdfetex 2021.8.30) 30 NOV 2023 08:24 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. %&-line parsing enabled. -**\input /usr/local/src/bash/bash-20231114/doc/bashref.texi \input /usr/local/s -rc/bash/bash-20231114/doc/bashref.texi -(/usr/local/src/bash/bash-20231114/doc/bashref.texi -(/usr/local/src/bash/bash-20231114/doc/texinfo.tex +**\input /usr/local/src/bash/bash-20231124/doc/bashref.texi \input /usr/local/s +rc/bash/bash-20231124/doc/bashref.texi +(/usr/local/src/bash/bash-20231124/doc/bashref.texi +(/usr/local/src/bash/bash-20231124/doc/texinfo.tex Loading texinfo [version 2015-11-22.14]: \outerhsize=\dimen16 \outervsize=\dimen17 @@ -162,15 +162,15 @@ This is `epsf.tex' v2.7.4 <14 February 2011> texinfo.tex: doing @include of version.texi -(/usr/local/src/bash/bash-20231114/doc/version.texi) [1{/opt/local/var/db/texmf +(/usr/local/src/bash/bash-20231124/doc/version.texi) [1{/opt/local/var/db/texmf /fonts/map/pdftex/updmap/pdftex.map}] [2] -(/usr/local/build/bash/bash-20231114/doc/bashref.toc [-1] [-2] [-3]) [-4] -(/usr/local/build/bash/bash-20231114/doc/bashref.toc) -(/usr/local/build/bash/bash-20231114/doc/bashref.toc) Chapter 1 +(/usr/local/build/bash/bash-20231124/doc/bashref.toc [-1] [-2] [-3]) [-4] +(/usr/local/build/bash/bash-20231124/doc/bashref.toc) +(/usr/local/build/bash/bash-20231124/doc/bashref.toc) Chapter 1 \openout0 = `bashref.toc'. -(/usr/local/build/bash/bash-20231114/doc/bashref.aux) +(/usr/local/build/bash/bash-20231124/doc/bashref.aux) \openout1 = `bashref.aux'. Chapter 2 [1] [2] @@ -262,7 +262,7 @@ Overfull \hbox (38.26585pt too wide) in paragraph at lines 5415--5415 [119] [120] texinfo.tex: doing @include of rluser.texi - (/usr/local/src/bash/bash-20231114/lib/readline/doc/rluser.texi + (/usr/local/src/bash/bash-20231124/lib/readline/doc/rluser.texi Chapter 8 [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] Underfull \hbox (badness 7540) in paragraph at lines 878--884 @@ -312,10 +312,10 @@ gnored[] texinfo.tex: doing @include of hsuser.texi -(/usr/local/src/bash/bash-20231114/lib/readline/doc/hsuser.texi Chapter 9 +(/usr/local/src/bash/bash-20231124/lib/readline/doc/hsuser.texi Chapter 9 [158] [159] [160] [161] [162] [163]) Chapter 10 [164] [165] [166] [167] [168] -Underfull \hbox (badness 10000) in paragraph at lines 9759--9768 +Underfull \hbox (badness 10000) in paragraph at lines 9766--9775 []@textrm All of the fol-low-ing op-tions ex-cept for `@texttt alt-array-implem entation[]@textrm '[], @@ -328,7 +328,7 @@ entation[]@textrm '[], .etc. -Underfull \hbox (badness 10000) in paragraph at lines 9759--9768 +Underfull \hbox (badness 10000) in paragraph at lines 9766--9775 @textrm `@texttt disabled-builtins[]@textrm '[], `@texttt direxpand-default[]@t extrm '[], `@texttt strict-posix-default[]@textrm '[], and @@ -344,7 +344,7 @@ extrm '[], `@texttt strict-posix-default[]@textrm '[], and [178] [179] Appendix C [180] texinfo.tex: doing @include of fdl.texi - (/usr/local/src/bash/bash-20231114/doc/fdl.texi + (/usr/local/src/bash/bash-20231124/doc/fdl.texi [181] [182] [183] [184] [185] [186] [187]) Appendix D [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] ) Here is how much of TeX's memory you used: @@ -372,7 +372,7 @@ texlive/fonts/type1/public/amsfonts/cm/cmtt12.pfb> -Output written on bashref.pdf (203 pages, 815170 bytes). +Output written on bashref.pdf (203 pages, 815459 bytes). PDF statistics: 2829 PDF objects out of 2984 (max. 8388607) 2579 compressed objects within 26 object streams diff --git a/doc/bashref.pdf b/doc/bashref.pdf index 1d2b2b76542989f3bbffc3820694b6425e81d2ae..5d250f237fa73eb71c46155820d164c2104923e3 100644 GIT binary patch delta 21334 zcmaf)Q;;Q0u&o=rZQJf?+qOAv+ctLFwr$(fwvB1qHs}0t&dYtf4_`!9WxiBo)QVVH zQG37A)p~(A>bi^76^In^afWjTHrSBl>Jf1y?}ucIp}Z1GK~8|4QFWg;O&u< z1W{w+aNB^=ZmV_{>q?E3QC47|dJXAw1K$fNH-rG27J2lDx5mT)Ww4-=ss(4MidAiO z_TjPKN#W2T0>aPFH}AkFV#9sI`uogwx1ewODJQAyWep~$2a>FsM|n1o0?3_x3A7B~ z3|66~`SJ9b=TYoszL86~wf~i>$*K_S)()kmrj-Xx;_%P!b<>j#y53X z4U1E}RJD*znP%$gMG0N&VXpZ)Kq8Y0@(g7nTt|!IMXaE4Y?m~X$3k*PJR!c_D>0*x z`L&i}+>^s->KT?1oX*@4V8!#-1bCoc=XJ&4$ZCscH4|&zVl(g7An9Y>C3!R(i(Wa; z300_)xI{L}x>Z}E5chp-+_mJBgFy%n6#zF92A8SU&jw7(6Wjbft-^v~w&gC!ejRai z$ZigRtuHRdVSxf>az|wZC$PI9FACme3N@a#cHY%Q7dv9~f#&@R%+6&7WHp}i_TCyR zxFaz#O)Yvx{&jG*SZZT4t%R?0IwWLtD_b&N9n#Y$94sqU-a!ExkHfMX9vt`I6`bJ%>5zAGH;vl+QxiF{9Y zn4s8ZnS9*Z&!l4mthWFrhx$8w)H1%~ATg#MH=iwg}hKzWq>Sd`w1P z#RMqr#eSFIvKrMy1{;TLARS9No$Q#d$Y_{(g$_a%#)04R zLZ+Q=XZ2x{X5qu2KG;!l(H>sziRJ?0V1X5<#K?jVFhCsjHqr)fzn6lRvlS7C9n_k- z=4sH^o^LGx3JX{$ed(w8Jefh;b?w1qkqP|t{H-ysFZwf^u77F}vDwsrb${&(3K_kJ zLR?+dKU#_04qtt=gx2I@v;8Z)bVbLw_(hqdbc@LxRHn!Cdl-9h6H^+v@G)dq-K}Ap$M9 zDD$k)|A7m`JABBE%}{A0mO;wyXacYt2dhUsd)HBXkq&#ZW)oXs=uo$o<8C%KzH96> zR6z~{b{cN=XAKI^z8#*-GC}obKv<&OJ`ebT0`Gt27Z$OX(s*hNiltA?N?^vs(Bgc# z0e#r?o+d-t@cB9sn^ zXxG2-2}RdRFaiu~?`0&&DJmDqn{MYE#4q6Ls^@g6y~-egLNtp_Tjq)b?%P-*vI8vdnDp6;uIHJ?Rt>T~ zx#e!;->(iN1j@B8{vmWd(PGl>01hL!5Q?z(BdqBqe_WWm;aNlJt3iG*-?;vAe=s+0 zWV9-HTSpUZLB(&&je)#z^DBbSYe5M~#6}^&{^H0E-m6Ob`Og{MU zP;Du9cXBQWdjrd8C%}fQKcB7qcs__`@eKnL7!uKi*rL7Mv1?XGjf&&X za1()mQ8A3q`IfCc-WJB?12;WJ)=+#sJyxJ)ppUN&4A!U+LRPvF@$bYqn9Dbz^%ed$ z-y%DnOI}a613F4VfrG=71k_J7jd`e7fis_6^Gy!wG}v!8d*cZPD%ebGoRtqELEpaW zPcvHD&glo=6Z=M>$PYRKl1SDLz=K|&y~mfK;}8B$)(DUrjb*I(4-0q@z6jb7zs>66 zoZ@G!Bm(^8KPdP?M%z;ARkMb)dM2szcRIqmk?)3GhM+T4laDKgHN}DY;>7WFroU4$ z&1%u7@M|gnkE^pyGD?qFaHtV8gd1oQi73l>E=s^vCo(cHhcr&K1B8Cns&=?)44I!s zJeF20)-53PO*`^p<&6h;VA{BBxaHNF81=z!&5L;QVY8B!3F+XpKhz(WR8>lG*(tmg zboI9M!AcU`TqX96>4$-*KwW{*pKD8}*;iFClC#<~9>p?KZ7f;Hg)A&{-Bm9Uq?FMl zfax!!gpmR)d*SaKxR+p^<|Y*WqT=K;v{a~+LCQq@S1(F{6We`a3;Yq0>lrV6m>Fr~ zy+}p&VM#ec)MpS+knKb!6?0nOan3H@i+4ZnX(h^%H0TNWu0WNu8%o41z(yeQEKvx1sSg+553+&2DMNZ*yMXKY*3E;63I zYY+5%KH;#fNj_p#j7VW5WL7aZsfh|vbCoG2+d`$DNnt@rRBEUzKHvNj3E$Dn@NBDz zBD1L}_ox0;WqtCb>YUm9+}B;^jNE=9Kp>dBQ90&%7$?*7GC0NXAXJbCYQ&_>H*J>v z`fRG??W3IYfVf@ceDZsJ;hpQ-1vgQvDi$lf`MYR3o@D@x=7h@lG6IK}=0u8n=t)#g zlCf0J_Nf2q9TrSAS2kYB39j$^PMlLGa(tap$YKLano$^+vOFQtgUejce<0Mc{tVEi z)+U5vV6$`Dt3-2*o$%@f@?xlqH|yoMf5)y5#;g+-+*8D^$t$+}BjB+wyo-o#aW(W1 z3#X924S`f3uR){i+Q30`a4@=rI98G_NiHB*NRnBXqFhvEGRZsB#E(?-EULr#>(|(l z#-?1xs_4O)qHe&Wm*DPWd3MPV7h5;J$=~!W<~PP~dllYhCVrF;OtWje&3;Mj8Y??C z0O9?P{~>@=$8hsM@mD%UAIJZ!iL8;cC}N1GQ%rN-P!@zfU596%IzUYKHth^4PJjMJ z9STuNoKTsI%4w}jI-1A+Ppuzs9J5K}mA)mXeZlpn0Hid&mL22s^s`J%C zUCI>%TE@evaEKTOw6pe^%(xsk)H% z{Rvj`S$T!!wjg1>oPQEj2e_hGXfP5zy$IvA&?CTW7%zhN=S#Kra1yvIbTHAYr5k?fDBp`c*ZRu4c()eQO2l@kpO0zuuxn%x<)#U;w-n(e7rdA?(a z0z)k~zOLti--vsRFP5YD>%k24T$=i_8*`1_Y>Sot8#e&JE<|^7*0q8)k?7O%O~Wa= zyy6uiuT2drPn5W!o(FCG_h-DgPq>razAjA&2uZ$X?s8@`&(=gG*4t9sRx=@3y_|Dt zga)$6B)YuAe#l;htFbwhuBj&K1lQIO)FJwnr-2eMf=%G0>?h*w9|6Qd8YTW^fHS1h zLlo2_rU+z!punxD)_n}PPYEl=t?XoqND4V+z=IZzMK9DVk?MK!i|i_xKY>r|e_iHWDysY4C8H*Z z+vEj-21}t50^gb15e!~B&50MkMdpUoRfzZ;Jsy(*`Ok7!DG$2? z#!{WbJ74*rp~hvLR$>IA5;*)X3yBk+$%zzb3L+)XDZ2m5MCy&nn^;o)PUUFR$#
e!PZ3I~e>wZ<9cRo>v_06+u9 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 delta 21042 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 diff --git a/doc/bashref.texi b/doc/bashref.texi index d9f14da9..9bb039ec 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -8591,6 +8591,13 @@ fatal error if it attempts to unset a @code{readonly} or @code{non-unsettable} variable, or encounters a variable name argument that is an invalid identifier, which causes a non-interactive shell to exit. +@item +When asked to unset a variable that appears in an assignment statement +preceding the command, the @code{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. + @item A non-interactive shell exits with an error status if a variable assignment error occurs when no command name follows the assignment diff --git a/shell.c b/shell.c index e7446053..8f4c34bd 100644 --- a/shell.c +++ b/shell.c @@ -695,6 +695,7 @@ main (int argc, char **argv, char **env) arg_index = bind_args (argv, arg_index, argc, 1); /* $1 ... $n */ /* The startup files are run with `set -e' temporarily disabled. */ + ssh_reading_startup_files = 0; /* paranoia */ if (locally_skip_execution == 0 && running_setuid == 0) { char *t; @@ -1113,7 +1114,7 @@ run_startup_files (void) #if 1 /* TAG:bash-5.3 andrew.gregory.8@gmail.com 2/21/2022 */ /* get the rshd/sshd case out of the way first. */ if (interactive_shell == 0 && no_rc == 0 && login_shell == 0 && - act_like_sh == 0 && command_execution_string) + act_like_sh == 0 && command_execution_string && shell_level < 2) { #ifdef SSH_SOURCE_BASHRC run_by_ssh = (find_variable ("SSH_CLIENT") != (SHELL_VAR *)0) || @@ -1123,6 +1124,7 @@ run_startup_files (void) #endif #endif + ssh_reading_startup_files = 0; /* If we were run by sshd or we think we were run by rshd, execute ~/.bashrc if we are a top-level shell. */ #if 1 /* TAG:bash-5.3 */ diff --git a/tests/varenv.right b/tests/varenv.right index f1af2ab1..c766898c 100644 --- a/tests/varenv.right +++ b/tests/varenv.right @@ -305,6 +305,24 @@ f: 3 global: declare -rx c="3" f1: 4 global: declare -- b="8" +f1: x = local +f2: x = local +after f2: x = global +default after f1: x = global +f1: x = local +f2: x = local +after f2: x = unset +localvar_unset after f1: x = global +f1: x = temp +after f1: x = global +1009: after bash unset: x = global +1009: after posix unset: x = unset +f1: x = local +after unset f1: x = local +1009: after bash f1: x = global +f1: x = local +after unset f1: x = unset +1009: after posix f1: x = global a=z a=b a=z diff --git a/tests/varenv.tests b/tests/varenv.tests index 9a111c1f..587f8312 100644 --- a/tests/varenv.tests +++ b/tests/varenv.tests @@ -261,6 +261,7 @@ ${THIS_SH} ./varenv20.sub ${THIS_SH} ./varenv21.sub ${THIS_SH} ./varenv22.sub ${THIS_SH} ./varenv23.sub +${THIS_SH} ./varenv24.sub # make sure variable scoping is done right tt() { typeset a=b;echo a=$a; };a=z;echo a=$a;tt;echo a=$a diff --git a/tests/varenv24.sub b/tests/varenv24.sub new file mode 100644 index 00000000..272ee4ad --- /dev/null +++ b/tests/varenv24.sub @@ -0,0 +1,102 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# set of tests for posix interp 1009, unset variable in tempenv + +# posix doesn't have local variables, but other shells echo +# +# local local global global +# +# ash-based shells unset local x in f1 after call to f2; we can do this +# with localvar_unset option + +f1() +{ + local x=local + echo $FUNCNAME: x = $x + f2 + echo after f2: x = ${x-unset} +} + +f2() +{ + echo $FUNCNAME: x = $x + unset x +} + +x=global +f1 +echo default after f1: x = $x + +shopt -s localvar_unset +x=global +f1 +echo localvar_unset after f1: x = $x +shopt -u localvar_unset + +unset -f f1 f2 +unset -v x + +# posix says this should echo temp, then global + +f1() +{ + echo $FUNCNAME: x = $x + unset x +} + +x=global +x=temp f1 + +echo after f1: x = $x +unset -f f1 +unset -v x + +# posix says this should echo 'unset' +# interp 1009 + +x=global +x=temp unset x +echo 1009: after bash unset: x = ${x-unset} + +set -o posix +x=global +x=temp unset x +echo 1009: after posix unset: x = ${x-unset} +set +o posix + +unset -v x + +# posix says this should echo local, unset, global + +f1() +{ + local x=local + echo $FUNCNAME: x = $x + x=temp unset x + echo after unset $FUNCNAME: x = ${x-unset} +} + +x=global +f1 +echo 1009: after bash f1: x = $x + +set -o posix +x=global +f1 +echo 1009: after posix f1: x = $x +set +o posix + +unset -f f1 +unset -v x diff --git a/variables.c b/variables.c index 015879af..e54bd14b 100644 --- a/variables.c +++ b/variables.c @@ -3730,6 +3730,47 @@ dispose_variable (SHELL_VAR *var) free (var); } +/* placeholder function to work out the right semantics */ + +/* POSIX interp 1009 says to unset the tempvar variable and unset it at + the previous scope (or the current scope if the variable is a local + var at the current scope). So we destroy the temp var, then call + unbind_variable again with that variable out of the way. We assume this + is called from unset_builtin with the shell in posix mode. */ +int +posix_unbind_tempvar (const char *name) +{ + SHELL_VAR *v; + int r; + + /* We need a way to differentiate between variable assignments preceding + a function and variable assignments preceding a special builtin. + We test the head of the variables chain: shell_variables->flags. If it + contains VC_FUNCENV, this is a temp environment preceding a function + call; if it contains VC_BLTNENV, it's a temp environment preceding a + shell builtin of interest (including unset). So we see if NAME is a + shell variable in a temp environment preceding a special builtin. If + not, we just unset the variable as normal. */ + v = vc_isbltnenv (shell_variables) ? hash_lookup (name, shell_variables->table) : 0; + if (v == 0 || tempvar_p (v) == 0) + return (unbind_variable (name)); + + /* We know NAME is a temporary variable in a temporary environment + preceding a special builtin of interest (unset). */ + /* tempvar variables can't be namerefs, so don't worry about that. */ + r = makunbound (name, shell_variables); + + /* Now that we've removed the temporary variable, we have to implement + the POSIX semantics for assignments preceding a special builtin: + "if an assigned variable is further modified by the utility, the + modifications made by the utility shall persist." So we unset it at + the first previous context where we find it. */ + unbind_variable (name); + + /* Always return the status of unbinding the temporary environment entry. */ + return r; +} + /* Unset the shell variable referenced by NAME. Unsetting a nameref variable unsets the variable it resolves to but leaves the nameref alone. */ int diff --git a/variables.h b/variables.h index 576796e8..29662ab2 100644 --- a/variables.h +++ b/variables.h @@ -46,6 +46,7 @@ typedef struct var_context { #define VC_FUNCENV 0x04 /* also function if name != NULL */ #define VC_BLTNENV 0x08 /* builtin_env */ #define VC_TEMPENV 0x10 /* temporary_env */ +#define VC_SPECTEMPENV 0x20 /* temporary environment preceding a posix special builtin */ #define VC_TEMPFLAGS (VC_FUNCENV|VC_BLTNENV|VC_TEMPENV) @@ -324,6 +325,7 @@ extern SHELL_VAR *bind_var_to_int (const char *, intmax_t, int); extern int assign_in_env (const WORD_DESC *, int); +extern int posix_unbind_tempvar (const char *); extern int unbind_variable (const char *); extern int check_unbind_variable (const char *); extern int unbind_nameref (const char *);