From: Chet Ramey Date: Fri, 30 Jan 2026 21:43:46 +0000 (-0500) Subject: change `read -d' on a tty when the delimiter is not a newline to set the terminal... X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=468e98e574c182a4c5cee6ae63eb124907bfce16;p=thirdparty%2Fbash.git change `read -d' on a tty when the delimiter is not a newline to set the terminal EOL character instead of putting the terminal into character-at-a-time mode; change some calls to atoi to use strol instead --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 17d982b04..d6aaa5cfe 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -12619,3 +12619,52 @@ subst.c lib/sh/shtty.c,include/shtty.h - ttseteol, ttfd_seteol, tt_seteol: new functions to set the tty's EOL character to something other than a newline + +builtins/read.def + - read_builtin: if the `-d' option is supplied, neither `-n' nor `-N' + is supplied, and the input is a tty, use tt_seteol to set the tty + end-of-input-line delimiter to whatever the option argument is. This + means we don't put the terminal into non-canonical mode and only + issue one read(2) call. This also means that the normal canonical + input processing (erase char, erase line, etc.) takes place. This + will have to be revisited if the -d option is ever extended to + multibyte characters. The behavior of a delimiter character that + can appear as part of a multibyte character in some non-UTF-8 + locale needs to be tested as well. + - read_mbchar: handle unbuffered_read == 3 (read -d on a tty) + From a suggestion by Robert Elz back in 9/2025 + + 1/29 + ---- +general.c + - default_columns: use strtol and check the return values instead of + using atoi on $COLUMNS + +variables.c + - sv_optind: use strtol and check the return values instead of using + atoi on $OPTIND. This means that setting OPTIND to a non-numeric + value is a no-op + - sv_opterr: use strtol and check the return values instead of using + atoi on $OPTERR. This means that setting OPTERR to a non-numeric + value sets sh_opterr to the default (1) + - sv_childmax: use strtol instead of atoi to convert $MAXCHILD. This + means a conversion error is the same as 0 + +eval.c + - read_command: use strtol and check the return values instead of using + atoi on $TMOUT. This means that setting TMOUT to a non-numeric + value is a no-op + +builtins/fc.def + - fc_gethnum: use strtol instead of using atoi on the numeric argument + + 1/30 + ---- +array.c,array2.c + - array_subslice: return a string with the elements of an array between + specified start and end indices, inclusive. A variant of + array_subrange, but does not return a specified number of elements. + Not used yet, but could be used for another array parameter + expansion, like ksh93's array[s..e] + + diff --git a/array.c b/array.c index dbfe90968..54a80268b 100644 --- a/array.c +++ b/array.c @@ -9,7 +9,7 @@ * chet@ins.cwru.edu */ -/* Copyright (C) 1997-2023 Free Software Foundation, Inc. +/* Copyright (C) 1997-2026 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -415,6 +415,48 @@ array_subrange (ARRAY *a, arrayind_t start, arrayind_t nelem, int starsub, int q return t; } +char * +array_subslice (ARRAY *a, arrayind_t start, arrayind_t end, int starsub, int quoted, int pflags) +{ + ARRAY *a2; + ARRAY_ELEMENT *h, *p; + arrayind_t i; + char *t; + WORD_LIST *wl; + + p = a ? array_head (a) : 0; + if (p == 0 || array_empty (a) || start > array_max_index(a)) + return ((char *)NULL); + + /* + * Find element with index START. If START corresponds to an unset + * element (arrays can be sparse), use the first element whose index + * is >= START. If START is < 0, we count START indices back from + * the end of A (not elements, even with sparse arrays -- START is an + * index). + */ + for (p = element_forw(p); p != array_head(a) && start > element_index(p); p = element_forw(p)) + ; + + if (p == a->head) + return ((char *)NULL); + + /* Starting at P, find END. */ + for (i = element_index(p), h = p; p != a->head && end > element_index(p); p = element_forw(p)) + ; + + a2 = array_slice(a, h, p); + + wl = array_to_word_list(a2); + array_dispose(a2); + if (wl == 0) + return (char *)NULL; + t = string_list_pos_params(starsub ? '*' : '@', wl, quoted, pflags); /* XXX */ + dispose_words(wl); + + return t; +} + char * array_patsub (ARRAY *a, char *pat, char *rep, int mflags) { diff --git a/array.h b/array.h index 47712e88a..472bac3ab 100644 --- a/array.h +++ b/array.h @@ -87,6 +87,7 @@ extern ARRAY *array_dequote_escapes (ARRAY *); extern ARRAY *array_remove_quoted_nulls (ARRAY *); extern char *array_subrange (ARRAY *, arrayind_t, arrayind_t, int, int, int); +extern char *array_subslice (ARRAY *, arrayind_t, arrayind_t, int, int, int); extern char *array_patsub (ARRAY *, char *, char *, int); extern char *array_modcase (ARRAY *, char *, int, int); diff --git a/array2.c b/array2.c index 49745cc95..08f0f2b8b 100644 --- a/array2.c +++ b/array2.c @@ -9,7 +9,7 @@ * chet@ins.cwru.edu */ -/* Copyright (C) 1997-2023 Free Software Foundation, Inc. +/* Copyright (C) 1997-2026 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -47,6 +47,13 @@ #define ARRAY_MAX_DOUBLE 16777216 +#ifndef amin +# define amin(a, b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef amax +# define amax(a, b) ((a) > (b) ? (a) : (b)) +#endif + static ARRAY_ELEMENT **array_copy_elements (ARRAY *); static char *array_to_string_internal (ARRAY *, arrayind_t, arrayind_t, char *, int); @@ -535,6 +542,48 @@ array_subrange (ARRAY *a, arrayind_t start, arrayind_t nelem, int starsub, int q return t; } +char * +array_subslice (ARRAY *a, arrayind_t start, arrayind_t end, int starsub, int quoted, int pflags) +{ + ARRAY *a2; + arrayind_t s, e; + int i; + char *t; + WORD_LIST *wl; + + if (array_empty (a) || start > array_max_index(a)) + return ((char *)NULL); + + /* + * Find element with index START. If START corresponds to an unset + * element (arrays can be sparse), use the first element whose index + * is >= START. If START is < 0, we count START indices back from + * the end of A (not elements, even with sparse arrays -- START is an + * index). + */ + for (s = start; s <= a->max_index && a->elements[s] == 0; s++) + ; + + if (s > a->max_index) + return ((char *)NULL); + + /* Find the element with index END. If END corresponds to an unset + element, use the first element whose index is <= END. If END is + greater than max_index, use max_index*/ + for (e = amin(end, a->max_index); e >= 0 && a->elements[e] == 0; e--) + ; + a2 = array_slice(a, s, e); + + wl = array_to_word_list(a2); + array_dispose(a2); + if (wl == 0) + return (char *)NULL; + t = string_list_pos_params(starsub ? '*' : '@', wl, quoted, pflags); /* XXX */ + dispose_words(wl); + + return t; +} + char * array_patsub (ARRAY *a, char *pat, char *rep, int mflags) { diff --git a/builtins/fc.def b/builtins/fc.def index 0187d43bc..781b000de 100644 --- a/builtins/fc.def +++ b/builtins/fc.def @@ -641,7 +641,7 @@ fc_gethnum (char *command, HIST_ENTRY **hlist, int mode) if (s && DIGIT(*s)) { - n = atoi (s); + n = (int)strtol (s, (char **)NULL, 10); n *= sign; /* We want to return something that is an offset to HISTORY_BASE. */ diff --git a/builtins/read.def b/builtins/read.def index 88c9be8b7..70e08126d 100644 --- a/builtins/read.def +++ b/builtins/read.def @@ -1,7 +1,7 @@ This file is read.def, from which is created read.c. It implements the builtin "read" in Bash. -Copyright (C) 1987-2025 Free Software Foundation, Inc. +Copyright (C) 1987-2026 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -249,7 +249,7 @@ read_builtin (WORD_LIST *list) { char *varname; int nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2, nflag; - size_t size; + size_t input_string_size; volatile int i; int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul; int edit, use_bash_completion; @@ -279,7 +279,7 @@ read_builtin (WORD_LIST *list) FILE *save_instream; #endif - USE_VAR(size); + USE_VAR(input_string_size); USE_VAR(i); USE_VAR(pass_next); USE_VAR(print_ps2); @@ -421,6 +421,8 @@ read_builtin (WORD_LIST *list) { int ct; /* change terminal settings */ + /* XXX - revisit this now that bash doesn't change terminal settings if + the delimiter is not a newline. */ ct = (nflag || delim != '\n') && isatty (fd); return (check_read_input (fd, ct) ? EXECUTION_SUCCESS : EXECUTION_FAILURE); } @@ -460,7 +462,7 @@ read_builtin (WORD_LIST *list) for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++) skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL; - input_string = (char *)xmalloc (size = 112); /* XXX was 128 */ + input_string = (char *)xmalloc (input_string_size = 496); /* XXX was 128 */ input_string[0] = '\0'; pass_next = 0; /* Non-zero signifies last char was backslash. */ @@ -616,13 +618,24 @@ read_builtin (WORD_LIST *list) #endif if (input_is_tty) { + int rc; + /* ttsave() */ termsave.fd = fd; ttgetattr (fd, &ttattrs); termsave.attrs = ttattrs; - ttset = ttattrs; - if ((silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar (fd, &ttset)) < 0) + ttset = ttattrs; + + if (nchars > 0) + rc = silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar (fd, &ttset); + else /* delim != '\n' */ + { + rc = silent ? tt_setnoecho (&ttset) : 0; + if (rc >= 0) + rc = ttfd_seteol (fd, &ttset, delim); + } + if (rc < 0) sh_ttyerror (1); tty_modified = 1; add_unwind_protect (uw_ttyrestore, &termsave); @@ -690,12 +703,11 @@ read_builtin (WORD_LIST *list) /* These only matter if edit == 0 */ if ((nchars > 0) && (input_is_tty == 0) && ignore_delim) /* read -N */ unbuffered_read = 2; -#if 0 - else if ((nchars > 0) || (delim != '\n') || input_is_pipe) -#else - else if (((nchars > 0 || delim != '\n') && input_is_tty) || input_is_pipe) + else if ((nchars > 0 && input_is_tty) || input_is_pipe) /* read -n */ unbuffered_read = 1; -#endif + else if (delim != '\n' && input_is_tty) /* read -d */ + unbuffered_read = 3; + if (prompt && edit == 0) { fprintf (stderr, "%s", prompt); @@ -759,9 +771,11 @@ read_builtin (WORD_LIST *list) if (tmsec > 0 || tmusec > 0) sigprocmask (SIG_SETMASK, &chldset, &prevset); #endif - if (unbuffered_read == 2) + if (unbuffered_read == 2) /* read -N */ retval = posixly_correct ? zreadintr (fd, &c, 1) : zreadn (fd, &c, nchars - nr); - else if (unbuffered_read) + else if (unbuffered_read == 3) /* read -d on a tty */ + retval = posixly_correct ? zreadcintr (fd, &c) : zreadc (fd, &c); + else if (unbuffered_read) /* read -n or input_is_pipe */ retval = posixly_correct ? zreadintr (fd, &c, 1) : zread (fd, &c, 1); else retval = posixly_correct ? zreadcintr (fd, &c) : zreadc (fd, &c); @@ -811,10 +825,10 @@ read_builtin (WORD_LIST *list) check_read_timeout (); /* XXX -- use i + mb_cur_max (at least 4) for multibyte/read_mbchar */ - if (i + (mb_cur_max > 4 ? mb_cur_max : 4) >= size) + if (i + (mb_cur_max > 4 ? mb_cur_max : 4) >= input_string_size) { char *x; - x = (char *)xrealloc (input_string, size += 128); + x = (char *)xrealloc (input_string, input_string_size += 512); #if 0 /* This is, in theory, undefined behavior, since input_string may @@ -1213,6 +1227,8 @@ read_mbchar (int fd, char *string, int ind, int ch, int delim, int unbuffered) /* We don't want to be interrupted during a multibyte char read */ if (unbuffered == 2) r = zreadn (fd, &c, 1); + else if (unbuffered == 3) + r = zreadc (fd, &c); else if (unbuffered) r = zread (fd, &c, 1); else diff --git a/doc/bash.html b/doc/bash.html index 2f8fc02af..25507f7f2 100644 --- a/doc/bash.html +++ b/doc/bash.html @@ -1,5 +1,5 @@ - + @@ -133,7 +133,7 @@ Bourne-Again SHell

Bash is -Copyright (C) 1989-2025 by the Free Software Foundation, +Copyright (C) 1989-2026 by the Free Software Foundation, Inc.

DESCRIPTION @@ -881,11 +881,17 @@ a semicolon to delimit commands.

If a command is terminated by the control operator &, the shell -executes the command in the background in a subshell. -The shell does not wait for the command to finish, and the -return status is 0. These are referred to as -asynchronous commands. Commands separated or -terminated by ; (or an equivalent +executes the command asynchronously in a subshell. This is +known as executing a command in the background, and +these are referred to as asynchronous commands. The +shell does not wait for the command to finish, and the +return status is 0. When job control is not active, the +standard input for asynchronous commands, in the absence of +any explicit redirections involving the standard input, is +redirected from /dev/null.

+ +

Commands +separated or terminated by ; (or an equivalent <newline>) are executed sequentially; the shell waits for each command to terminate in turn.

@@ -4607,12 +4613,13 @@ removed.

The character c following the open brace must be a space, tab, -newline, or |, and the close brace must be in a -position where a reserved word may appear (i.e., preceded by -a command terminator such as semicolon). Bash allows -the close brace to be joined to the remaining characters in -the word without being followed by a shell metacharacter as -a reserved word would usually require.

+newline, “|”, or “;”; and the close +brace must be in a position where a reserved word may appear +(i.e., preceded by a command terminator such as semicolon). +Bash allows the close brace to be joined to the +remaining characters in the word without being followed by a +shell metacharacter as a reserved word would usually +require.

Any side effects of command take effect immediately in the current @@ -4629,7 +4636,15 @@ execution environment, including the positional parameters, is shared with the caller.

If the first -character following the open brace is a |, the +character following the open brace is a “;”, the +construct behaves like the form above but preserves any +trailing newlines in the output of command instead of +removing them. This form is useful when the trailing +newlines are significant and should not be stripped from the +command’s output.

+ +

If the first +character following the open brace is a “|”, the construct expands to the value of the REPLY shell variable after command executes, without removing any trailing newlines, and the standard output of command @@ -6593,9 +6608,10 @@ in posix mode.

If a command is followed by a & and job control is not active, the default standard input for the command is the empty file -/dev/null. Otherwise, the invoked command inherits -the file descriptors of the calling shell as modified by -redirections.

+/dev/null, unless the command has an explicit +redirection involving the standard input. Otherwise, the +invoked command inherits the file descriptors of the calling +shell as modified by redirections.

ENVIRONMENT @@ -8872,8 +8888,9 @@ facilities to extract the last word, as if the (M−C−e)

Expand the line by performing -shell word expansions. This performs alias and history -expansion, $'string' and +shell word expansions, treating the line as a single shell +word. This performs alias and history expansion, +$'string' and $"string" quoting, tilde expansion, parameter and variable expansion, arithmetic expansion, command and process substitution, word splitting, and quote @@ -8882,6 +8899,27 @@ substitution. See HISTORY EXPANSION below for a description of history expansion.

+

shell−expand−and−requote−line +()

+ +

Expand the line by performing +shell word expansions, splitting the line into shell words +in the same way as for programmable completion. This +performs alias and history expansion, +$'string' and +$"string" quoting, tilde expansion, +parameter and variable expansion, arithmetic expansion, +command and process substitution, 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 and quotes each +resultant word. 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.

+ +

history−expand−line (M−^)

diff --git a/doc/bash.info b/doc/bash.info index 762bd0a12..df5767c5d 100644 --- a/doc/bash.info +++ b/doc/bash.info @@ -7662,7 +7662,10 @@ that allow shell escapes are particularly vulnerable), changing the current directory to a non-writable directory other than ‘$HOME’ after login, not allowing the restricted shell to execute shell scripts, and cleaning the environment of variables that cause some commands to modify -their behavior (e.g., ‘VISUAL’ or ‘PAGER’). +their behavior (e.g., ‘VISUAL’ or ‘PAGER’). When setting up a +restricted environment like this, it's important not to install or allow +symbolic links in the new current directory, since those could be used +to circumvent restrictions on writing to files. Modern systems provide more secure ways to implement a restricted environment, such as ‘jails’, ‘zones’, or ‘containers’. @@ -13801,62 +13804,62 @@ Node: The Directory Stack330317 Node: Directory Stack Builtins331114 Node: Controlling the Prompt335559 Node: The Restricted Shell338443 -Node: Bash POSIX Mode341325 -Node: Shell Compatibility Mode360741 -Node: Job Control369748 -Node: Job Control Basics370205 -Node: Job Control Builtins376573 -Node: Job Control Variables383361 -Node: Command Line Editing384592 -Node: Introduction and Notation386295 -Node: Readline Interaction388647 -Node: Readline Bare Essentials389835 -Node: Readline Movement Commands391643 -Node: Readline Killing Commands392639 -Node: Readline Arguments394662 -Node: Searching395752 -Node: Readline Init File397995 -Node: Readline Init File Syntax399298 -Node: Conditional Init Constructs426249 -Node: Sample Init File430634 -Node: Bindable Readline Commands433754 -Node: Commands For Moving435292 -Node: Commands For History437756 -Node: Commands For Text443147 -Node: Commands For Killing447272 -Node: Numeric Arguments450060 -Node: Commands For Completion451212 -Node: Keyboard Macros456908 -Node: Miscellaneous Commands457609 -Node: Readline vi Mode465152 -Node: Programmable Completion466129 -Node: Programmable Completion Builtins475865 -Node: A Programmable Completion Example487602 -Node: Using History Interactively492947 -Node: Bash History Facilities493628 -Node: Bash History Builtins497363 -Node: History Interaction504958 -Node: Event Designators509908 -Node: Word Designators511486 -Node: Modifiers513878 -Node: Installing Bash515815 -Node: Basic Installation516931 -Node: Compilers and Options520807 -Node: Compiling For Multiple Architectures521557 -Node: Installation Names523310 -Node: Specifying the System Type525544 -Node: Sharing Defaults526290 -Node: Operation Controls527004 -Node: Optional Features528023 -Node: Reporting Bugs540746 -Node: Major Differences From The Bourne Shell542103 -Node: GNU Free Documentation License563530 -Node: Indexes588707 -Node: Builtin Index589158 -Node: Reserved Word Index596256 -Node: Variable Index598701 -Node: Function Index616114 -Node: Concept Index630247 +Node: Bash POSIX Mode341536 +Node: Shell Compatibility Mode360952 +Node: Job Control369959 +Node: Job Control Basics370416 +Node: Job Control Builtins376784 +Node: Job Control Variables383572 +Node: Command Line Editing384803 +Node: Introduction and Notation386506 +Node: Readline Interaction388858 +Node: Readline Bare Essentials390046 +Node: Readline Movement Commands391854 +Node: Readline Killing Commands392850 +Node: Readline Arguments394873 +Node: Searching395963 +Node: Readline Init File398206 +Node: Readline Init File Syntax399509 +Node: Conditional Init Constructs426460 +Node: Sample Init File430845 +Node: Bindable Readline Commands433965 +Node: Commands For Moving435503 +Node: Commands For History437967 +Node: Commands For Text443358 +Node: Commands For Killing447483 +Node: Numeric Arguments450271 +Node: Commands For Completion451423 +Node: Keyboard Macros457119 +Node: Miscellaneous Commands457820 +Node: Readline vi Mode465363 +Node: Programmable Completion466340 +Node: Programmable Completion Builtins476076 +Node: A Programmable Completion Example487813 +Node: Using History Interactively493158 +Node: Bash History Facilities493839 +Node: Bash History Builtins497574 +Node: History Interaction505169 +Node: Event Designators510119 +Node: Word Designators511697 +Node: Modifiers514089 +Node: Installing Bash516026 +Node: Basic Installation517142 +Node: Compilers and Options521018 +Node: Compiling For Multiple Architectures521768 +Node: Installation Names523521 +Node: Specifying the System Type525755 +Node: Sharing Defaults526501 +Node: Operation Controls527215 +Node: Optional Features528234 +Node: Reporting Bugs540957 +Node: Major Differences From The Bourne Shell542314 +Node: GNU Free Documentation License563741 +Node: Indexes588918 +Node: Builtin Index589369 +Node: Reserved Word Index596467 +Node: Variable Index598912 +Node: Function Index616325 +Node: Concept Index630458  End Tag Table diff --git a/doc/bash.pdf b/doc/bash.pdf index c861b55f4..bfbb05a91 100644 Binary files a/doc/bash.pdf and b/doc/bash.pdf differ diff --git a/doc/bashref.aux b/doc/bashref.aux index dc5bd7d7f..9e025c4bd 100644 --- a/doc/bashref.aux +++ b/doc/bashref.aux @@ -60,9 +60,9 @@ @xrdef{Compound Commands-pg}{11} @xrdef{Looping Constructs-title}{Looping Constructs} @xrdef{Looping Constructs-snt}{Section@tie 3.2.5.1} +@xrdef{Looping Constructs-pg}{12} @xrdef{Conditional Constructs-title}{Conditional Constructs} @xrdef{Conditional Constructs-snt}{Section@tie 3.2.5.2} -@xrdef{Looping Constructs-pg}{12} @xrdef{Conditional Constructs-pg}{13} @xrdef{Command Grouping-title}{Grouping Commands} @xrdef{Command Grouping-snt}{Section@tie 3.2.5.3} @@ -102,9 +102,9 @@ @xrdef{Command Substitution-pg}{36} @xrdef{Arithmetic Expansion-title}{Arithmetic Expansion} @xrdef{Arithmetic Expansion-snt}{Section@tie 3.5.5} +@xrdef{Arithmetic Expansion-pg}{37} @xrdef{Process Substitution-title}{Process Substitution} @xrdef{Process Substitution-snt}{Section@tie 3.5.6} -@xrdef{Arithmetic Expansion-pg}{37} @xrdef{Word Splitting-title}{Word Splitting} @xrdef{Word Splitting-snt}{Section@tie 3.5.7} @xrdef{Process Substitution-pg}{38} @@ -132,7 +132,7 @@ @xrdef{Command Execution Environment-title}{Command Execution Environment} @xrdef{Command Execution Environment-snt}{Section@tie 3.7.3} @xrdef{Command Search and Execution-pg}{46} -@xrdef{Command Execution Environment-pg}{46} +@xrdef{Command Execution Environment-pg}{47} @xrdef{Environment-title}{Environment} @xrdef{Environment-snt}{Section@tie 3.7.4} @xrdef{Exit Status-title}{Exit Status} @@ -225,7 +225,7 @@ @xrdef{Bash POSIX Mode-pg}{116} @xrdef{Shell Compatibility Mode-title}{Shell Compatibility Mode} @xrdef{Shell Compatibility Mode-snt}{Section@tie 6.12} -@xrdef{Shell Compatibility Mode-pg}{121} +@xrdef{Shell Compatibility Mode-pg}{122} @xrdef{Job Control-title}{Job Control} @xrdef{Job Control-snt}{Chapter@tie 7} @xrdef{Job Control Basics-title}{Job Control Basics} diff --git a/doc/bashref.bt b/doc/bashref.bt index 27c0dcf01..c7a7f16e3 100644 --- a/doc/bashref.bt +++ b/doc/bashref.bt @@ -55,7 +55,7 @@ \entry{disown}{128}{\code {disown}} \entry{suspend}{128}{\code {suspend}} \entry{compgen}{161}{\code {compgen}} -\entry{complete}{161}{\code {complete}} +\entry{complete}{162}{\code {complete}} \entry{compopt}{165}{\code {compopt}} \entry{fc}{169}{\code {fc}} \entry{history}{170}{\code {history}} diff --git a/doc/bashref.bts b/doc/bashref.bts index e7b501c51..0296157d5 100644 --- a/doc/bashref.bts +++ b/doc/bashref.bts @@ -16,7 +16,7 @@ \entry{\code {cd}}{53} \entry{\code {command}}{63} \entry{\code {compgen}}{161} -\entry{\code {complete}}{161} +\entry{\code {complete}}{162} \entry{\code {compopt}}{165} \entry{\code {continue}}{54} \initial {D} diff --git a/doc/bashref.cp b/doc/bashref.cp index 80005c3b0..431e3ba78 100644 --- a/doc/bashref.cp +++ b/doc/bashref.cp @@ -70,7 +70,7 @@ \entry{command expansion}{45}{command expansion} \entry{command execution}{46}{command execution} \entry{command search}{46}{command search} -\entry{execution environment}{46}{execution environment} +\entry{execution environment}{47}{execution environment} \entry{environment}{48}{environment} \entry{exit status}{48}{exit status} \entry{signal handling}{49}{signal handling} @@ -99,8 +99,8 @@ \entry{restricted shell}{115}{restricted shell} \entry{POSIX description}{116}{POSIX description} \entry{POSIX Mode}{117}{POSIX Mode} -\entry{Compatibility Level}{121}{Compatibility Level} -\entry{Compatibility Mode}{121}{Compatibility Mode} +\entry{Compatibility Level}{122}{Compatibility Level} +\entry{Compatibility Mode}{122}{Compatibility Mode} \entry{job control}{125}{job control} \entry{foreground}{125}{foreground} \entry{background}{125}{background} diff --git a/doc/bashref.cps b/doc/bashref.cps index 5be074b0c..ae331a6e7 100644 --- a/doc/bashref.cps +++ b/doc/bashref.cps @@ -31,8 +31,8 @@ \entry{commands, shell}{9} \entry{commands, simple}{10} \entry{comments, shell}{9} -\entry{Compatibility Level}{121} -\entry{Compatibility Mode}{121} +\entry{Compatibility Level}{122} +\entry{Compatibility Mode}{122} \entry{completion builtins}{161} \entry{conditional arithmetic operator}{108} \entry{configuration}{175} @@ -46,7 +46,7 @@ \entry{environment}{48} \entry{evaluation, arithmetic}{107} \entry{event designators}{172} -\entry{execution environment}{46} +\entry{execution environment}{47} \entry{exit status}{3, 48} \entry{expansion}{25} \entry{expansion, arithmetic}{37} diff --git a/doc/bashref.fn b/doc/bashref.fn index 085b67902..fd2e5855d 100644 --- a/doc/bashref.fn +++ b/doc/bashref.fn @@ -107,7 +107,8 @@ \entry{glob-expand-word (C-x *)}{157}{\code {glob-expand-word (C-x *)}} \entry{glob-list-expansions (C-x g)}{157}{\code {glob-list-expansions (C-x g)}} \entry{shell-expand-line (M-C-e)}{157}{\code {shell-expand-line (M-C-e)}} -\entry{history-expand-line (M-^)}{157}{\code {history-expand-line (M-^)}} +\entry{shell-expand-and-requote-line ()}{157}{\code {shell-expand-and-requote-line ()}} +\entry{history-expand-line (M-^)}{158}{\code {history-expand-line (M-^)}} \entry{magic-space ()}{158}{\code {magic-space ()}} \entry{alias-expand-line ()}{158}{\code {alias-expand-line ()}} \entry{history-and-alias-expand-line ()}{158}{\code {history-and-alias-expand-line ()}} diff --git a/doc/bashref.fns b/doc/bashref.fns index 8a3822804..ed1685caa 100644 --- a/doc/bashref.fns +++ b/doc/bashref.fns @@ -62,7 +62,7 @@ \entry{\code {glob-list-expansions (C-x g)}}{157} \initial {H} \entry{\code {history-and-alias-expand-line ()}}{158} -\entry{\code {history-expand-line (M-^)}}{157} +\entry{\code {history-expand-line (M-^)}}{158} \entry{\code {history-search-backward ()}}{149} \entry{\code {history-search-forward ()}}{149} \entry{\code {history-substring-search-backward ()}}{149} @@ -111,6 +111,7 @@ \entry{\code {set-mark (C-@)}}{156} \entry{\code {shell-backward-kill-word ()}}{152} \entry{\code {shell-backward-word (M-C-b)}}{147} +\entry{\code {shell-expand-and-requote-line ()}}{157} \entry{\code {shell-expand-line (M-C-e)}}{157} \entry{\code {shell-forward-word (M-C-f)}}{147} \entry{\code {shell-kill-word (M-C-d)}}{152} diff --git a/doc/bashref.html b/doc/bashref.html index 9f1985339..883dac9f2 100644 --- a/doc/bashref.html +++ b/doc/bashref.html @@ -4,13 +4,13 @@