diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog
index 32d653e1..38a53e53 100644
--- a/CWRU/CWRU.chlog
+++ b/CWRU/CWRU.chlog
@@ -13229,3 +13229,35 @@ builtins/shopt.def
doc/bash.1,doc/bashref.texi
- kvpair_split: added description to shopt builtin; added paragraph
to Arrays section describing its effect
+
+ 8/15
+ ----
+configure.ac,version.c
+ - changed the version to bash-5.4-devel and updated the copyright year
+
+
+execute_cmd.c
+ - execute_list: alternate implementation that uses an explicit stack
+ instead of recursion to execute `;' and `\n' separated lists.
+ Depends on NON_RECURSIVE_LISTS define
+
+config-top.h
+ - NON_RECURSIVE_LISTS: define to 1 (at least for now), enabling new
+ non-recursive list execution implementation
+
+ 8/19
+ ----
+subst.c
+ - expand_oneword: if we detect a key-value pair compound assignment
+ as an argument to a declaration command, honor the setting of
+ kvpair_split: expand all the words in the list, then single-quote
+ the result and return that list
+
+ 8/20
+ ----
+shell.c
+ - main: force read_but_dont_execute (-n option) to 0 unless -i
+ (forced_interactive) is supplied at startup. This preserves the
+ `bash -in <<
diff --git a/config-top.h b/config-top.h
index 631c4ef0..85c0fb51 100644
--- a/config-top.h
+++ b/config-top.h
@@ -213,3 +213,7 @@
/* Define to 1 if you want posix mode to restrict shell function names to
shell NAMEs. */
/* #define POSIX_RESTRICT_FUNCNAME 0 */
+
+/* Define to 1 to enable a non-recursive list execution implementation. This
+ replaces recursion with an explicit stack of commands. */
+#define NON_RECURSIVE_LISTS 1
diff --git a/configure b/configure
index 2b2068dc..d22ff01a 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
#! /bin/sh
-# From configure.ac for Bash 5.3, version 5.084.
+# From configure.ac for Bash 5.4, version 5.085.
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for bash 5.3-maint.
+# Generated by GNU Autoconf 2.72 for bash 5.4-devel.
#
# Report bugs to .
#
@@ -605,8 +605,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='bash'
PACKAGE_TARNAME='bash'
-PACKAGE_VERSION='5.3-maint'
-PACKAGE_STRING='bash 5.3-maint'
+PACKAGE_VERSION='5.4-devel'
+PACKAGE_STRING='bash 5.4-devel'
PACKAGE_BUGREPORT='bug-bash@gnu.org'
PACKAGE_URL=''
@@ -1468,7 +1468,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-'configure' configures bash 5.3-maint to adapt to many kinds of systems.
+'configure' configures bash 5.4-devel to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1534,7 +1534,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of bash 5.3-maint:";;
+ short | recursive ) echo "Configuration of bash 5.4-devel:";;
esac
cat <<\_ACEOF
@@ -1742,7 +1742,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-bash configure 5.3-maint
+bash configure 5.4-devel
generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2420,7 +2420,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by bash $as_me 5.3-maint, which was
+It was created by bash $as_me 5.4-devel, which was
generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3218,8 +3218,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_config_headers="$ac_config_headers config.h buildconf.h"
-BASHVERS=5.3
-RELSTATUS=maint
+BASHVERS=5.4
+RELSTATUS=devel
case "$RELSTATUS" in
alp*|bet*|dev*|rc*|releng*|maint*) DEBUG='-DDEBUG' MALLOC_DEBUG='-DMALLOC_DEBUG' ;;
@@ -23943,7 +23943,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by bash $as_me 5.3-maint, which was
+This file was extended by bash $as_me 5.4-devel, which was
generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -24011,7 +24011,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-bash config.status 5.3-maint
+bash config.status 5.4-devel
configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index d8bb22f2..f3245796 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
dnl
-dnl Configure script for bash-5.3
+dnl Configure script for bash-5.4
dnl
dnl report bugs to chet.ramey@case.edu
dnl
@@ -21,10 +21,10 @@ dnl Process this file with autoconf to produce a configure script.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-AC_REVISION([for Bash 5.3, version 5.084])dnl
+AC_REVISION([for Bash 5.4, version 5.085])dnl
-define(bashvers, 5.3)
-define(relstatus, maint)
+define(bashvers, 5.4)
+define(relstatus, devel)
AC_INIT([bash], bashvers-relstatus, [bug-bash@gnu.org])
diff --git a/doc/bash.0 b/doc/bash.0
index d8bdac6b..ed1b9c3c 100644
--- a/doc/bash.0
+++ b/doc/bash.0
@@ -6256,7 +6256,7 @@ SSHHEELLLL BBUUIILLTTIINN CCOOMMMMAANNDDSS
rreeaaddoonnllyy allows the value of a variable to be set at the same time
the readonly attribute is changed by following the variable name
- with =_v_a_l_u_e. This sets the value of the variable is to _v_a_l_u_e while
+ with =_v_a_l_u_e. This sets the value of the variable to _v_a_l_u_e while
modifying the readonly attribute.
The return status is 0 unless an invalid option is encountered, one
@@ -6347,8 +6347,9 @@ SSHHEELLLL BBUUIILLTTIINN CCOOMMMMAANNDDSS
process group. When a background job completes, the shell
prints a line containing its exit status.
--nn Read commands but do not execute them. This may be used to
- check a shell script for syntax errors. This is ignored by
- interactive shells.
+ check a shell script for syntax errors. Interactive shells
+ ignore this option unless it is supplied at invocation along
+ with the --ii option (see IINNVVOOCCAATTIIOONN above).
--oo _o_p_t_i_o_n_-_n_a_m_e
The _o_p_t_i_o_n_-_n_a_m_e can be one of the following:
aalllleexxppoorrtt
@@ -7399,4 +7400,4 @@ BBUUGGSS
Array variables may not (yet) be exported.
-GNU Bash 5.3 2026 August 14 _B_A_S_H(1)
+GNU Bash 5.4 2026 August 20 _B_A_S_H(1)
diff --git a/doc/bash.1 b/doc/bash.1
index 3c16c09a..379b4007 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -5,7 +5,7 @@
.\" Case Western Reserve University
.\" chet.ramey@case.edu
.\"
-.\" Last Change: Fri Aug 14 15:49:37 EDT 2026
+.\" Last Change: Thu Aug 20 11:41:54 EDT 2026
.\"
.\" For bash_builtins, strip all but "SHELL BUILTIN COMMANDS" section
.\" For rbash, strip all but "RESTRICTED SHELL" section
@@ -22,7 +22,7 @@
.ds zX \" empty
.if \n(zZ=1 .ig zZ
.if \n(zY=1 .ig zY
-.TH BASH 1 "2026 August 14" "GNU Bash 5.3"
+.TH BASH 1 "2026 August 20" "GNU Bash 5.4"
.\"
.ie \n(.g \{\
.ds ' \(aq
@@ -424,7 +424,7 @@ if it exists.
.PP
When an interactive shell that is not a login shell is started,
.B bash
-reads and executes commands from
+reads and executes commands from
.FN \*~/.bashrc ,
if that file exists.
The
@@ -1014,7 +1014,7 @@ that is executed, or non-zero if any of the expressions is invalid.
.IP
Use the \fBbreak\fP and \fPcontinue\fP builtins
(see
-.SM
+.SM
.B "SHELL BUILTIN COMMANDS"
below)
to control loop execution.
@@ -3117,7 +3117,7 @@ the number of fractional digits after a decimal point.
A value of 0 causes no decimal point or fraction to be output.
\fBtime\fP prints at most six digits after the decimal point;
values of \fIp\fP greater than 6 are changed to 6.
-If \fIp\fP is not specified,
+If \fIp\fP is not specified,
\fBtime\fP prints three digits after the decimal point.
.IP
The optional \fBl\fP specifies a longer format, including
@@ -3372,7 +3372,7 @@ If the double-quoted expansion occurs within a word, the expansion of
the first parameter is joined with the beginning part of the
expansion of the original word,
and the expansion of the last parameter is joined with the last
-part of the
+part of the
expansion of the original word.
This is analogous to the expansion
of the special parameters \fB*\fP and \fB@\fP (see
@@ -4343,7 +4343,7 @@ If
.I expression
is invalid,
.B bash
-prints a message to standard error indicating failure,
+prints a message to standard error indicating failure,
does not perform the substitution,
and does not
continue to execute the command in which the error occurs.
@@ -6156,7 +6156,7 @@ The shell sends
.B SIGCONT
to stopped jobs to ensure that they receive the
.SM
-.B SIGHUP
+.B SIGHUP
(see
.SM
.B "JOB CONTROL"
@@ -6771,7 +6771,7 @@ When a command is described as \fIkilling\fP text, the text
deleted is saved for possible future retrieval
(\fIyanking\fP).
The killed text is saved in a \fIkill ring\fP.
-Consecutive kills accumulate the deleted text
+Consecutive kills accumulate the deleted text
into one unit, which can be yanked all at once.
Commands which do not kill text separate the chunks of text
on the kill ring.
@@ -7350,7 +7350,7 @@ names begin with a
.Q .
(hidden files) when performing filename completion.
If set to \fBOff\fP, the user must include the leading
-.Q .
+.Q .
in the filename to be completed.
.TP
.B menu\-complete\-display\-prefix (Off)
@@ -7862,12 +7862,12 @@ This performs alias and history expansion,
\fB$\fP\*'\fIstring\fP\*' and \fB$\fP\*"\fIstring\fP\*" quoting,
tilde expansion, parameter and variable expansion, arithmetic expansion,
command and process substitution,
-word splitting, and quote removal
+word splitting, and quote removal
on each word, then quotes the resulting words if necessary to
prevent further expansion.
-An explicit argument suppresses command and process substitution
+An explicit argument suppresses command and process substitution
and quotes each resultant word.
-As usual, double-quoting a word will suppress word splitting.
+As usual, double-quoting a word will suppress word splitting.
This can be useful when combined with suppressing command substitution,
for instance, so the words in the command substitution aren't
quoted individually.
@@ -8449,7 +8449,7 @@ or if there is no compspec for the command word,
the \fB\-D\fP option to \fBcomplete\fP as the default.
If there is no default compspec, \fBbash\fP performs alias expansion
on the command word as a final resort,
-and attempts to find a compspec for the command word
+and attempts to find a compspec for the command word
resulting from any successful expansion.
.PP
If a compspec is not found, \fBbash\fP performs its default completion as
@@ -8562,7 +8562,7 @@ External commands that are invoked to generate completions (
.Q "external completers" )
receive the word preceding the completion word as an argument,
as described above.
-This provides context that is sometimes useful, but may include
+This provides context that is sometimes useful, but may include
information that is considered sensitive or part of a word expansion
that will not appear in the command line after expansion.
That word may be visible in process listings or in audit logs.
@@ -8610,7 +8610,7 @@ to \fBreadline\fP as the list of possible completions.
.PP
If the previously-applied actions do not generate any matches, and the
\fB\-o dirnames\fP option was supplied to \fBcomplete\fP when the
-compspec was defined, \fBbash\fP attempts directory name completion.
+compspec was defined, \fBbash\fP attempts directory name completion.
.PP
If the \fB\-o plusdirs\fP option was supplied to \fBcomplete\fP when the
compspec was defined, \fBbash\fP attempts directory name completion and
@@ -9544,7 +9544,7 @@ If the
.B \-e
option is supplied with
.BR \-P ,
-and \fBcd\fP cannot successfully determine the current working directory
+and \fBcd\fP cannot successfully determine the current working directory
after a successful directory change, it returns a non-zero status.
.IP
On systems that support it, the \fB\-@\fP option presents the extended
@@ -11561,9 +11561,9 @@ The
option displays output in a format that may be reused as input.
.IP
\fBreadonly\fP allows the value of a variable to be set at the same time
-the readonly attribute is changed by following the variable name with
+the readonly attribute is changed by following the variable name with
=\fIvalue\fP.
-This sets the value of the variable is to \fIvalue\fP while modifying
+This sets the value of the variable to \fIvalue\fP while modifying
the readonly attribute.
.IP
The return status is 0 unless an invalid option is encountered,
@@ -11733,7 +11733,14 @@ containing its exit status.
.B \-n
Read commands but do not execute them.
This may be used to check a shell script for syntax errors.
-This is ignored by interactive shells.
+Interactive shells ignore this option unless it is
+supplied at invocation along with the
+.B \-i
+option (see
+.SM
+.B "INVOCATION"
+.ie \n(zZ=1 in \fIbash\fP(1)).
+.el above).
.TP 8
.B \-o \fIoption\-name\fP
The \fIoption\-name\fP can be one of the following:
@@ -12844,7 +12851,7 @@ in a shell function (see
.B "SHELL GRAMMAR"
.ie \n(zZ=1 in \fIbash\fP(1)).
.el above).
-Refer to the description of the \fBextdebug\fP shell option
+Refer to the description of the \fBextdebug\fP shell option
(see
.B shopt
.ie \n(zZ=1 in \fIbash\fP(1))
@@ -12938,7 +12945,7 @@ option is used,
either returns the pathname of the executable file
that would be found by searching
.B $PATH
-for
+for
.I name
or nothing if
.Q "type \-t name"
diff --git a/doc/bash.info b/doc/bash.info
index 0a574ddc..abb3b3fe 100644
--- a/doc/bash.info
+++ b/doc/bash.info
@@ -1,10 +1,10 @@
This is bash.info, produced by makeinfo version 7.3 from bashref.texi.
This text is a brief description of the features that are present in the
-Bash shell (version 5.3, 14 August 2026).
+Bash shell (version 5.4, 20 August 2026).
- This is Edition 5.3, last updated 14 August 2026, of ‘The GNU Bash
-Reference Manual’, for ‘Bash’, Version 5.3.
+ This is Edition 5.4, last updated 20 August 2026, of ‘The GNU Bash
+Reference Manual’, for ‘Bash’, Version 5.4.
Copyright © 1988-2026 Free Software Foundation, Inc.
@@ -26,11 +26,11 @@ Bash Features
*************
This text is a brief description of the features that are present in the
-Bash shell (version 5.3, 14 August 2026). The Bash home page is
+Bash shell (version 5.4, 20 August 2026). The Bash home page is
.
- This is Edition 5.3, last updated 14 August 2026, of ‘The GNU Bash
-Reference Manual’, for ‘Bash’, Version 5.3.
+ This is Edition 5.4, last updated 20 August 2026, of ‘The GNU Bash
+Reference Manual’, for ‘Bash’, Version 5.4.
Bash contains features that appear in other popular shells, and some
features that only appear in Bash. Some of the shells that Bash has
@@ -3638,7 +3638,7 @@ standard.
‘export’ allows the value of a variable to be set at the same time
it is exported or unexported by following the variable name with
- =VALUE. This sets the value of the variable is to VALUE while
+ =VALUE. This sets the value of the variable to VALUE while
modifying the export attribute.
The return status is zero unless an invalid option is supplied, one
@@ -3763,7 +3763,7 @@ standard.
‘readonly’ allows the value of a variable to be set at the same
time the readonly attribute is changed by following the variable
- name with =VALUE. This sets the value of the variable is to VALUE
+ name with =VALUE. This sets the value of the variable to VALUE
while modifying the readonly attribute.
The return status is zero unless an invalid option is supplied, one
@@ -4980,8 +4980,9 @@ parameters, or to display the names and values of shell variables.
‘-n’
Read commands but do not execute them. This may be used to
- check a script for syntax errors. This option is ignored by
- interactive shells.
+ check a script for syntax errors. Interactive shells ignore
+ this option unless it is supplied at invocation along with the
+ ‘-i’ option (*note Invoking Bash::).
‘-o OPTION-NAME’
@@ -13857,85 +13858,85 @@ Node: Signals145047
Node: Shell Scripts149995
Node: Shell Builtin Commands153299
Node: Bourne Shell Builtins155640
-Node: Bash Builtins182359
-Node: Modifying Shell Behavior220094
-Node: The Set Builtin220436
-Node: The Shopt Builtin232468
-Node: Special Builtins250004
-Node: Shell Variables250993
-Node: Bourne Shell Variables251427
-Node: Bash Variables253935
-Node: Bash Features293219
-Node: Invoking Bash294233
-Node: Bash Startup Files301463
-Node: Interactive Shells306823
-Node: What is an Interactive Shell?307231
-Node: Is this Shell Interactive?307893
-Node: Interactive Shell Behavior308717
-Node: Bash Conditional Expressions312478
-Node: Shell Arithmetic317895
-Node: Aliases321222
-Node: Arrays324356
-Node: The Directory Stack332459
-Node: Directory Stack Builtins333256
-Node: Controlling the Prompt337701
-Node: The Restricted Shell340820
-Node: Bash POSIX Mode343913
-Node: Shell Compatibility Mode363872
-Node: Job Control372879
-Node: Job Control Basics373336
-Node: Job Control Builtins379704
-Node: Job Control Variables386492
-Node: Command Line Editing387723
-Node: Introduction and Notation389426
-Node: Readline Interaction391778
-Node: Readline Bare Essentials392966
-Node: Readline Movement Commands394774
-Node: Readline Killing Commands395770
-Node: Readline Arguments397793
-Node: Searching398883
-Node: Readline Init File401126
-Node: Readline Init File Syntax402429
-Node: Conditional Init Constructs429380
-Node: Sample Init File433765
-Node: Bindable Readline Commands436885
-Node: Commands For Moving438423
-Node: Commands For History440887
-Node: Commands For Text447044
-Node: Commands For Killing451169
-Node: Numeric Arguments453957
-Node: Commands For Completion455109
-Node: Keyboard Macros460805
-Node: Miscellaneous Commands461506
-Node: Readline vi Mode469049
-Node: Programmable Completion470026
-Node: Programmable Completion Builtins479762
-Node: A Programmable Completion Example491499
-Node: Using History Interactively496844
-Node: Bash History Facilities497525
-Node: Bash History Builtins501260
-Node: History Interaction508855
-Node: Event Designators513805
-Node: Word Designators515383
-Node: Modifiers517775
-Node: Installing Bash519712
-Node: Basic Installation520828
-Node: Compilers and Options524704
-Node: Compiling For Multiple Architectures525454
-Node: Installation Names527207
-Node: Specifying the System Type529441
-Node: Sharing Defaults530187
-Node: Operation Controls530901
-Node: Optional Features531920
-Node: Reporting Bugs544643
-Node: Major Differences From The Bourne Shell546000
-Node: GNU Free Documentation License567427
-Node: Indexes592604
-Node: Builtin Index593055
-Node: Reserved Word Index600153
-Node: Variable Index602598
-Node: Function Index620011
-Node: Concept Index634436
+Node: Bash Builtins182353
+Node: Modifying Shell Behavior220088
+Node: The Set Builtin220430
+Node: The Shopt Builtin232556
+Node: Special Builtins250092
+Node: Shell Variables251081
+Node: Bourne Shell Variables251515
+Node: Bash Variables254023
+Node: Bash Features293307
+Node: Invoking Bash294321
+Node: Bash Startup Files301551
+Node: Interactive Shells306911
+Node: What is an Interactive Shell?307319
+Node: Is this Shell Interactive?307981
+Node: Interactive Shell Behavior308805
+Node: Bash Conditional Expressions312566
+Node: Shell Arithmetic317983
+Node: Aliases321310
+Node: Arrays324444
+Node: The Directory Stack332547
+Node: Directory Stack Builtins333344
+Node: Controlling the Prompt337789
+Node: The Restricted Shell340908
+Node: Bash POSIX Mode344001
+Node: Shell Compatibility Mode363960
+Node: Job Control372967
+Node: Job Control Basics373424
+Node: Job Control Builtins379792
+Node: Job Control Variables386580
+Node: Command Line Editing387811
+Node: Introduction and Notation389514
+Node: Readline Interaction391866
+Node: Readline Bare Essentials393054
+Node: Readline Movement Commands394862
+Node: Readline Killing Commands395858
+Node: Readline Arguments397881
+Node: Searching398971
+Node: Readline Init File401214
+Node: Readline Init File Syntax402517
+Node: Conditional Init Constructs429468
+Node: Sample Init File433853
+Node: Bindable Readline Commands436973
+Node: Commands For Moving438511
+Node: Commands For History440975
+Node: Commands For Text447132
+Node: Commands For Killing451257
+Node: Numeric Arguments454045
+Node: Commands For Completion455197
+Node: Keyboard Macros460893
+Node: Miscellaneous Commands461594
+Node: Readline vi Mode469137
+Node: Programmable Completion470114
+Node: Programmable Completion Builtins479850
+Node: A Programmable Completion Example491587
+Node: Using History Interactively496932
+Node: Bash History Facilities497613
+Node: Bash History Builtins501348
+Node: History Interaction508943
+Node: Event Designators513893
+Node: Word Designators515471
+Node: Modifiers517863
+Node: Installing Bash519800
+Node: Basic Installation520916
+Node: Compilers and Options524792
+Node: Compiling For Multiple Architectures525542
+Node: Installation Names527295
+Node: Specifying the System Type529529
+Node: Sharing Defaults530275
+Node: Operation Controls530989
+Node: Optional Features532008
+Node: Reporting Bugs544731
+Node: Major Differences From The Bourne Shell546088
+Node: GNU Free Documentation License567515
+Node: Indexes592692
+Node: Builtin Index593143
+Node: Reserved Word Index600241
+Node: Variable Index602686
+Node: Function Index620099
+Node: Concept Index634524
End Tag Table
diff --git a/doc/bashref.info b/doc/bashref.info
index 55309191..7abd609a 100644
--- a/doc/bashref.info
+++ b/doc/bashref.info
@@ -2,10 +2,10 @@ This is bashref.info, produced by makeinfo version 7.3 from
bashref.texi.
This text is a brief description of the features that are present in the
-Bash shell (version 5.3, 14 August 2026).
+Bash shell (version 5.4, 20 August 2026).
- This is Edition 5.3, last updated 14 August 2026, of ‘The GNU Bash
-Reference Manual’, for ‘Bash’, Version 5.3.
+ This is Edition 5.4, last updated 20 August 2026, of ‘The GNU Bash
+Reference Manual’, for ‘Bash’, Version 5.4.
Copyright © 1988-2026 Free Software Foundation, Inc.
@@ -27,11 +27,11 @@ Bash Features
*************
This text is a brief description of the features that are present in the
-Bash shell (version 5.3, 14 August 2026). The Bash home page is
+Bash shell (version 5.4, 20 August 2026). The Bash home page is
.
- This is Edition 5.3, last updated 14 August 2026, of ‘The GNU Bash
-Reference Manual’, for ‘Bash’, Version 5.3.
+ This is Edition 5.4, last updated 20 August 2026, of ‘The GNU Bash
+Reference Manual’, for ‘Bash’, Version 5.4.
Bash contains features that appear in other popular shells, and some
features that only appear in Bash. Some of the shells that Bash has
@@ -3639,7 +3639,7 @@ standard.
‘export’ allows the value of a variable to be set at the same time
it is exported or unexported by following the variable name with
- =VALUE. This sets the value of the variable is to VALUE while
+ =VALUE. This sets the value of the variable to VALUE while
modifying the export attribute.
The return status is zero unless an invalid option is supplied, one
@@ -3764,7 +3764,7 @@ standard.
‘readonly’ allows the value of a variable to be set at the same
time the readonly attribute is changed by following the variable
- name with =VALUE. This sets the value of the variable is to VALUE
+ name with =VALUE. This sets the value of the variable to VALUE
while modifying the readonly attribute.
The return status is zero unless an invalid option is supplied, one
@@ -4981,8 +4981,9 @@ parameters, or to display the names and values of shell variables.
‘-n’
Read commands but do not execute them. This may be used to
- check a script for syntax errors. This option is ignored by
- interactive shells.
+ check a script for syntax errors. Interactive shells ignore
+ this option unless it is supplied at invocation along with the
+ ‘-i’ option (*note Invoking Bash::).
‘-o OPTION-NAME’
@@ -13858,85 +13859,85 @@ Node: Signals145197
Node: Shell Scripts150148
Node: Shell Builtin Commands153455
Node: Bourne Shell Builtins155799
-Node: Bash Builtins182521
-Node: Modifying Shell Behavior220259
-Node: The Set Builtin220604
-Node: The Shopt Builtin232639
-Node: Special Builtins250178
-Node: Shell Variables251170
-Node: Bourne Shell Variables251607
-Node: Bash Variables254118
-Node: Bash Features293405
-Node: Invoking Bash294422
-Node: Bash Startup Files301655
-Node: Interactive Shells307018
-Node: What is an Interactive Shell?307429
-Node: Is this Shell Interactive?308094
-Node: Interactive Shell Behavior308921
-Node: Bash Conditional Expressions312685
-Node: Shell Arithmetic318105
-Node: Aliases321435
-Node: Arrays324572
-Node: The Directory Stack332678
-Node: Directory Stack Builtins333478
-Node: Controlling the Prompt337926
-Node: The Restricted Shell341048
-Node: Bash POSIX Mode344144
-Node: Shell Compatibility Mode364106
-Node: Job Control373116
-Node: Job Control Basics373576
-Node: Job Control Builtins379947
-Node: Job Control Variables386738
-Node: Command Line Editing387972
-Node: Introduction and Notation389678
-Node: Readline Interaction392033
-Node: Readline Bare Essentials393224
-Node: Readline Movement Commands395035
-Node: Readline Killing Commands396034
-Node: Readline Arguments398060
-Node: Searching399153
-Node: Readline Init File401399
-Node: Readline Init File Syntax402705
-Node: Conditional Init Constructs429659
-Node: Sample Init File434047
-Node: Bindable Readline Commands437170
-Node: Commands For Moving438711
-Node: Commands For History441178
-Node: Commands For Text447338
-Node: Commands For Killing451466
-Node: Numeric Arguments454257
-Node: Commands For Completion455412
-Node: Keyboard Macros461111
-Node: Miscellaneous Commands461815
-Node: Readline vi Mode469361
-Node: Programmable Completion470341
-Node: Programmable Completion Builtins480080
-Node: A Programmable Completion Example491820
-Node: Using History Interactively497168
-Node: Bash History Facilities497852
-Node: Bash History Builtins501590
-Node: History Interaction509188
-Node: Event Designators514141
-Node: Word Designators515722
-Node: Modifiers518117
-Node: Installing Bash520057
-Node: Basic Installation521176
-Node: Compilers and Options525055
-Node: Compiling For Multiple Architectures525808
-Node: Installation Names527564
-Node: Specifying the System Type529801
-Node: Sharing Defaults530550
-Node: Operation Controls531267
-Node: Optional Features532289
-Node: Reporting Bugs545015
-Node: Major Differences From The Bourne Shell546375
-Node: GNU Free Documentation License567805
-Node: Indexes592985
-Node: Builtin Index593439
-Node: Reserved Word Index600540
-Node: Variable Index602988
-Node: Function Index620404
-Node: Concept Index634832
+Node: Bash Builtins182515
+Node: Modifying Shell Behavior220253
+Node: The Set Builtin220598
+Node: The Shopt Builtin232727
+Node: Special Builtins250266
+Node: Shell Variables251258
+Node: Bourne Shell Variables251695
+Node: Bash Variables254206
+Node: Bash Features293493
+Node: Invoking Bash294510
+Node: Bash Startup Files301743
+Node: Interactive Shells307106
+Node: What is an Interactive Shell?307517
+Node: Is this Shell Interactive?308182
+Node: Interactive Shell Behavior309009
+Node: Bash Conditional Expressions312773
+Node: Shell Arithmetic318193
+Node: Aliases321523
+Node: Arrays324660
+Node: The Directory Stack332766
+Node: Directory Stack Builtins333566
+Node: Controlling the Prompt338014
+Node: The Restricted Shell341136
+Node: Bash POSIX Mode344232
+Node: Shell Compatibility Mode364194
+Node: Job Control373204
+Node: Job Control Basics373664
+Node: Job Control Builtins380035
+Node: Job Control Variables386826
+Node: Command Line Editing388060
+Node: Introduction and Notation389766
+Node: Readline Interaction392121
+Node: Readline Bare Essentials393312
+Node: Readline Movement Commands395123
+Node: Readline Killing Commands396122
+Node: Readline Arguments398148
+Node: Searching399241
+Node: Readline Init File401487
+Node: Readline Init File Syntax402793
+Node: Conditional Init Constructs429747
+Node: Sample Init File434135
+Node: Bindable Readline Commands437258
+Node: Commands For Moving438799
+Node: Commands For History441266
+Node: Commands For Text447426
+Node: Commands For Killing451554
+Node: Numeric Arguments454345
+Node: Commands For Completion455500
+Node: Keyboard Macros461199
+Node: Miscellaneous Commands461903
+Node: Readline vi Mode469449
+Node: Programmable Completion470429
+Node: Programmable Completion Builtins480168
+Node: A Programmable Completion Example491908
+Node: Using History Interactively497256
+Node: Bash History Facilities497940
+Node: Bash History Builtins501678
+Node: History Interaction509276
+Node: Event Designators514229
+Node: Word Designators515810
+Node: Modifiers518205
+Node: Installing Bash520145
+Node: Basic Installation521264
+Node: Compilers and Options525143
+Node: Compiling For Multiple Architectures525896
+Node: Installation Names527652
+Node: Specifying the System Type529889
+Node: Sharing Defaults530638
+Node: Operation Controls531355
+Node: Optional Features532377
+Node: Reporting Bugs545103
+Node: Major Differences From The Bourne Shell546463
+Node: GNU Free Documentation License567893
+Node: Indexes593073
+Node: Builtin Index593527
+Node: Reserved Word Index600628
+Node: Variable Index603076
+Node: Function Index620492
+Node: Concept Index634920
End Tag Table
diff --git a/doc/bashref.texi b/doc/bashref.texi
index 4574d9b4..ca03ac60 100644
--- a/doc/bashref.texi
+++ b/doc/bashref.texi
@@ -116,7 +116,7 @@ Bash is the shell, or command language interpreter,
for the @sc{gnu} operating system.
The name is an acronym for the @samp{Bourne-Again SHell},
a pun on Stephen Bourne, the author of the direct ancestor of
-the current Unix shell @code{sh},
+the current Unix shell @code{sh},
which appeared in the Seventh Edition Bell Labs Research version
of Unix.
@@ -146,7 +146,7 @@ As a command interpreter, the shell provides the user
interface to the rich set of @sc{gnu} utilities.
The programming language features allow these utilities to be combined.
Users can create files containing commands, and these become
-commands themselves.
+commands themselves.
These new commands have the same status as
system commands in directories such as @file{/bin}, allowing users
or groups to establish custom environments to automate their common
@@ -179,12 +179,12 @@ but they are more convenient to use as builtin commands.
All of the shell builtins are described in subsequent sections.
While executing commands is essential, most of the power (and
-complexity) of shells is due to their embedded programming languages.
+complexity) of shells is due to their embedded programming languages.
Like any high-level language, the shell provides variables,
-flow control constructs, quoting, and functions.
+flow control constructs, quoting, and functions.
Shells offer features geared specifically for
-interactive use rather than to augment the programming language.
+interactive use rather than to augment the programming language.
These interactive features include job control, command line
editing, command history and aliases.
This manual describes how Bash provides all of these features.
@@ -199,7 +199,7 @@ These definitions are used throughout the remainder of this manual.
@cindex POSIX
A family of open system standards based on Unix. Bash
is primarily concerned with the Shell and Utilities portion of the
-@sc{posix} 1003.1 standard.
+@sc{posix} 1003.1 standard.
@item blank
A space or tab character.
@@ -349,7 +349,7 @@ When the shell reads input, it proceeds through a
sequence of operations. If the input indicates the beginning of a
comment, the shell ignores the comment symbol (@samp{#}), and the rest
of that line.
-
+
Otherwise, roughly speaking, the shell reads its input and
divides the input into words and operators, employing the quoting rules
to select which meanings to assign various words and characters.
@@ -557,7 +557,7 @@ been present.
Prefixing a double-quoted string with a dollar sign (@samp{$}), such
as @verb{|$"hello, world"|},
causes the string to be translated according to the current locale.
-The @code{gettext} infrastructure performs the lookup and
+The @code{gettext} infrastructure performs the lookup and
translation, using the @code{LC_MESSAGES}, @code{TEXTDOMAINDIR},
and @code{TEXTDOMAIN} shell variables, as explained below.
See the gettext documentation for additional details not covered here.
@@ -635,7 +635,7 @@ to produce the corresponding MO file.
Once you have the MO files, you decide where to install them and use the
@code{TEXTDOMAINDIR} shell variable to tell the gettext tools where they are.
-Make sure to use the same message domain to name the MO files
+Make sure to use the same message domain to name the MO files
as you did for the PO files when you install them.
@vindex LANG
@@ -918,7 +918,7 @@ the standard input for asynchronous commands,
in the absence of any explicit redirections involving the standard input,
is redirected from @file{/dev/null}.
-Commands separated or terminated by
+Commands separated or terminated by
@samp{;} (or equivalent @code{newline})
are executed sequentially; the shell waits for each
command to terminate in turn.
@@ -1016,7 +1016,7 @@ for (( @var{expr1} ; @var{expr2} ; @var{expr3} )) [;] do @var{commands} ; done
First, evaluate the arithmetic expression @var{expr1} according
to the rules described below (@pxref{Shell Arithmetic}).
Then, repeatedly evaluate the arithmetic expression @var{expr2}
-until it evaluates to zero.
+until it evaluates to zero.
Each time @var{expr2} evaluates to a non-zero value, execute @var{commands}
and evaluate the arithmetic expression @var{expr3}.
If any expression is omitted, it behaves as if it evaluates to 1.
@@ -1054,7 +1054,7 @@ The @var{test-commands} list is executed, and if its return status is zero,
the @var{consequent-commands} list is executed.
If @var{test-commands} returns a non-zero status, each @code{elif} list
is executed in turn, and if its exit status is zero,
-the corresponding @var{more-consequents} is executed and the
+the corresponding @var{more-consequents} is executed and the
command completes.
If @samp{else @var{alternate-consequents}} is present, and
the final command in the final @code{if} or @code{elif} clause
@@ -1130,7 +1130,7 @@ in the next clause, if any, and execute any associated @var{command-list}
if the match succeeds,
continuing the case statement execution as if the pattern list had not matched.
-The return status is zero if no @var{pattern} matches.
+The return status is zero if no @var{pattern} matches.
Otherwise, the return status is the exit status of the
last @var{command-list} executed.
@@ -1189,7 +1189,7 @@ specially and are removed.
Since this can potentially result in empty strings,
this command treats those as expressions that evaluate to 0.
If the value of the expression is non-zero, the return status is 0;
-otherwise the return status is 1.
+otherwise the return status is 1.
@item [[@dots{}]]
@rwindex [[
@@ -1259,7 +1259,7 @@ operators.
For example, the following will match a line
(stored in the shell variable @code{line})
if there is a sequence of characters anywhere in the value consisting of
-any number, including zero, of
+any number, including zero, of
characters in the @code{space} character class,
immediately followed by zero or one instances of @samp{a},
then a @samp{b}:
@@ -1438,7 +1438,7 @@ Placing a list of commands between parentheses forces the shell to create
a subshell (@pxref{Command Execution Environment}), and each
of the commands in @var{list} is executed in that subshell environment.
Since the @var{list} is executed in a subshell, variable assignments do not
-remain in effect after the subshell completes.
+remain in effect after the subshell completes.
@item @{@}
@rwindex @{
@@ -1739,7 +1739,7 @@ func1
@end example
The @code{unset} builtin also acts using the same dynamic scope: if a
-variable is local to the current scope, @code{unset} unsets it;
+variable is local to the current scope, @code{unset} unsets it;
otherwise the unset will refer to the variable found in any calling scope
as described above.
If a variable at the current local scope is unset, it remains so
@@ -1808,12 +1808,12 @@ All @var{value}s undergo tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote
removal (@pxref{Shell Parameter Expansion}).
If the variable has its @code{integer}
-attribute set, then @var{value}
+attribute set, then @var{value}
is evaluated as an arithmetic expression even if the @code{$((@dots{}))}
expansion is not used (@pxref{Arithmetic Expansion}).
Word splitting and filename expansion are not performed.
Assignment statements may also appear as arguments to the
-@code{alias},
+@code{alias},
@code{declare}, @code{typeset}, @code{export}, @code{readonly},
and @code{local} builtin commands (@dfn{declaration commands}).
When in @sc{posix} mode (@pxref{Bash POSIX Mode}), these builtins may appear
@@ -1824,7 +1824,7 @@ For example,
command export var=value
@end example
-In the context where an assignment statement is assigning a value
+In the context where an assignment statement is assigning a value
to a shell variable or array index (@pxref{Arrays}), the
@samp{+=} operator appends to or adds to
the variable's previous value.
@@ -2607,7 +2607,7 @@ key expands to a separate word.
Substitutes the length in characters of the value of @var{parameter}.
If @var{parameter} is @samp{*} or @samp{@@}, the value substituted
is the number of positional parameters.
-If @var{parameter} is an array name subscripted by @samp{*} or @samp{@@},
+If @var{parameter} is an array name subscripted by @samp{*} or @samp{@@},
the value substituted is the number of elements in the array.
If @var{parameter}
is an indexed array name subscripted by a negative number, that number is
@@ -2654,10 +2654,10 @@ is an array variable subscripted with @samp{@@} or @samp{*},
the pattern removal operation is applied to each member of the
array in turn, and the expansion is the resultant list.
-@item $@{@var{parameter}/@var{pattern}/@var{string}@}
-@itemx $@{@var{parameter}//@var{pattern}/@var{string}@}
-@itemx $@{@var{parameter}/#@var{pattern}/@var{string}@}
-@itemx $@{@var{parameter}/%@var{pattern}/@var{string}@}
+@item $@{@var{parameter}/@var{pattern}/@var{string}@}
+@itemx $@{@var{parameter}//@var{pattern}/@var{string}@}
+@itemx $@{@var{parameter}/#@var{pattern}/@var{string}@}
+@itemx $@{@var{parameter}/%@var{pattern}/@var{string}@}
The @var{pattern} is expanded to produce a pattern
and matched against the expanded value of @var{parameter}
as described below (@pxref{Pattern Matching}).
@@ -2748,9 +2748,9 @@ will both output @samp{\abcxyzdef}.
It should rarely be necessary to enclose only @var{string} in double
quotes.
-If the @code{nocasematch} shell option
+If the @code{nocasematch} shell option
(see the description of @code{shopt} in @ref{The Shopt Builtin})
-is enabled, the match is performed without regard to the case
+is enabled, the match is performed without regard to the case
of alphabetic characters.
If @var{parameter} is @samp{@@} or @samp{*},
@@ -2881,7 +2881,7 @@ replaced by the equivalent but faster @code{$(< @var{file})}.
With the old-style backquote form of substitution,
backslash retains its literal meaning except when followed by
-@samp{$}, @samp{`}, or @samp{\}.
+@samp{$}, @samp{`}, or @samp{\}.
The first backquote not preceded by a backslash terminates the
command substitution.
When using the @code{$(@var{command})} form, all characters between
@@ -2907,7 +2907,7 @@ the word without being followed by a shell metacharacter as a reserved
word would usually require.
Any side effects of @var{command} take effect immediately
-in the current execution environment and persist in the current
+in the current execution environment and persist in the current
environment after the command completes (e.g., the @code{exit} builtin
exits the shell).
@@ -2990,7 +2990,7 @@ Since the way Bash handles double quotes
can potentially result in empty strings,
arithmetic expansion treats
those as expressions that evaluate to 0.
-Arithmetic expansions may be nested.
+Arithmetic expansions may be nested.
The evaluation is performed according to the rules listed below
(@pxref{Shell Arithmetic}).
@@ -3006,7 +3006,7 @@ continue to execute the command in which the error occurs.
Process substitution allows a process's input or output to be
referred to using a filename.
-It takes the form of
+It takes the form of
@example
<(@var{list})
@end example
@@ -3018,7 +3018,7 @@ or
@noindent
The process @var{list},
as long as it is not a null command without redirections,
-is run asynchronously, and its input or output
+is run asynchronously, and its input or output
appears as a filename.
This filename is
passed as an argument to the current command as the result of the
@@ -3028,7 +3028,7 @@ If the
@code{>(@var{list})} form is used, writing to the file
provides input for @var{list}.
If the
-@code{<(@var{list})} form is used, reading the file
+@code{<(@var{list})} form is used, reading the file
obtains the output of @var{list}.
Note that no space may appear between the @code{<} or @code{>}
and the left parenthesis, otherwise the construct would be interpreted
@@ -3321,7 +3321,7 @@ If the @code{globskipdots}
shell option is enabled, the filenames
@file{.} and @file{..}
never appear in the set.
-As above, @samp{.} only has a special meaning when matching filenames.
+As above, @samp{.} only has a special meaning when matching filenames.
Complicated extended pattern matching against long strings is slow,
especially when the patterns contain alternations and the strings
@@ -3437,7 +3437,7 @@ the corresponding TCP socket.
@item /dev/udp/@var{host}/@var{port}
If @var{host} is a valid hostname or Internet address, and @var{port}
-is an integer port number or service name, Bash attempts to open
+is an integer port number or service name, Bash attempts to open
the corresponding UDP socket.
@end table
@@ -4111,7 +4111,7 @@ itself (scenario 1 above), for compatibility.
A @dfn{shell script} is a text file containing shell commands.
When such a file is used as the first non-option argument when
invoking Bash, and neither the @option{-c} nor @option{-s} option
-is supplied (@pxref{Invoking Bash}),
+is supplied (@pxref{Invoking Bash}),
Bash reads and executes commands from the file, then exits.
This mode of operation creates a non-interactive shell.
If the filename does not contain any slashes, the shell first searches
@@ -4232,7 +4232,7 @@ All builtins except
@code{:}, @code{true}, @code{false}, @code{echo}, and @code{test}/@code{[}
accept @samp{--help} as a special option.
If @samp{--help} is supplied, these builtins output
-a help message and exit with a status of 0.
+a help message and exit with a status of 0.
@node Bourne Shell Builtins
@section Bourne Shell Builtins
@@ -4337,11 +4337,11 @@ component.
If it is not a valid directory name, @code{cd} returns a non-zero status.
If the @option{-e} option is supplied with @option{-P}
-and @code{cd} cannot successfully determine the current working directory
+and @code{cd} cannot successfully determine the current working directory
after a successful directory change, it returns a non-zero status.
On systems that support it, the @option{-@@} option presents the extended
-attributes associated with a file as a directory.
+attributes associated with a file as a directory.
If @var{directory} is @samp{-}, it is converted to @env{$OLDPWD}
before attempting the directory change.
@@ -4448,7 +4448,7 @@ The @option{-p} option displays output in a form that may be reused as input.
@code{export} allows the value of a variable to be set at the same time
it is exported or unexported by following the variable name with
=@var{value}.
-This sets the value of the variable is to @var{value} while modifying
+This sets the value of the variable to @var{value} while modifying
the export attribute.
The return status is zero unless an invalid option is supplied, one of
@@ -4609,7 +4609,7 @@ option displays output in a format that may be reused as input.
@code{readonly} allows the value of a variable to be set at the same time
the readonly attribute is changed by following the variable name with
=@var{value}.
-This sets the value of the variable is to @var{value} while modifying
+This sets the value of the variable to @var{value} while modifying
the readonly attribute.
The return status is zero unless an invalid option is supplied, one of
@@ -4856,7 +4856,7 @@ If a @var{sigspec} is @code{RETURN}, @var{action} is executed
each time a shell function or a script executed with the @code{.} or
@code{source} builtins finishes executing.
-If a @var{sigspec} is @code{ERR}, @var{action}
+If a @var{sigspec} is @code{ERR}, @var{action}
is executed whenever
a pipeline (which may consist of a single simple
command), a list, or a compound command returns a
@@ -4903,7 +4903,7 @@ Set the shell process's file creation mask to @var{mode}.
If @var{mode} begins with a digit, it is interpreted as an octal number;
if not, it is interpreted as a symbolic mode mask similar
to that accepted by the @code{chmod} command.
-If @var{mode} is omitted, @code{umask} prints the current value of the mask.
+If @var{mode} is omitted, @code{umask} prints the current value of the mask.
If the @option{-S}
option is supplied without a @var{mode} argument, @code{umask}
prints the mask in a symbolic format;
@@ -5172,7 +5172,7 @@ declare [-aAfFgiIlnrtux] [-p] [@var{name}[=@var{value}] @dots{}]
Declare variables and give them attributes.
If no @var{name}s are given, then display the values of variables or
-shell functions instead.
+shell functions instead.
The @option{-p} option will display the attributes and values of each
@var{name}.
@@ -5267,7 +5267,7 @@ as with the @code{local} command, unless the @option{-g} option is supplied.
If a variable name is followed by =@var{value}, the value of the variable
is set to @var{value}.
-When using @option{-a} or @option{-A} and the compound assignment syntax to
+When using @option{-a} or @option{-A} and the compound assignment syntax to
create array variables, additional attributes do not take effect until
subsequent assignments.
@@ -5318,7 +5318,7 @@ form feed
new line
@item \r
carriage return
-@item \t
+@item \t
horizontal tab
@item \v
vertical tab
@@ -5362,7 +5362,7 @@ supplied, print a list of shell builtins.
With no other arguments, the list consists of all enabled shell builtins.
The @option{-n} option means to print only disabled builtins.
The @option{-a} option means to list
-each builtin with an indication of whether or not it is enabled.
+each builtin with an indication of whether or not it is enabled.
The @option{-s} option means to
restrict @code{enable} to the
@sc{posix}
@@ -5422,7 +5422,7 @@ If not, and @var{pattern} exactly matches the name of a help topic,
@code{help} prints the description
associated with that topic.
Otherwise, @code{help} performs prefix matching and
-prints the descriptions of all matching help topics.
+prints the descriptions of all matching help topics.
The return status is zero unless no command matches @var{pattern}.
@@ -5432,7 +5432,7 @@ The return status is zero unless no command matches @var{pattern}.
let @var{expression} [@var{expression} @dots{}]
@end example
-The @code{let} builtin allows arithmetic to be performed on shell variables.
+The @code{let} builtin allows arithmetic to be performed on shell variables.
Each @var{expression} is evaluated as an arithmetic expression
according to the rules given below in @ref{Shell Arithmetic}.
If the last @var{expression} evaluates to 0,
@@ -5583,7 +5583,7 @@ This is an exception to the usual @code{printf} behavior.
@noindent
The %b, %q, and %T format specifiers all use the field width and precision
-arguments from the format specification and write that many bytes from
+arguments from the format specification and write that many bytes from
(or use that wide a field for) the expanded argument, which usually
contains more characters than the original.
@@ -5596,7 +5596,7 @@ any supplied field width and precision in terms of characters, not bytes.
The %S and %C format specifiers are equivalent to %ls and %lc, respectively.
@ignore
-The %s format specifier understands the "altform" flag (#) and behaves
+The %s format specifier understands the "altform" flag (#) and behaves
identically to the %b format specifier if it's supplied.
@end ignore
@@ -5963,7 +5963,7 @@ Aliases are described in @ref{Aliases}.
@node Modifying Shell Behavior
@section Modifying Shell Behavior
-
+
@menu
* The Set Builtin:: Change the values of shell attributes and
positional parameters.
@@ -6068,7 +6068,10 @@ containing its exit status.
@item -n
Read commands but do not execute them.
This may be used to check a script for syntax errors.
-This option is ignored by interactive shells.
+Interactive shells ignore this option unless it is
+supplied at invocation along with the
+@option{-i}
+option (@pxref{Invoking Bash}).
@item -o @var{option-name}
@@ -6361,7 +6364,7 @@ builtins that can perform variable assignments,
and while executing builtins that perform array dereferencing.
@item assoc_expand_once
-Deprecated; a synonym for @code{array_expand_once}.
+Deprecated; a synonym for @code{array_expand_once}.
@item autocd
If set, a command name that is the name of a directory is executed as if
@@ -6402,7 +6405,7 @@ The shell always postpones exiting if any jobs are stopped.
@item checkwinsize
If set, Bash checks the window size after each external (non-builtin)
-command and, if necessary, updates the values of
+command and, if necessary, updates the values of
@env{LINES} and @env{COLUMNS},
using the file descriptor associated with stderr if it is a terminal.
This option is enabled by default.
@@ -6451,7 +6454,7 @@ If not set, Bash attempts to preserve what the user typed.
@item dirspell
If set, Bash
-attempts spelling correction on directory names during word completion
+attempts spelling correction on directory names during word completion
if the directory name initially supplied does not exist.
@item dotglob
@@ -6513,10 +6516,10 @@ If set, enable the extended pattern matching features described above
(@pxref{Pattern Matching}).
@item extquote
-If set, @code{$'@var{string}'} and @code{$"@var{string}"} quoting is
-performed within @code{$@{@var{parameter}@}} expansions
+If set, @code{$'@var{string}'} and @code{$"@var{string}"} quoting is
+performed within @code{$@{@var{parameter}@}} expansions
enclosed in double quotes.
-This option is enabled by default.
+This option is enabled by default.
@item failglob
If set, patterns which fail to match filenames during filename expansion
@@ -6537,7 +6540,7 @@ comparisons.
That is, pattern matching does not take
the current locale's collating sequence into account,
so @samp{b} will not collate between @samp{A} and @samp{B},
-and upper-case and lower-case ASCII characters will collate together.
+and upper-case and lower-case ASCII characters will collate together.
@item globskipdots
If set, filename expansion will never match the filenames
@@ -6739,7 +6742,7 @@ environment after the command completes.
When Bash is not executing in @sc{posix} mode, these builtins behave no
differently than the rest of the Bash builtin commands.
-The Bash @sc{posix} mode is described in @ref{Bash POSIX Mode}.
+The Bash @sc{posix} mode is described in @ref{Bash POSIX Mode}.
These are the @sc{posix} special builtins:
@example
@@ -6850,7 +6853,7 @@ At shell startup, $_ set to the pathname used to invoke the
shell or shell script being executed as passed in the environment
or argument list.
Subsequently, it expands to the last argument to the previous simple
-command executed in the foreground, after expansion.
+command executed in the foreground, after expansion.
It is also set to the full pathname used to invoke each command executed
and placed in the environment exported to that command.
When checking mail, $_ expands to the name of the mail file.
@@ -6989,7 +6992,7 @@ where each corresponding member of @env{FUNCNAME} was invoked.
@code{$@{BASH_LINENO[$i]@}} is the line number in the source file
(@code{$@{BASH_SOURCE[$i+1]@}}) where
@code{$@{FUNCNAME[$i]@}} was called (or @code{$@{BASH_LINENO[$i-1]@}} if
-referenced within another shell function).
+referenced within another shell function).
Use @code{LINENO} to obtain the current line number.
Assignments to @env{BASH_LINENO} have no effect, and it may not be unset.
@@ -7226,7 +7229,7 @@ commands.
Full pathnames in the command hash table are not subject to @code{EXECIGNORE}.
Use this variable to ignore shared library files that have the executable
bit set, but are not executable files.
-The pattern matching honors the setting of the @code{extglob} shell
+The pattern matching honors the setting of the @code{extglob} shell
option.
@item FCEDIT
@@ -7235,7 +7238,7 @@ The editor used as a default by the @code{fc} builtin command.
@item FIGNORE
A colon-separated list of suffixes to ignore when performing
filename completion.
-A filename whose suffix matches one of the entries in
+A filename whose suffix matches one of the entries in
@env{FIGNORE}
is excluded from the list of matched filenames.
A sample value is
@@ -7333,7 +7336,7 @@ and a value of @samp{-} sorts by name in descending order.
Any invalid value restores the historical sorting behavior.
@item GROUPS
-An array variable containing the list of groups of which the current
+An array variable containing the list of groups of which the current
user is a member.
Assignments to @env{GROUPS} have no effect.
If @env{GROUPS}
@@ -7388,7 +7391,7 @@ current line to be removed from the history list before that line
is saved.
Any value not in the above list is ignored.
If @env{HISTCONTROL} is unset, or does not include a valid value,
-Bash saves all lines read by the shell parser on the history list,
+Bash saves all lines read by the shell parser on the history list,
subject to the value of @env{HISTIGNORE}.
If the first line of a multi-line compound command was saved,
the second and subsequent lines are not tested,
@@ -7451,9 +7454,9 @@ option.
@env{HISTIGNORE} subsumes some of the function of @env{HISTCONTROL}.
A pattern of @samp{&} is identical to @code{ignoredups}, and a
-pattern of @samp{[ ]*} is identical to @code{ignorespace}.
+pattern of @samp{[ ]*} is identical to @code{ignorespace}.
Combining these two patterns, separating them with a colon,
-provides the functionality of @code{ignoreboth}.
+provides the functionality of @code{ignoreboth}.
@item HISTSIZE
The maximum number of commands to remember on the history list.
@@ -7481,7 +7484,7 @@ value is changed, Bash adds the contents of the new file to the
existing list.
If @env{HOSTFILE}
is set, but has no value, or does not name a readable file,
-Bash attempts to read
+Bash attempts to read
@file{/etc/hosts}
to obtain the list of possible hostname completions.
When @env{HOSTFILE} is unset,
@@ -7501,7 +7504,7 @@ of consecutive @code{EOF} characters that can be read as the
first character on an input line before Bash exits.
If the variable is set but does not have a numeric value,
or the value is null, then the default is 10.
-If the variable is unset, then @code{EOF} signifies the end of
+If the variable is unset, then @code{EOF} signifies the end of
input to the shell.
This is only in effect for interactive shells.
@@ -7514,7 +7517,7 @@ If Bash finds this variable in the environment when the shell
starts, it assumes that the shell is running in an Emacs shell buffer
and may disable line editing depending on the value of @env{TERM}.
-@item LANG
+@item LANG
Used to determine the locale category for any category not specifically
selected with a variable starting with @code{LC_}.
@@ -7702,7 +7705,7 @@ set to the line read when @code{read} is not supplied a variable name
argument.
@item SECONDS
-This variable expands to the number of seconds since the shell was started.
+This variable expands to the number of seconds since the shell was started.
Assignment to this variable resets the count to the value assigned, and the
expanded value becomes the value assigned plus the number of seconds
since the assignment.
@@ -7754,7 +7757,7 @@ The @samp{%} character introduces an
escape sequence that is expanded to a time value or other
information.
The escape sequences and their meanings are as
-follows; the brackets denote optional portions.
+follows; the brackets denote optional portions.
@table @code
@@ -7762,16 +7765,16 @@ follows; the brackets denote optional portions.
A literal @samp{%}.
@item %[@var{p}][l]R
-The elapsed time in seconds.
+The elapsed time in seconds.
@item %[@var{p}][l]U
-The number of CPU seconds spent in user mode.
+The number of CPU seconds spent in user mode.
@item %[@var{p}][l]S
-The number of CPU seconds spent in system mode.
+The number of CPU seconds spent in system mode.
@item %P
-The CPU percentage, computed as (%U + %S) / %R.
+The CPU percentage, computed as (%U + %S) / %R.
@end table
The optional @var{p} is a digit specifying the precision, the number of
@@ -7784,7 +7787,7 @@ If @var{p} is not specified,
The optional @code{l} specifies a longer format, including minutes, of
the form @var{MM}m@var{SS}.@var{FF}s.
-The value of @var{p} determines whether or not the fraction is included.
+The value of @var{p} determines whether or not the fraction is included.
If this variable is not set, Bash acts as if it had the value
@example
@@ -7857,7 +7860,7 @@ All of the single-character options used with the @code{set} builtin
In addition, there are several multi-character
options that you can use.
These options must appear on the command
-line before the single-character options to be recognized.
+line before the single-character options to be recognized.
@table @code
@item --debugger
@@ -7930,7 +7933,7 @@ invocation which are not available with the @code{set} builtin.
@table @code
@item -c
Read and execute commands from the first non-option argument
-@var{command_string}, then exit.
+@var{command_string}, then exit.
If there are arguments after the @var{command_string},
the first argument is assigned to @code{$0}
and any remaining arguments are assigned to the positional parameters.
@@ -7974,7 +7977,7 @@ This implies the @option{-n} option; no commands will be executed.
@var{shopt_option} is one of the shell options accepted by the
@code{shopt} builtin (@pxref{The Shopt Builtin}).
If @var{shopt_option} is present, @option{-O} sets the value of that option;
-@option{+O} unsets it.
+@option{+O} unsets it.
If @var{shopt_option} is not supplied, Bash
prints the names and values of the shell
options accepted by @code{shopt} on the standard output.
@@ -8022,7 +8025,7 @@ the name of a file containing shell commands (@pxref{Shell Scripts}).
When Bash is invoked in this fashion, @code{$0}
is set to the name of the file, and the positional parameters
are set to the remaining arguments.
-Bash reads and executes commands from this file, then exits.
+Bash reads and executes commands from this file, then exits.
Bash's exit status is the exit status of the last command executed
in the script.
If no commands are executed, the exit status is 0.
@@ -8121,7 +8124,7 @@ filename.
As noted above, if a non-interactive shell is invoked with the
@option{--login} option,
Bash attempts to read and execute commands from the
-login shell startup files.
+login shell startup files.
@subsubheading Invoked with name @code{sh}
@@ -8533,7 +8536,7 @@ True if @var{string1} sorts before @var{string2} lexicographically.
True if @var{string1} sorts after @var{string2} lexicographically.
@item @var{arg1} OP @var{arg2}
-@code{OP} is one of
+@code{OP} is one of
@samp{-eq}, @samp{-ne}, @samp{-lt}, @samp{-le}, @samp{-gt}, or @samp{-ge}.
These arithmetic binary operators return true if @var{arg1}
is equal to, not equal to, less than, less than or equal to,
@@ -8571,7 +8574,7 @@ The operators and their precedence, associativity, and values
are the same as in the C language.
The following list of operators is grouped into levels of
equal-precedence operators.
-The levels are listed in order of decreasing precedence.
+The levels are listed in order of decreasing precedence.
@table @code
@cindex arithmetic operators
@@ -8581,7 +8584,7 @@ The levels are listed in order of decreasing precedence.
@cindex bitwise arithmetic operators
@item @var{id}++ @var{id}--
-variable post-increment and post-decrement
+variable post-increment and post-decrement
@item ++@var{id} --@var{id}
variable pre-increment and pre-decrement
@@ -8636,7 +8639,7 @@ comma
@end table
Shell variables are allowed as operands; parameter expansion is
-performed before the expression is evaluated.
+performed before the expression is evaluated.
Within an expression, shell variables may also be referenced by name
without using the parameter expansion syntax.
This means you can use @var{x},
@@ -8647,7 +8650,7 @@ A shell variable that is unset or null evaluates to 0 when referenced
by name in an expression.
The value of a variable is evaluated as an arithmetic expression
-when it is referenced, or when a variable which has been given the
+when it is referenced, or when a variable which has been given the
@code{integer} attribute using @samp{declare -i} is assigned a value.
A null value evaluates to 0.
A shell variable need not have its @code{integer} attribute enabled
@@ -8690,7 +8693,7 @@ If it matches, the shell
replaces the word with the alias value, and reads that value as if it
had been read instead of the word.
The shell doesn't look at any characters following the word before
-attempting alias substitution.
+attempting alias substitution.
The characters @samp{/}, @samp{$}, @samp{`}, @samp{=} and any of the
shell metacharacters or quoting characters listed above may not appear
@@ -8901,12 +8904,12 @@ expansion of the original word,
and the expansion of the last parameter is joined with the last part of the
expansion of the original word.
This is analogous to the
-expansion of the special parameters @samp{@@} and @samp{*}.
+expansion of the special parameters @samp{@@} and @samp{*}.
@code{$@{#@var{name}[@var{subscript}]@}} expands to the length of
@code{$@{@var{name}[@var{subscript}]@}}.
If @var{subscript} is @samp{@@} or @samp{*},
-the expansion is the number of elements in the array.
+the expansion is the number of elements in the array.
If the @var{subscript}
used to reference an element of an indexed array
@@ -9637,7 +9640,7 @@ falling back to physical mode.
@item
When the @code{cd} builtin cannot change a directory because the
-length of the pathname
+length of the pathname
constructed from @code{$PWD} and the directory name supplied as an argument
exceeds @code{PATH_MAX} when canonicalized, @code{cd} will
attempt to use the supplied directory name.
@@ -9841,7 +9844,7 @@ This section does not mention behavior that is standard for a particular
version (e.g., setting @code{compat32} means that quoting the right hand
side of the regexp
matching operator quotes special regexp characters in the word, which is
-default behavior in bash-3.2 and subsequent versions).
+default behavior in bash-3.2 and subsequent versions).
If a user enables, say, @code{compat32}, it may affect the behavior of other
compatibility levels up to and including the current compatibility level.
@@ -10095,7 +10098,7 @@ of the last process in the pipeline associated with this job is
25647.
All of the processes in a single pipeline are members of
the same job.
-Bash uses the @var{job} abstraction as the basis for job control.
+Bash uses the @var{job} abstraction as the basis for job control.
To facilitate the implementation of the user interface to job control,
each process has a @dfn{process group @sc{id}}, and
@@ -10108,7 +10111,7 @@ Processes that have the same process group ID are said to be part of
the same @dfn{process group}.
Members of the foreground process group (processes whose
process group @sc{id} is equal to the current terminal process group
-@sc{id}) receive keyboard-generated signals such as @code{SIGINT}.
+@sc{id}) receive keyboard-generated signals such as @code{SIGINT}.
Processes in the foreground process group are said to be
foreground processes.
Background processes
@@ -10124,7 +10127,7 @@ The system sends a
signal to background processes which attempt to
read from (write to when @code{tostop} is in effect)
the terminal,
-which, unless caught, suspends the process.
+which, unless caught, suspends the process.
If the operating system on which Bash is running supports
job control, Bash contains facilities to use it.
@@ -10179,7 +10182,7 @@ If there is only a single job, @samp{%+} and @samp{%-} can both be used
to refer to that job.
In output pertaining to jobs (e.g., the output of the @code{jobs}
command), the current job is always marked with a @samp{+}, and the
-previous job with a @samp{-}.
+previous job with a @samp{-}.
Simply naming a job can be used to bring it into the foreground:
@samp{%1} is a synonym for @samp{fg %1}, bringing job 1 from the
@@ -10187,7 +10190,7 @@ background into the foreground.
Similarly, @samp{%1 &} resumes
job 1 in the background, equivalent to @samp{bg %1}.
-The shell learns immediately whenever a job changes state.
+The shell learns immediately whenever a job changes state.
Normally, Bash waits until it is about to print a prompt before
notifying the user about
changes in a job's status so as to not interrupt
@@ -10286,7 +10289,7 @@ Display only stopped jobs.
@end table
If @var{jobspec} is supplied,
-@code{jobs} restricts output to information about that job.
+@code{jobs} restricts output to information about that job.
If @var{jobspec} is not supplied, @code{jobs} lists the status of all jobs.
The return status is zero unless an invalid option is encountered
or an invalid
@@ -10296,7 +10299,7 @@ is supplied.
If the @option{-x} option is supplied, @code{jobs} replaces any
@var{jobspec} found in @var{command} or @var{arguments} with the
corresponding process group @sc{id}, and executes @var{command},
-passing it @var{argument}s, returning its exit status.
+passing it @var{argument}s, returning its exit status.
@item kill
@btindex kill
@@ -10546,18 +10549,18 @@ each directory of the package (the top directory, the
@file{builtins}, @file{doc}, @file{po}, and @file{support} directories,
each directory under @file{lib}, and several others).
It also creates a
-@file{config.h} file containing system-dependent definitions.
+@file{config.h} file containing system-dependent definitions.
Finally, it creates a shell script named @code{config.status} that you
can run in the future to recreate the current configuration, a
file @file{config.cache} that saves the results of its tests to
speed up reconfiguring, and a file @file{config.log} containing
-compiler output (useful mainly for debugging @code{configure}).
+compiler output (useful mainly for debugging @code{configure}).
If at some point
@file{config.cache} contains results you don't want to keep, you
-may remove or edit it.
+may remove or edit it.
To find out more about the options and arguments that the
-@code{configure} script understands, type
+@code{configure} script understands, type
@example
bash-4.2$ ./configure --help
@@ -10681,7 +10684,7 @@ The @env{prefix} variable provides a default for @env{exec_prefix} and
other variables used when installing Bash.
You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.
+architecture-specific files and architecture-independent files.
If you give @code{configure} the option
@option{--exec-prefix=@var{PATH}}, @samp{make install} will use
@var{PATH} as the prefix for installing programs and libraries.
@@ -10730,7 +10733,7 @@ or a canonical name with three fields: @samp{CPU-COMPANY-SYSTEM}
(e.g., @samp{i386-unknown-freebsd4.2}).
See the file @file{support/config.sub} for the possible
-values of each field.
+values of each field.
@node Sharing Defaults
@section Sharing Defaults
@@ -10760,7 +10763,7 @@ operates.
Use and save the results of the tests in
@var{file} instead of @file{./config.cache}.
Set @var{file} to @file{/dev/null} to disable caching,
-for debugging @code{configure}.
+for debugging @code{configure}.
@item --help
Print a summary of the options to @code{configure}, and exit.
@@ -10796,7 +10799,7 @@ To configure Bash without a feature
that is enabled by default, use @option{--disable-@var{feature}}.
Here is a complete list of the @option{--enable-} and @option{--with-}
-options that the Bash @code{configure} recognizes.
+options that the Bash @code{configure} recognizes.
@table @code
@item --with-afs
@@ -10890,7 +10893,7 @@ This could be used to build a version to use as root's shell.
The @samp{minimal-config} option can be used to disable all of
the following options, but it is processed first, so individual
-options may be enabled using @samp{enable-@var{feature}}.
+options may be enabled using @samp{enable-@var{feature}}.
All of the following options except for
@samp{alt-array-implementation},
@@ -11144,7 +11147,7 @@ Please send all reports concerning this manual to
@appendix Major Differences From The Bourne Shell
Bash implements essentially the same grammar, parameter and
-variable expansion, redirection, and quoting as the Bourne Shell.
+variable expansion, redirection, and quoting as the Bourne Shell.
Bash uses the @sc{posix} standard as the specification of
how these features are to be implemented and how they should behave.
There are some
@@ -11435,7 +11438,7 @@ The @samp{>|} redirection operator may be used to override @code{noclobber}.
@item
Variable assignments preceding commands affect only that command, even
builtins and functions (@pxref{Environment}).
-In @code{sh}, all variable assignments
+In @code{sh}, all variable assignments
preceding commands are global unless the command is executed from the
file system.
@@ -11626,7 +11629,7 @@ next child to exit, possibly selecting from a list of supplied jobs,
and the @option{-p} option to store information about a terminated
child process in a shell variable.
-@item
+@item
The SVR4.2 shell behaves differently when invoked as @code{jsh}
(it turns on job control).
diff --git a/doc/builtins.0 b/doc/builtins.0
index 9f200961..96a244d4 100644
--- a/doc/builtins.0
+++ b/doc/builtins.0
@@ -1291,7 +1291,7 @@ BBAASSHH BBUUIILLTTIINN CCOOMMMMAANNDDSS
rreeaaddoonnllyy allows the value of a variable to be set at the same time
the readonly attribute is changed by following the variable name
- with =_v_a_l_u_e. This sets the value of the variable is to _v_a_l_u_e while
+ with =_v_a_l_u_e. This sets the value of the variable to _v_a_l_u_e while
modifying the readonly attribute.
The return status is 0 unless an invalid option is encountered, one
@@ -1382,8 +1382,9 @@ BBAASSHH BBUUIILLTTIINN CCOOMMMMAANNDDSS
rate process group. When a background job completes, the
shell prints a line containing its exit status.
--nn Read commands but do not execute them. This may be used to
- check a shell script for syntax errors. This is ignored by
- interactive shells.
+ check a shell script for syntax errors. Interactive shells
+ ignore this option unless it is supplied at invocation along
+ with the --ii option (see IINNVVOOCCAATTIIOONN in _b_a_s_h(1)).
--oo _o_p_t_i_o_n_-_n_a_m_e
The _o_p_t_i_o_n_-_n_a_m_e can be one of the following:
aalllleexxppoorrtt
@@ -1734,6 +1735,14 @@ BBAASSHH BBUUIILLTTIINN CCOOMMMMAANNDDSS
word and all remaining characters on that line to be ig-
nored, as in a non-interactive shell (see CCOOMMMMEENNTTSS in
_b_a_s_h(1)). This option is enabled by default.
+ kkvvppaaiirr__sspplliitt
+ If set, a compound assignment to an associative array per-
+ forms word expansions, including word splitting, on all
+ words in the assignment before identifying keys and values.
+ If it is unset, each word in the compound assignment list is
+ identified as a key or value before performing the appropri-
+ ate word expansions, and word splitting is not performed.
+ This option is enabled by default.
llaassttppiippee
If set, and job control is not active, the shell runs the
last command of a pipeline not executed in the background in
diff --git a/doc/version.texi b/doc/version.texi
index f1c77dcb..641f82f0 100644
--- a/doc/version.texi
+++ b/doc/version.texi
@@ -2,10 +2,10 @@
Copyright (C) 1988-2026 Free Software Foundation, Inc.
@end ignore
-@set LASTCHANGE Fri Aug 14 15:49:54 EDT 2026
+@set LASTCHANGE Thu Aug 20 11:42:13 EDT 2026
-@set EDITION 5.3
-@set VERSION 5.3
+@set EDITION 5.4
+@set VERSION 5.4
-@set UPDATED 14 August 2026
+@set UPDATED 20 August 2026
@set UPDATED-MONTH August 2026
diff --git a/execute_cmd.c b/execute_cmd.c
index 10c9ec46..b9aea054 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -2850,12 +2850,110 @@ execute_pipeline (COMMAND *command, int asynchronous, int pipe_in, int pipe_out,
return (exec_result);
}
-/* This is a placeholder for future work */
+#if defined (NON_RECURSIVE_LISTS)
+
+#define COMMAND_LIST(t) \
+ ((t)->type == cm_connection && \
+ ((t)->value.Connection->connector == ';' || (t)->value.Connection->connector == '\n'))
+
+/* This takes advantage of how the parser builds command lists. */
+static inline int
+count_nodes (COMMAND *command)
+{
+ int n;
+ COMMAND *t, *prev;
+
+ t = command;
+ n = 0;
+
+ /* This needs to be the same test as when the stack gets created in
+ execute_list() below */
+ while (t && COMMAND_LIST (t))
+ {
+ n++; /* command->second */
+ t = t->value.Connection->first;
+ }
+
+ n++; /* final terminal node (first command) */
+ return n;
+}
+
static int
execute_list (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, struct fd_bitmap *fds_to_close)
{
int ignore_return, invert, exec_result, n;
COMMAND *first, *second;
+ COMMAND **cstack;
+ size_t csind, cssize;
+
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+
+ interrupt_execution++; retain_fifos++;
+ QUIT;
+
+ n = count_nodes (command);
+/*itrace("execute_list: count_nodes returns %d", n);*/
+ csind = cssize = n + 1;
+ cstack = (COMMAND **) xreallocarray (NULL, cssize, sizeof (COMMAND *));
+
+ /* build the stack from the command list */
+ first = command;
+ while (first && COMMAND_LIST (first))
+ {
+ if (ignore_return || invert)
+ {
+ if (first->value.Connection->first)
+ first->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+ if (first->value.Connection->second)
+ first->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+ }
+
+ cstack[--csind] = first->value.Connection->second;
+ first = first->value.Connection->first;
+ }
+
+ /* Now we've hit the first command, and it's not a list connector. Execute it. */
+ exec_result = execute_command (first);
+
+ /* Execute all the list commands except the final one */
+ while (csind < n)
+ {
+ first = cstack[csind++];
+ exec_result = execute_command (first);
+#if defined (JOB_CONTROL)
+ if (job_control && interactive && first->value.Connection->connector == ';')
+ notify_and_cleanup (-1);
+#endif
+ QUIT;
+ }
+
+ /* Now execute the final one, whose exit status matters. */
+
+ second = cstack[csind];
+ if (second == command->value.Connection->second)
+ optimize_connection_fork (command);
+
+ exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);
+
+ free (cstack);
+
+ interrupt_execution--; retain_fifos--;
+ return exec_result;
+}
+
+#else /* !NON_RECURSIVE_LISTS */
+
+/* This is the historical recursive implementation */
+static int
+execute_list (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, struct fd_bitmap *fds_to_close)
+{
+ int ignore_return, invert, exec_result, n;
+ COMMAND *first, *second;
+#if defined (NON_RECURSIVE_LIST)
+ COMMAND **cstack;
+ size_t csind, cssize;
+#endif
ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
invert = (command->flags & CMD_INVERT_RETURN) != 0;
@@ -2888,6 +2986,7 @@ execute_list (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, str
interrupt_execution--; retain_fifos--;
return exec_result;
}
+#endif /* !NON_RECURSIVE_LISTS */
static int
execute_connection (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, struct fd_bitmap *fds_to_close)
diff --git a/lib/readline/doc/readline.3 b/lib/readline/doc/readline.3
index 8e02cba8..b2bfbeda 100644
--- a/lib/readline/doc/readline.3
+++ b/lib/readline/doc/readline.3
@@ -206,7 +206,7 @@ When a command is described as \fIkilling\fP text, the text
deleted is saved for possible future retrieval
(\fIyanking\fP).
The killed text is saved in a \fIkill ring\fP.
-Consecutive kills accumulate the deleted text
+Consecutive kills accumulate the deleted text
into one unit, which can be yanked all at once.
Commands which do not kill text separate the chunks of text
on the kill ring.
@@ -775,7 +775,7 @@ names begin with a
.Q .
(hidden files) when performing filename completion.
If set to \fBOff\fP, the user must include the leading
-.Q .
+.Q .
in the filename to be completed.
.TP
.B menu\-complete\-display\-prefix (Off)
diff --git a/lib/readline/doc/rltech.texi b/lib/readline/doc/rltech.texi
index a4bc7642..2d2336ea 100644
--- a/lib/readline/doc/rltech.texi
+++ b/lib/readline/doc/rltech.texi
@@ -202,9 +202,9 @@ the installed Readline version.
The value is a hexadecimal
encoding of the major and minor version numbers of the library,
of the form 0x@var{MMmm}. @var{MM} is the two-digit major
-version number; @var{mm} is the two-digit minor version number.
+version number; @var{mm} is the two-digit minor version number.
For Readline 4.2, for example, the value of
-@code{RL_READLINE_VERSION} would be @code{0x0402}.
+@code{RL_READLINE_VERSION} would be @code{0x0402}.
@menu
* Readline Typedefs:: C declarations to make code readable.
@@ -353,7 +353,7 @@ to @code{accept-line} and is about to return the line to the caller.
@deftypevar int rl_eof_found
Readline will set this variable when it has read an EOF character
(e.g., the stty @samp{EOF} character) on an empty line
-or has encountered a read error or EOF and
+or has encountered a read error or EOF and
is about to return a NULL line to the caller.
@end deftypevar
@@ -550,7 +550,7 @@ By default, this is set to @code{rl_deprep_terminal}
(@pxref{Terminal Management}).
@end deftypevar
-@deftypevar {void} rl_macro_display_hook
+@deftypevar {void} rl_macro_display_hook
If set, this points to a function that @code{rl_macro_dumper} will call to
display a key sequence bound to a macro.
It is called with the key sequence, the "untranslated" macro value (i.e.,
@@ -562,12 +562,12 @@ prefix to display before the key sequence.
@deftypevar {Keymap} rl_executing_keymap
This variable is set to the keymap (@pxref{Keymaps}) in which the
currently executing Readline function was found.
-@end deftypevar
+@end deftypevar
@deftypevar {Keymap} rl_binding_keymap
This variable is set to the keymap (@pxref{Keymaps}) in which the
last key binding occurred.
-@end deftypevar
+@end deftypevar
@deftypevar {char *} rl_executing_macro
This variable is set to the text of any currently-executing macro.
@@ -1011,7 +1011,7 @@ Print the names of all bindable Readline functions to @code{rl_outstream}.
@deftypefun {const char **} rl_funmap_names (void)
Return a NULL terminated array of known function names.
-The array is sorted.
+The array is sorted.
The array itself is allocated, but not the strings inside.
You should free the array, but not the pointers, using @code{free}
or @code{rl_free} when you are done.
@@ -1043,7 +1043,7 @@ This is done with @code{rl_begin_undo_group()} and
The types of events Readline can undo are:
@smallexample
-enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @};
+enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @};
@end smallexample
Notice that @code{UNDO_DELETE} means to insert some text, and
@@ -1232,7 +1232,7 @@ Replace the contents of @code{rl_line_buffer} with @var{text}.
This preserves the point and mark, if possible.
If @var{clear_undo} is non-zero, this clears the undo list associated
with the current line.
-@end deftypefun
+@end deftypefun
@deftypefun int rl_push_macro_input (char *macro)
Insert @var{macro} into the line, as if it had been invoked
@@ -1341,7 +1341,7 @@ The bindings are performed in @var{kmap}.
Reset the bindings manipulated by @code{rl_tty_set_default_bindings} so
that the terminal editing characters are bound to @code{rl_insert}.
The bindings are performed in @var{kmap}.
-@end deftypefun
+@end deftypefun
@deftypefun int rl_tty_set_echoing (int value)
Set Readline's idea of whether or not it is
@@ -1351,7 +1351,7 @@ Readline does not display output to @var{rl_outstream}; any other
value enables output.
The initial value is set when Readline initializes the terminal settings.
This function returns the previous value.
-@end deftypefun
+@end deftypefun
@deftypefun int rl_reset_terminal (const char *terminal_name)
Reinitialize Readline's idea of the terminal settings using
@@ -1361,31 +1361,31 @@ If @var{terminal_name} is @code{NULL}, Readline uses the value of the
@end deftypefun
@node Utility Functions
-@subsection Utility Functions
+@subsection Utility Functions
@deftypefun int rl_save_state (struct readline_state *sp)
Save a snapshot of Readline's internal state to @var{sp}.
The contents of the @var{readline_state} structure are
documented in @file{readline.h}.
The caller is responsible for allocating the structure.
-@end deftypefun
+@end deftypefun
@deftypefun int rl_restore_state (struct readline_state *sp)
Restore Readline's internal state to that stored in @var{sp},
-which must have been saved by a call to @code{rl_save_state}.
+which must have been saved by a call to @code{rl_save_state}.
The contents of the @var{readline_state} structure are documented in
@file{readline.h}.
-The caller is responsible for freeing the structure.
-@end deftypefun
+The caller is responsible for freeing the structure.
+@end deftypefun
@deftypefun void rl_free (void *mem)
Deallocate the memory pointed to by @var{mem}.
@var{mem} must have been allocated by @code{malloc}.
-@end deftypefun
+@end deftypefun
@deftypefun void rl_extend_line_buffer (int len)
Ensure that @code{rl_line_buffer} has enough space to hold @var{len}
-characters, reallocating it if necessary.
+characters, reallocating it if necessary.
@end deftypefun
@deftypefun int rl_initialize (void)
@@ -1774,7 +1774,7 @@ main (int c, char **v)
sigwinch_received = 0;
@}
if (r < 0)
- continue;
+ continue;
if (FD_ISSET (fileno (rl_instream), &fds))
rl_callback_read_char ();
@@ -1798,11 +1798,11 @@ be sent to the process currently reading input from the keyboard.
Since Readline changes the terminal attributes when it is called, it needs
to perform special processing when such a signal is received in order to
restore the terminal to a sane state, or provide applications using
-Readline with functions to do so manually.
+Readline with functions to do so manually.
Readline contains an internal signal handler that is installed for a
number of signals (@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM},
-@code{SIGHUP},
+@code{SIGHUP},
@code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}).
When Readline receives one of these signals, the signal handler
will reset the terminal attributes to those that were in effect before
@@ -1820,7 +1820,7 @@ the kernel sends to a process whenever the terminal's size changes (for
example, if a user resizes an @code{xterm}).
The Readline @code{SIGWINCH} handler updates
Readline's internal screen size information, and then calls any
-@code{SIGWINCH} signal handler the calling application has installed.
+@code{SIGWINCH} signal handler the calling application has installed.
Readline calls the application's @code{SIGWINCH} signal handler without
resetting the terminal to its original state.
If the application's signal
@@ -1896,7 +1896,7 @@ The default value of @code{rl_change_environment} is 1.
If an application does not wish to have Readline catch any signals, or
to handle signals other than those Readline catches (@code{SIGHUP},
-for example),
+for example),
Readline provides convenience functions to do the necessary terminal
and internal state cleanup upon receipt of a signal.
@@ -1943,7 +1943,7 @@ to determine whether or not there are any pending signals.
@end deftypefun
If an application does not wish Readline to catch @code{SIGWINCH},
-it may call @code{rl_resize_terminal()} or @code{rl_set_screen_size()}
+it may call @code{rl_resize_terminal()} or @code{rl_set_screen_size()}
to force Readline to update its idea of the terminal size when it receives
a @code{SIGWINCH}.
@@ -2223,7 +2223,7 @@ characters from a filename before attempting completion,
so those characters do not interfere with matching the text against
names in the filesystem.
It is called with @var{text}, the text of the word
-to be dequoted, and @var{quote_char}, which is the quoting character
+to be dequoted, and @var{quote_char}, which is the quoting character
that delimits the filename (usually @samp{'} or @samp{"}).
If @var{quote_char} is zero, the filename was not in a quoted string.
@end deftypevar
@@ -2420,7 +2420,7 @@ that possible-completions will display unconditionally.
If there are more possible completions than this,
Readline asks the user for confirmation before displaying them.
The default value is 100.
-A negative value
+A negative value
indicates that Readline should never ask for confirmation.
@end deftypevar
@@ -2500,7 +2500,7 @@ characters in @code{rl_filename_quote_characters} and
@end deftypevar
@deftypevar int rl_filename_quoting_desired
-A non-zero value means that Readline should quote the results of the
+A non-zero value means that Readline should quote the results of the
matches using double quotes (or an application-specific quoting mechanism)
if the completed filename contains any characters in
@code{rl_filename_quote_chars}.
@@ -2769,7 +2769,7 @@ stripwhite (char *string)
for (s = string; whitespace (*s); s++)
;
-
+
if (*s == 0)
return (s);
diff --git a/lib/readline/doc/rluser.texi b/lib/readline/doc/rluser.texi
index a376c267..35f1575a 100644
--- a/lib/readline/doc/rluser.texi
+++ b/lib/readline/doc/rluser.texi
@@ -57,7 +57,7 @@ By default, the line editing commands are similar to those of Emacs;
a vi-style line editing interface is also available.
Line editing can be enabled at any time using the @option{-o emacs} or
@option{-o vi} options to the @code{set} builtin command
-(@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or
+(@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or
@option{+o vi} options to @code{set}.
@end ifset
@@ -637,9 +637,9 @@ When this variable is set to @samp{On}, Readline allows certain commands
to designate the region as @dfn{active}.
When the region is active, Readline highlights the text in the region using
the value of the @code{active-region-start-color}, which defaults to the
-string that enables the terminal's standout mode.
+string that enables the terminal's standout mode.
The active region shows the text inserted by bracketed-paste and any
-matching text found by incremental and non-incremental history searches.
+matching text found by incremental and non-incremental history searches.
The default is @samp{On}.
@item enable-bracketed-paste
@@ -650,7 +650,7 @@ of treating each character as if it had been read from the keyboard.
This is called putting the terminal into @dfn{bracketed paste mode};
it prevents Readline from executing any editing commands bound
to key sequences appearing in the pasted text.
-The default is @samp{On}.
+The default is @samp{On}.
@item enable-keypad
@vindex enable-keypad
@@ -858,7 +858,7 @@ The default value is @samp{off}.
@item show-all-if-ambiguous
@vindex show-all-if-ambiguous
This alters the default behavior of the completion functions.
-If set to @samp{on},
+If set to @samp{on},
words which have more than one possible completion cause the
matches to be listed immediately instead of ringing the bell.
The default value is @samp{off}.
@@ -867,7 +867,7 @@ The default value is @samp{off}.
@vindex show-all-if-unmodified
This alters the default behavior of the completion functions in
a fashion similar to @var{show-all-if-ambiguous}.
-If set to @samp{on},
+If set to @samp{on},
words which have more than one possible completion without any
possible partial completion (the possible completions don't share
a common prefix) cause the matches to be listed immediately instead
@@ -1138,7 +1138,7 @@ The @var{application} construct is used to include
application-specific settings.
Each program using the Readline
library sets the @var{application name}, and you can test for
-a particular value.
+a particular value.
This could be used to bind key sequences to functions useful for
a specific program.
For instance, the following command adds a
@@ -1208,7 +1208,7 @@ $include /etc/Inputrc
#
# Set various bindings for emacs mode.
-set editing-mode emacs
+set editing-mode emacs
$if mode=emacs
@@ -2186,7 +2186,7 @@ for a command or an argument to a command for which a
completion specification (a @dfn{compspec}) has been defined
using the @code{complete} builtin
(@pxref{Programmable Completion Builtins}),
-Readline invokes the programmable completion facilities.
+Readline invokes the programmable completion facilities.
First, Bash identifies the command name.
If a compspec has been defined for that command, the
@@ -2231,7 +2231,7 @@ specified by a pathname expansion pattern
supplied as an argument to the
@option{-G} option.
The words generated by the pattern need not match the word being completed.
-Bash uses the @env{FIGNORE}
+Bash uses the @env{FIGNORE}
variable to filter the matches, but does not use the
@env{GLOBIGNORE} shell variable.
@@ -2275,7 +2275,7 @@ are being completed,
the second argument ($2) is the word being completed,
and the third argument ($3) is the word preceding the word being
completed on the current command line.
-There is no filtering of the generated completions against the
+There is no filtering of the generated completions against the
word being completed;
the function or command has complete freedom in generating the matches
and they do not need to match a prefix of the word.
@@ -2338,7 +2338,7 @@ to Readline as the list of possible completions.
If the previously-applied actions do not generate any matches, and the
@option{-o dirnames} option was supplied to @code{complete} when the
-compspec was defined, Bash attempts directory name completion.
+compspec was defined, Bash attempts directory name completion.
If the @option{-o plusdirs} option was supplied to @code{complete} when
the compspec was defined, Bash attempts directory name completion
@@ -2465,7 +2465,7 @@ The @option{-D} option indicates that other supplied options and actions should
apply to the ``default'' command completion; that is, completion attempted
on a command for which no completion has previously been defined.
The @option{-E} option indicates that other supplied options and actions should
-apply to ``empty'' command completion; that is, completion attempted on a
+apply to ``empty'' command completion; that is, completion attempted on a
blank line.
The @option{-I} option indicates that other supplied options and actions should
apply to completion on the initial non-assignment word on the line, or after a
@@ -2490,7 +2490,7 @@ should be quoted to protect them from expansion before the
@item -o @var{comp-option}
The @var{comp-option} controls several aspects of the compspec's behavior
beyond the simple generation of completions.
-@var{comp-option} may be one of:
+@var{comp-option} may be one of:
@table @code
@@ -2528,7 +2528,7 @@ Tell Readline not to append a space (the default) to words completed at
the end of the line.
@item plusdirs
-After generating any matches defined by the compspec,
+After generating any matches defined by the compspec,
attempt directory name completion and add any
matches to the results of the other actions.
@end table
diff --git a/shell.c b/shell.c
index a136e0ab..2ba5f074 100644
--- a/shell.c
+++ b/shell.c
@@ -672,10 +672,10 @@ main (int argc, char **argv, char **env)
}
else
{
- change_flag ('i', FLAG_ON);
- interactive = 1;
if (forced_interactive == 0)
read_but_dont_execute = 0;
+ change_flag ('i', FLAG_ON);
+ interactive = 1;
}
#if defined (RESTRICTED_SHELL)
diff --git a/subst.c b/subst.c
index f22a553f..bad681aa 100644
--- a/subst.c
+++ b/subst.c
@@ -13236,6 +13236,17 @@ expand_oneword (char *value, int atype)
#if ASSOC_KVPAIR_ASSIGNMENT
kvpair = kvpair_assignment_p (l);
#endif
+#if ASSOC_KVPAIR_ASSIGNMENT
+ /* If we want to split all the words in a kvpair assignment, expand
+ every word, then single-quote the words in the resulting list, and
+ return that. */
+ if (kvpair && split_kvpair_assignments)
+ {
+ nl = l ? expand_words_no_vars (l) : l; /* same as arrayfunc.c:assign_assoc_from_kvlist() */
+ quote_compound_array_list (nl, atype);
+ return (nl);
+ }
+#endif
/* For associative arrays, with their arbitrary subscripts, we have to
expand and quote in one step so we don't have to search for the
@@ -13244,7 +13255,8 @@ expand_oneword (char *value, int atype)
{
#if ASSOC_KVPAIR_ASSIGNMENT
if (kvpair)
- /* keys and values undergo the same set of expansions */
+ /* keys and values undergo the same set of expansions if we are
+ not splitting each word in NL. */
t = expand_and_quote_kvpair_word (nl->word->word);
else
#endif
diff --git a/tests/assoc.right b/tests/assoc.right
index 9a407b6a..f0c3df7f 100644
--- a/tests/assoc.right
+++ b/tests/assoc.right
@@ -275,13 +275,13 @@ declare -A a=([")"]="rparen" ["\""]="dquote" ["]"]="rbracket" ["\\"]="bs" )
declare -Arx foo=([two]="2" [three]="3" [one]="1" )
./assoc11.sub: line 90: foo: readonly variable
assoc12.sub
-declare -A v1=(["1 2"]="3" )
+declare -A v1=([3]="" [1]="2" )
declare -A v2=(["1 2"]="3" )
declare -A v3=([3]="" [1]="2" )
-declare -A v1=(["1 2"]="3 4 5" )
+declare -A v1=([5]="" [3]="4" [1]="2" )
declare -A v2=(["1 2"]="3 4 5" )
declare -A v3=([5]="" [3]="4" [1]="2" )
-declare -A v1=(["1 2"]="3 4 5" )
+declare -A v1=([4]="5" ["1 2"]="3" )
declare -A v2=(["1 2"]="3 4 5" )
declare -A v3=([4]="5" ["1 2"]="3" )
declare -A v1=(["1 2"]="3 4 5" )
@@ -293,6 +293,10 @@ declare -A v3=(["1 2"]="3 4 5" ["\$xtra"]="xtra" )
declare -A v1=([80]="xtra" ["20 40 80"]="new xtra" ["1 2"]="3 4 5" [20]="40" )
declare -A v2=(["20 40 80"]="new xtra" ["1 2"]="3 4 5" )
declare -A v3=(["1 2"]="3 4 5" ["\$xtra"]="new xtra" )
+declare -A assoc=([four]="4" [two]="2" [three]="3" [one]="1" [zero]="0" )
+declare -A assoc=([four]="4" [two]="2" [three]="3" [one]="1" [zero]="0" )
+declare -A copy=([four]="4" [two]="2" [three]="3" [one]="1" [zero]="0" )
+declare -A copy=([four]="4" [two]="2" [three]="3" [one]="1" [zero]="0" )
assoc13.sub
declare -A assoc=(["*"]="star" ["!"]="bang" ["@"]="at" )
at
diff --git a/tests/assoc12.sub b/tests/assoc12.sub
index 359dc0b3..57355afd 100644
--- a/tests/assoc12.sub
+++ b/tests/assoc12.sub
@@ -15,25 +15,25 @@ foo='1 2'
bar='3 4 5'
xtra='20 40 80'
-declare -A v1=( $foo 3 )
+declare -A v1=( $foo 3 ) # unquoted expansions are now split
declare -p v1
-declare -A v2=( [$foo]=3 )
+declare -A v2=( [$foo]=3 ) # but subscripts are not
declare -p v2
-declare -A v3
-v3=( $foo 3 )
+declare -A v3
+v3=( $foo 3 ) # declaration commands and assignments are identical
declare -p v3
unset v1 v2 v3
-declare -A v1=( $foo $bar )
+declare -A v1=( $foo $bar ) # unquoted expansions are split
declare -p v1
declare -A v2=( [$foo]=$bar )
declare -p v2
-declare -A v3
+declare -A v3
v3=( $foo $bar )
declare -p v3
@@ -45,7 +45,7 @@ declare -p v1
declare -A v2=( ["$foo"]=$bar )
declare -p v2
-declare -A v3
+declare -A v3
v3=( "$foo" $bar )
declare -p v3
@@ -57,7 +57,7 @@ declare -p v1
declare -A v2=( ["$foo"]="$bar" )
declare -p v2
-declare -A v3
+declare -A v3
v3=( "$foo" "$bar" )
declare -p v3
@@ -72,3 +72,31 @@ v2+=( ["$xtra"]='new xtra' )
v3+=( ['$xtra']='new xtra' )
declare -p v1 v2 v3
+
+unset v1 v2 v3
+
+# we can now copy arrays from an array of key-value pairs or by generating
+# a list of key-value pairs
+declare -a kv=(zero 0 one 1 two 2 three 3 four 4)
+
+# assign associative array from an array of key-value pairs
+declare -A assoc
+assoc=( "${kv[@]}" )
+declare -p assoc
+unset assoc
+
+# do the same thing using a declaration command
+declare -A assoc=( "${kv[@]}" )
+declare -p assoc
+
+# copy an associative array using key-value pairs
+declare -A copy
+copy=( "${assoc[@]@k}" )
+declare -p copy
+unset copy
+
+# do the same thing using a declaration command
+declare -A copy=( "${assoc[@]@k}" )
+declare -p copy
+
+
diff --git a/tests/builtins.right b/tests/builtins.right
index 362ce011..b7a42dbe 100644
--- a/tests/builtins.right
+++ b/tests/builtins.right
@@ -447,7 +447,7 @@ SEE ALSO
bash(1)
IMPLEMENTATION
- Copyright (C) 2025 Free Software Foundation, Inc.
+ Copyright (C) 2026 Free Software Foundation, Inc.
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
diff --git a/tests/history.right b/tests/history.right
index 47687e72..567a0625 100644
--- a/tests/history.right
+++ b/tests/history.right
@@ -144,9 +144,9 @@ three
(exit 42)
42
history2.sub
-5.3
+5.4
echo ${BASH_VERSION%\.*}
-5.3
+5.4
echo ${BASH_VERSION%\.*}
history3.sub
a
diff --git a/tests/new-exp.right b/tests/new-exp.right
index 6e059618..4843faad 100644
--- a/tests/new-exp.right
+++ b/tests/new-exp.right
@@ -670,7 +670,7 @@ A
declare -A foo
LOWER
Lower
-argv[1] =
+argv[1] =
argv[1] = <~$ >
argv[1] = <^A[0]~$ >
argv[1] = <^A^G^B[0:1]~\$ >
@@ -826,26 +826,26 @@ otwone
new-exp17.sub
unquoted word expansion with quoted pattern and replacement
4.2: 4.2, a < b
-5.3: 4.2, a < b
-5.3: 5.2, a < b
+5.4: 4.2, a < b
+5.4: 5.2, a < b
double-quoted word expansion with quoted pattern and replacement
4.2: 4.2, a '<' b
-5.3: 4.2, a '<' b
-5.3: 5.2, a < b
+5.4: 4.2, a '<' b
+5.4: 5.2, a < b
unquoted word expansion with unquoted pattern and replacement
4.2: 4.2, a < b
-5.3: 4.2, a \n");
/* If == 31, shell compatible with bash-3.1, == 32 with bash-3.2, and so on */