- set_or_show_attributes: if exporting a function with export -f,
call exportable_function_name to determine whether the function
should be exported; don't export function if it returns 0
+
+ 10/7
+ ----
+builtins/setattr.def
+ - set_or_show_attributes: don't show identifiers that are invisible
+ and imported from the environment, since that combination of
+ attributes means that the imported variable is not a valid shell
+ identifier. Report from Stephane Chazelas <stephane.chazelas@gmail.com>
+
+ 10/8
+ ----
+shell.c
+ - shell_initialize: set new variable should_be_restricted, which
+ says whether or not the shell will be a restricted one based on the
+ shell name; use in calls to initialize_shell_variables (to inhibit
+ importing shell functions) and initialize_shell_options (to inhibit
+ parsing $SHELLOPTS) and initialize_bashopts (to inhibit parsing
+ $BASHOPTS). Report from <paulfm@umn.edu>
+
+ 10/12
+ -----
+execute_cmd.c
+ - execute_function: unwind-protect loop_level, set loop_level to 0
+ when entering a function so break and continue in functions don't
+ break loops running outside of the function. Fix picked up from
+ dash via Herbert Xu <herbert@gnodor.apana.org.au>
--- /dev/null
+ 2/14/2011
+ ---------
+[bash-4.2 released]
+
+ 2/15
+ ----
+lib/glob/gmisc.c
+ - fix wmatchlen and umatchlen to avoid going past the end of the
+ string on an incomplete bracket expression that ends with a
+ NUL. Partial fix for bug reported by Clark Wang <dearvoid@gmail.com>
+
+ 2/16
+ ----
+subst.h
+ - new string extract flag value: SX_WORD. Used when calling
+ extract_dollar_brace_string to skip over the word in
+ ${param op word} from parameter_brace_expand
+
+subst.c
+ - change parameter_brace_expand to add SX_WORD to flags passed to
+ extract_dollar_brace_string
+ - change parameter_brace_expand to use SX_POSIXEXP for all non-posix
+ word expansion operators that treat single quotes as special, not
+ just % and #
+ - change extract_dollar_brace_string to initialize dolbrace_state to
+ DOLBRACE_WORD if SX_WORD flag supplied and we shouldn't use
+ DOLBRACE_QUOTE. Fixes bug reported by Juergen Daubert <jue@jue.li>
+
+doc/{bash.1,bashref.texi}
+ - document the exact expansions here strings undergo
+
+ 2/17
+ ----
+lib/readline/vi_mode.c
+ - make sure that `dd', `cc', and `yy' call vidomove_dispatch from
+ rl_domove_read_callback. Fixes bug reported by Clark Wang
+ <dearvoid@gmail.com>
+
+lib/readline/callback.c
+ - make sure _rl_internal_char_cleanup is called after the
+ vi-motion callbacks (rl_vi_domove_callback) in rl_callback_read_char.
+ Companion to above fix
+
+doc/{bash.1,bashref.texi}
+ - make sure that the text describing the rhs of the == and =~
+ operators to [[ states that only the quoted portion of the pattern
+ is matched as a string
+
+ 2/18
+ ----
+lib/glob/gmisc.c
+ - better fix for umatchlen/wmatchlen: keep track of the number of
+ characters in a bracket expression as the value to increase
+ matchlen by if the bracket expression is not well-formed. Fixes
+ bug reported by Clark Wang <dearvoid@gmail.com>
+
+subst.c
+ - change expand_string_for_rhs so that it sets the W_NOSPLIT2 flag
+ in the word flags. We will not perform word splitting or quote
+ removal on the result, so we do not want to add quoted nulls if
+ we see "" or ''. Fixes bug reported by Mike Frysinger
+ <vapier@gentoo.org>
+
+ 2/19
+ ----
+variables.c
+ - new function, int chkexport(name), checks whether variable NAME is
+ exported and remakes the export environment if necessary. Returns
+ 1 if NAME is exported and 0 if not
+ - call chkexport(name) to get tzset to look at the right variable in
+ the environment when modifying TZ in sv_tz. Don't call tzset if
+ chkexport doesn't indicate that the variable is exported
+
+variables.h
+ - new extern declaration for chkexport
+
+
+{parse.y,builtins/printf.def}
+ - call sv_tz before calling localtime() when formatting time strings
+ in prompt strings or using printf. Fixes bug reported by
+ Dennis Williamson <dennistwilliamson@gmail.com>
+
+execute_cmd.c
+ - modify fix of 2/9 to add casts when those variables are passed to
+ functions; some compilers throw errors instead of warnings. Report
+ and fix from Joachim Schmitz <jojo@schmitz-digital.de>
+
+support/shobj-conf
+ - add a stanza for nsk on the Tandem from Joachim Schmitz
+ <jojo@schmitz-digital.de>
+
+{shell,lib/readline/shell}.c
+ - Tandem systems should use getpwnam (getlogin()); for some reason
+ they don't do well with using getuid(). Fix from Joachim Schmitz
+ <jojo@schmitz-digital.de>
+
+ 3/1
+ ---
+variables.c
+ - make sure that the return value from find_variable is non-null
+ before trying to use it in chkexport. Fixes bug reported by
+ Evangelos Foutras <foutrelis@gmail.com>
+
+ 3/3
+ ---
+parse.y
+ - when adding $$ to the current token buffer in read_token_word(),
+ don't xmalloc a buffer for two characters and then strcpy it, just
+ copy the characters directly into the token buffer. Fix from
+ Michael Whitten <mfwitten@gmail.com>
+
+execute_cmd.c
+ - fix expand_word_unsplit to add the W_NOSPLIT2 flag to the word to
+ be expanded, so "" doesn't add CTLNUL. Similar to fix of 2/18 to
+ expand_string_for_rhs. Fixes bug reported by Nathanael D. Noblet
+ <nathanael@gnat.ca> and Matthias Klose <doko@debian.org>
+
+parse.y
+ - fix extended_glob case of read_token_word to allocate an extra
+ space in the buffer for the next character read after the extended
+ glob specification if it's a CTLESC or CTLNUL. Report and fix from
+ Michael Witten <mfwitten@gmail.com>
+ - fix shell expansions case of read_token_word to allocate an extra
+ space in the buffer for the next character read after the shell
+ expansion if it's a CTLESC or CTLNUL. Report and fix from
+ Michael Witten <mfwitten@gmail.com>
+ - TENTATIVE: fix read_token_word to reduce the amount of buffer space
+ required to hold the translated and double-quoted value of $"..."
+ strings. Report and fix from Michael Witten <mfwitten@gmail.com>
+ - change code around got_character and got_escaped_character labels to
+ make sure that we call RESIZE_MALLOCED_BUFFER before adding the
+ CTLESC before a CTLESC or CTLNUL, and before adding the character if
+ we're not adding a CTLESC. Report and fix from
+ Michael Witten <mfwitten@gmail.com>
+
+subst.c
+ - new param flags value, PF_ASSIGNRHS, mirrors W_ASSIGNRHS, noting that
+ parameter expansion is on rhs of assignment statement. That inhibits
+ word splitting
+ - change param_expand to call string_list_dollar_at with quoted == 1
+ if PF_ASSIGNRHS is set, so it will quote IFS characters in the
+ positional parameter before separating them with the first char of
+ $IFS. This keeps the rhs from being split inappropriately. Fixes
+ bug reported by Andres Perera <andres.p@zoho.com>
+
+ 3/4
+ ---
+lib/readline/bind.c
+ - add a missing free of `names' in rl_function_dumper. Bug report
+ and fix from Michael Snyder <msnyder@vmware.com>
+
+ 3/5
+ ---
+lib/readline/rltty.c
+ - change rl_deprep_terminal so it uses fileno (stdin) for the tty fd
+ if rl_instream is not set, like rl_prep_terminal
+
+ 3/6
+ ---
+lib/readline/display.c
+ - fix rl_message to use a dynamically-allocated buffer instead of a
+ fixed-size buffer of 128 chars for the `local message prompt'. Bug
+ report and fix from Micah Cowan <micah@cowan.name>
+
+ 3/7
+ ---
+jobs.c
+ - add sentinel to wait_sigint_handler so it only sets wait_sigint_received
+ if waiting_for_child is non-zero; otherwise, it restores the old
+ SIGINT handler and sends itself the SIGINT
+ - set waiting_for_child around the calls to waitchld that use it to
+ synchronously wait for a process
+ - change logic that decides whether or not the child process blocked
+ or handled SIGINT based on whether or not waitpid returns -1/EINTR
+ and the shell receives a SIGINT and the child does not exit. If
+ the child later exits due to SIGINT, cancel the assumoption that it
+ was handled
+ - instead of testing whether or not the child exited due to SIGINT
+ when deciding whether the shell should act on a SIGINT it received
+ while waiting, test whether or not we think the child caught
+ SIGINT. If it did, we let it go (unless the shell has it trapped);
+ if it did not catch it, the shell acts on the SIGINT. Fix from
+ Linus Torvalds <torvalds@linux-foundation.org>, bug report originally
+ from Oleg Nesterov <oleg@redhat.com>
+
+ 3/8
+ ---
+shell.c
+ - initialize no_line_editing to 1 if READLINE is not defined -- we
+ can't have line editing without readline
+
+ 3/12
+ ----
+lib/readline/signals.c
+ - add SIGHUP to the set of signals readline handles
+
+lib/readline/doc/rltech.texi
+ - document that SIGHUP is now part of the set of signals readline
+ handles
+
+lib/readline/input.c
+ - if _rl_caught_signal indicates that read() was interrupted by a
+ SIGHUP or SIGTERM, return READERR or EOF as appropriate
+ - call rl_event_hook, if it's set, if call to read in rl_getc
+ returns -1/EINTR. If rl_event_hook doesn't do anything, this
+ continues the loop as before. This handles the other fatal
+ signals
+
+execute_cmd.c
+ - add a couple of QUIT; calls to execute_disk_command and
+ execute_simple_command to improve responsiveness to interrupts
+ and fatal signals
+
+input.c
+ - rearrange getc_with_restart so that the return values from read()
+ are handled right
+
+parse.y
+ - don't need to set terminate_immediately in yy_stream_get, since
+ getc_with_restart checks for terminating signals itself
+ - since readline returns READERR on SIGHUP or SIGTERM, don't need
+ to set terminate_immediately. Still doesn't handle other
+ signals well -- will have to check that some more
+
+bashline.c
+ - new function, bash_event_hook, for rl_event_hook. Just checks for
+ terminating signals and acts on them using CHECK_TERMSIG.
+ - set rl_event_hook to bash_event_hook
+
+builtins/read.def
+ - take out setting terminate_immediately; add calls to CHECK_TERMSIG
+ after read calls
+
+doc/{bash.1,bashref.texi}
+ - move the text describing the effect of negative subscripts used to
+ reference indexed array elements to the paragraphs describing
+ ${parameter[subscript]}, since that's where they are implemented.
+ Pointed out by Christopher F. A. Johnson <cfajohnson@gmail.com>
+
+arrayfunc.[ch],subst.c
+ - array_expand_index now takes a new first argument: a SHELL_VAR *
+ of the array variable being subscripted. Can be used later to fully
+ implement negative subscripts
+
+ 3/14
+ ----
+lib/glob/glob.c
+ - fix mbskipname to not turn the directory entry name into a wide char
+ string if the conversion of the pattern to a wide char string fails
+ - fix mbskipname to call skipname if either the pattern or the filename
+ can't be converted into a wide-char string
+
+lib/glob/xmbsrtowcs.c
+ - fix xdupmbstowcs2 to handle return value of 0 from mbsnrtowcs and
+ short-circuit with failure in that case. Fixes bug reported by
+ Roman Rakus <rrakus@redhat.com>
+
+ 3/15
+ ----
+bashline.c
+ - new variable, bash_filename_quote_characters to store the value
+ assigned to rl_filename_quote_characters so it can be restored
+ if changed.
+ - change bashline_reset and attempt_shell_completion to restore
+ rl_filename_quote_characters if not set to default
+
+ 3/22
+ ----
+lib/glob/glob.c
+ - wdequote_pathname falls back to udequote_pathname if xdupmbstowcs
+ fails to convert the pathname to a wide-character string
+
+lib/glob/xmbsrtowcs.c
+ - xdupmbstowcs2: change to fix problem with leading '\\' (results in
+ nms == 0, which causes it to short-circuit with failure right
+ away). Fixes bug pointed out by Werner Fink <werner@suse.de>
+ - xdupmbstowcs2: compensate for mbsnrtowcs returning 0 by taking the
+ next single-byte character and going on
+ - xdupmbstowcs2: change memory allocation to increase by WSBUF_INC
+ bytes; try to avoid calls to realloc (even if they don't actually
+ result in more memory being allocated)
+
+ 3/24
+ ----
+doc/{bash.1,bashref.texi}
+ - slightly modify BASH_SUBSHELL description based on complaint from
+ Sam Liddicott <sam@liddicott.com>
+
+ 3/25
+ ----
+trap.c
+ - change free_trap_strings to not call free_trap_string for signals
+ that are being ignored, like reset_or_restore_signal_handlers.
+ Fixes bug reported by Satoshi Takahashi <blue3waters@gmail.com>
+
+ 3/26
+ ----
+lib/readline/rltypedefs.h
+ - remove old Function/VFunction/CPFunction/CPPFunction typedefs as
+ suggested by Tom Tromey <tromey@redhat.com>
+
+lib/readline/rlstdc.h
+ - move defines for USE_VARARGS/PREFER_STDARG/PREFER_VARARGS from
+ config.h.in to here because declaration of rl_message in
+ readline.h uses the defines. This makes it hard for another packages
+ to use after the header files are installed, since config.h is not
+ one of the installed files. Suggested by Tom Tromey
+ <tromey@redhat.com>
+
+ 3/27
+ ----
+print_cmd.c
+ - change indirection_string from a static buffer to a dynamic one
+ managed by indirection_level_string(), so we don't end up truncating
+ PS4. Suggested by Dennis Williamson <dennistwilliamson@gmail.com>
+
+lib/readline/shell.c
+ - change sh_set_lines_and_columns to use static buffers instead of
+ allocating the buffers to pass to setenv/putenv
+
+lib/readline/terminal.c
+ - change _rl_get_screen_size to not call sh_set_lines_and_columns if
+ ignore_env == 0
+ - _rl_sigwinch_resize_terminal: new function to just retrieve terminal
+ size, ignoring environment
+
+lib/readline/rlprivate.h
+ - new external declaration for _rl_sigwinch_resize_terminal() (currently
+ unused)
+
+lib/readline/signals.c
+ - rl_sigwinch_handler: set _rl_caught_signal to SIGWINCH
+ - rl_sigwinch_handler: don't immediately call rl_resize_terminal; just
+ leave _rl_caught_signal set for RL_CHECK_SIGNALS to handle
+ - _rl_signal_handler: call rl_resize_terminal if sig == SIGWINCH.
+ Should fix hang when sending multiple repeated SIGWINCH reported by
+ Henning Bekel <h.bekel@googlemail.com>
+
+ 3/29
+ ----
+lib/sh/snprintf.c
+ - include math.h for any defines for isinf/isnan
+ - use code from gnulib documentation to implement isinf/isnan if they
+ are not defined
+
+configure.in
+ - don't check for isinf or isnan; c99 says they're macros anyway
+
+config.h.in
+ - remove defines for ISINF_IN_LIBC and ISNAN_IN_LIBC, no longer used
+ by snprintf.c
+
+ 4/2
+ ---
+braces.c
+ - brace_gobbler: fix to understand double-quoted command substitution,
+ since the shell understands unquoted comsubs. Fixes bug reported
+ by Michael Whitten <mfwitten@gmail.com>
+
+lib/readline/display.c
+ - include <pc.h> on MDOS
+ - get and set screen size using DJGPP-specific calls on MSDOS
+ - move cursor up clear screen using DJGPP-specific calls
+ - don't call tputs on DJGPP; there is no good terminfo support
+
+lib/readline/terminal.c
+ - include <pc.h> on MDOS
+ - get and set screen size using DJGPP-specific calls on MSDOS
+ - use DJGPP-specific initialization on MSDOS, zeroing all the
+ _rl_term_* variables
+ - don't call tputs on DJGPP; there is no good terminfo support
+ DJGPP support from Eli Zaretskii <eliz@gnu.org>
+
+ 4/6
+ ---
+
+config-top.h
+ - change DEFAULT_PATH_VALUE to something more useful and modern
+
+ 4/8
+ ---
+tests/printf2.sub
+ - make sure LC_ALL and LC_CTYPE are set so LANG assignment takes effect.
+ Reported by Cedric Arbogast <arbogast.cedric@gmail.com>
+
+ 4/11
+ ----
+include/chartypes.h
+ - fix a couple of dicey defines (though ones that don't cause any
+ compiler warnings) in IN_CTYPE_DOMAIN
+
+doc/{bashref.texi,bash.1}
+ - add note referring to duplicating file descriptors in sections
+ describing redirecting stdout and stderr and appending to stdout
+ and stderr. Suggested by Matthew Dinger <mdinger.bugzilla@gmail.com>
+
+pcomplete.c
+ - it_init_helptopics: new function to support completing on help topics,
+ not just builtins
+ - it_helptopics: new programmable completion list of help topics
+ - build list of helptopic completions in gen_action_completions on
+ demand
+
+pcomplete.h
+ - new extern declaration for it_helptopics
+
+builtins/complete.def
+ - the `helptopic' action now maps to CA_HELPTOPIC intead of CA_BUILTIN,
+ since there are more help topics than just builtins. Suggested by
+ Clark Wang <dearvoid@gmail.com>
+
+ 4/12
+ ----
+print_cmd.c
+ - fix print_arith_for_command to add a call to PRINT_DEFERRED_HEREDOCS
+ before ending the body of the command, so heredocs get attached to
+ the right command instead of to the loop. From gentoo bug 363371
+ http://bugs.gentoo.org/show_bug.cgi?id=363371
+
+execute_cmd.c
+ - change coproc_pidchk to unset the appropriate shell variables when
+ the (currently single) known coproc pid terminates
+ - cleanup and new functions to fully support multiple coprocesses when
+ and if I decide to go there
+
+ 4/13
+ ----
+print_cmd.c
+ - fix print_group_command to add a call to PRINT_DEFERRED_HEREDOCS
+ after call to make_command_string_internal before printing closing
+ `}'
+ - fix make_command_string_internal to add a call to
+ PRINT_DEFERRED_HEREDOCS after recursive call to
+ make_command_string_internal in case cm_subshell before printing
+ closing `)'
+
+ 4/14
+ ----
+print_cmd.c
+ - change overlapping strcpy in named_function_string to memmove
+
+sig.h
+ - UNBLOCK_SIGNAL: convenience define, same as UNBLOCK_CHILD, just
+ restores an old signal mask
+
+trap.c
+ - set_signal: instead of setting the signal handler to SIG_IGN while
+ installing the new trap handler, block the signal and unblock it
+ after the new handler is installed. Fixes bug reported by Roman
+ Rakus <rrakus@redhat.com>
+
+ 4/15
+ ----
+doc/{bash.1,bashref.texi}
+ - make it clear that enabling monitor mode means that all jobs run in
+ separate process groups
+
+ 4/18
+ ----
+builtins/fc.def
+ - update fix of 4/15/2010 to not take saved_command_line_count into
+ account when stepping down the history list to make sure that
+ last_hist indexes something that is valid. Fixes bug reported by
+ <piuma@piumalab.org>
+
+ 4/19
+ ----
+builtins/fc.def
+ - fc_gethnum: make sure the calculation to decide the last history
+ entry is exactly the same as fc_builtin. Fixes bug uncovered by
+ fix of 4/18 to stop seg fault
+
+ 4/22
+ ----
+lib/readline/terminal.c
+ - change _rl_enable_meta_key to set a flag indicating that it sent the
+ enable-meta sequence
+ - _rl_disable_meta_key: new function to turn off meta mode after we
+ turned it on with _rl_enable_meta_key
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_disable_meta_key
+
+configure.in
+ - if not cross-compiling, set CFLAGS_FOR_BUILD from any CFLAGS inherited
+ from the environment. Fixes HP/UX build problem reported by
+ "Daniel Richard G." <skunk@iSKUNK.ORG>
+
+ 4/26
+ ----
+config-top.h
+ - define MULTIPLE_COPROCS to 0 so the code is still disabled but easy
+ to enable via configure option or editing this file
+
+ 4/29
+ ----
+lib/sh/eaccess.c
+ - freebsd provides faccessat, with the same misfeature as their eaccess
+ and access implementations (X_OK returns true for uid==0 regardless
+ of the actual file permissions), so reorganize code to check the
+ file permissions as with eaccess. Report and fix from Johan Hattne
+ <johan.hattne@utsouthwestern.edu>
+
+ 5/2
+ ---
+doc/{bash.1,bashref.texi}
+ - add forward reference to `Pattern Matching' from `Pathname
+ Expansion', suggested by Greg Wooledge <wooledg@eeg.ccf.org>
+
+ 5/5
+ ---
+pcomplib.c
+ - the bash_completion project now distributes over 200 completions
+ for various programs, with no end in sight, so increase the value
+ of COMPLETE_HASH_BUCKETS from 32 to 128
+
+pathexp.c
+ - quote_string_for_globbing: make sure CTLESC quoting CTLESC is
+ translated into \<CTLESC> even if the flags include QGLOB_REGEXP.
+ We don't want to process the second CTLESC as a quote character.
+ Fixes bug reported by Shawn Bohrer <sbohrer@rgmadvisors.com>
+
+ 5/6
+ ---
+builtins/printf.def
+ - change PRETURN to not call fflush if ferror(stdout) is true
+ - if a call to one of the stdio functions or printstr leaves
+ ferror(stdout) true, and PRETURN is going to be called, let PRETURN
+ print the error message rather than doubling up the messages. Fixes
+ problem reported by Roman Rakus <rrakus@redhat.com>
+
+ 5/9
+ ---
+doc/{bash.1,bashref.texi}
+ - add note to the effect that lists inside compound command can be
+ terminated by newlines as well as semicolons. Suggested by
+ Roman Byshko <rbyshko@gmail.com>
+
+ 5/10
+ ----
+subst.c
+ - remove_quoted_nulls: fix problem that caused it to skip over the
+ character after a CTLNUL, which had the effect of skipping every
+ other of a series of CTLNULs. Fixes bug reported by
+ Marten Wikstrom <marten.wikstrom@keystream.se>
+
+ 5/11
+ ----
+subst.c
+ - extract_process_subst: add SX_COMMAND flag to call to
+ extract_delimited_string, since we're expanding the same sort of
+ command as command substitution. Fixes bug reported in Ubuntu
+ bug 779848
+
+ 5/12
+ ----
+configure.in
+ - set the prefer_shared and prefer_static variables appropriately
+ depending on the value of $opt_static_link
+
+aclocal.m4
+ - AC_LIB_LINKFLAGS_BODY: change to not prefer shared versions of the
+ libraries it's searching for if the prefer_shared variable is "no".
+ Fixes problem reported by Cedric Arbogast <arbogast.cedric@gmail.com>
+
+ 5/13
+ ----
+lib/readline/readline.c
+ - _rl_internal_teardown: add call to _rl_disable_meta_key to make the
+ meta key active only for the duration of the call to readline()
+ - _rl_internal_setup: move call to _rl_enable_meta_key here from
+ readline_initialize_everything so the meta key is active only for
+ the duration of the call to readline(). Suggestion from Miroslav
+ Lichvar <mlichvar@redhat.com>
+
+builtins/help.def
+ - help_builtin: change strncmp to strcmp so that `help read' no longer
+ matches `readonly'. Suggested by Clark Wang <dearvoid@gmail.com>
+
+config.h.in
+ - add define for GLIBC21, checked using jm_GLIBC21 as part of the tests
+ for libintl
+
+lib/malloc/malloc.c
+ - internal_free: don't use the cached value of memtop when deciding
+ whether or not to adjust the break and give memory back to the kernel
+ when using the GNU C library, since glibc uses sbrk for its own
+ internal purposes. From Debian bug 614815, reported by Samuel
+ Thibault <samuel.thibault@gnu.org>
+
+aclocal.m4
+ - BASH_STRUCT_WEXITSTATUS_OFFSET: change AC_RUN_IFELSE to AC_TRY_RUN
+ to avoid warning about not using AC_LANG_SOURCE
+
+ 5/14
+ ----
+bashline.[ch]
+ - two new functions, bashline_set_event_hook and bashline_reset_event_hook,
+ to set rl_event_hook to bash_event_hook and back to NULL, respectively
+ - don't set rl_event_hook unconditionally
+
+sig.c
+ - termsig_sighandler: if the shell is currently interactive and
+ readline is active, call bashline_set_event_hook to cause
+ termsig_handler to be called via bash_event_hook when the shell
+ returns from the signal handler
+
+ 5/15
+ ----
+lib/readline/display.c
+ - _rl_col_width: Mac OS X has a bug in wcwidth: it does not return 0
+ for UTF-8 combining characters. Added workaround dependent on
+ MACOSX. Fixes problem pointed out by Thomas De Contes
+ <d.l.tDecontes@free.fr>
+
+ 5/16
+ ----
+lib/readline/rlmbutil.h
+ - WCWIDTH: wrapper for wcwidth that returns 0 for Unicode combining
+ characters on systems where wcwidth is broken (e.g., Mac OS X).
+
+lib/readline/{complete,display,mbutil}.c
+ - use WCWIDTH instead of wcwidth
+
+ 5/17
+ ----
+lib/readline/display.c
+ - update_line: after computing ofd and nfd, see whether the next
+ character in ofd is a zero-width combining character. If it is,
+ back ofd and nfd up one, so the base characters no longer compare
+ as equivalent. Fixes problem reported by Keith Winstein
+ <keithw@mit.edu>
+
+lib/readline/nls.c
+ - _rl_utf8locale: new flag variable, set to non-zero if the current
+ locale is UTF-8
+ - utf8locale(): new function, returns 1 if the passed lspec (or the
+ current locale) indicates that the locale is UTF-8. Called from
+ _rl_init_eightbit
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_utf8locale
+
+locale.c
+ - locale_utf8locale: new flag variable, set to non-zero if the current
+ locale is UTF-8 (currently unused)
+ - locale_isutf8(): new function, returns 1 if the passed lspec (or the
+ current locale) indicates that the locale is UTF-8. Should be called
+ whenever the locale or LC_CTYPE value is modified
+
+aclocal.m4
+ - BASH_WCWIDTH_BROKEN: new test for whether or not wcwidth returns
+ zero-width characters like unicode combining characters as having
+ display length 1; define WCWIDTH_BROKEN in this case
+
+config.h.in
+ - WCWIDTH_BROKEN: new define
+
+lib/readline/rlmbutil.h
+ - change WCWIDTH macro to use _rl_utf8locale and the full range of
+ Unicode combining characters (U+0300-U+036F)
+
+ 5/19
+ ----
+lib/readline/rlprivate.h
+ - _rl_search_context: new member, prevc, will hold character read
+ prior to lastc
+
+lib/readline/isearch.c
+ - _rl_isearch_dispatch: if the character causes us to index into
+ another keymap, save that character in cxt->prevc
+ - _rl_isearch_dispatch: if we index into another keymap, but don't
+ find a function that's special to i-search, and the character that
+ caused us to index into that keymap would have terminated the
+ search, push back cxt->prevc and cxt->lastc to make it appear as
+ if `prevc' terminated the search, and execute lastc as a command.
+ We have to push prevc back so we index into the same keymap before
+ we read lastc. Fixes bug report from Davor Cubranic
+ <cubranic@stat.ubc.ca>
+
+ 5/20
+ ----
+expr.c
+ - expr_bind_variable: pay attention to the return value from
+ bind_variable and check whether or not we should error out due to
+ a readonly or noassign variable. Fixes bug reported by Eric
+ Blake <eblake@redhat.com>
+
+ 5/26
+ ----
+
+lib/readline/search.c
+ - include histlib.h for ANCHORED_SEARCH defines
+ - rl_history_search_flags: new variable, holds ANCHORED_SEARCH flag for
+ the duration of a history search
+ - rl_history_search_reinit: takes a new flags variable, defines whether
+ or not the search is anchored; assigned to rl_history_search_flags
+ - rl_history_serarch_reinit: if ANCHORED_SEARCH flag passed, add ^ to
+ beginning of search string; otherwise search string is unmodified
+ - rl_history_search_internal: set rl_point appropriately based on
+ whether or not rl_history_search_flags includes ANCHORED_SEARCH
+ - rl_history_substr_search_forward: new function, for non-anchored
+ substring search forward through history for string of characters
+ preceding rl_point
+ - rl_history_substr_search_backward: new function, for non-anchored
+ substring search backward through history for string of characters
+ preceding rl_point. Original code from Niraj Kulkarni
+ <kulkarniniraj14@gmail.com>
+
+lib/readline/readline.h
+ - extern declarations for rl_history_substr_search_{for,back}ward
+
+lib/readline/funmap.c
+ - history-substring-search-forward: new bindable command, invokes
+ rl_history_substr_search_forward
+ - history-substring-search-backward: new bindable command, invokes
+ rl_history_substr_search_backward
+
+lib/readline/doc/{rluser.texi,readline.3}
+ - document history-substring-search-forward and
+ history-substring-search-backward
+
+ 5/27
+ ----
+{nojobs,jobs}.c
+ - add support for DONT_REPORT_SIGTERM so that the shell doesn't print
+ a message when a job exits due to SIGTERM since that's the default
+ signal sent by the kill builtin. Suggested by Marc Herbert
+ <mark.herbert@gmail.com>
+
+config-top.h
+ - DONT_REPORT_SIGTERM: new user-modifiable setting. Commented out
+ by default
+
+ 5/28
+ ----
+lib/readline/bind.c
+ - _rl_skip_to_delim: skip to a closing double quote or other delimiter,
+ allowing backslash to quote any character, including the delimiter
+ - rl_parse_and_bind: call _rl_skip_to_delim instead of using inline
+ code
+ - rl_parse_and_bind: allow quoted strings as the values of string
+ variables. Variable values without double quotes have trailing
+ whitespace removed (which still allows embedded whitespace, for
+ better or worse). Fixes problem with string variables not matching
+ in `set' command if values happen to have trailing spaces or tabs
+ (debian bash bug #602762), but introduces slight incompatibility.
+
+ 5/29
+ ----
+doc/{bash.1,bashref.texi}
+ - clarify unset description to specify that without options, a
+ variable, then a shell function if there is no variable by that
+ name, is unset. Fixes discrepancy reported by Mu Qiao
+ <qiaomuf@gentoo.org>
+
+ 6/4
+ ----
+doc/{bash.1,bashref.texi}
+ - clarify description of LINES and COLUMNS (and checkwinsize shopt
+ option) to make it clear that only interactive shells set a
+ handler for SIGWINCH and update LINES and COLUMNS. Original
+ report submitted by Jonathan Nieder <jrnieder@gmail.com>
+
+arrayfunc.c
+ - expand_compound_array_assignment: defer expansion of words between
+ parens when performing compound assignmnt to an associative array
+ variable
+ - assign_compound_array_list: perform the same expansions when doing
+ a compound array assignment to an associative array variable as
+ when doing a straight array index assignment. The idea is that
+ foo=( [ind1]=bar [ind2]=quux)
+ is the same as
+ foo[ind1]=bar ; foo[ind2]=quux
+
+ This fixes problems with double-expansion and quote removal being
+ performed on the array indices
+
+ 6/13
+ ----
+doc/{bash.1,bashref.texi}
+ - Add a little text to make it clear that the locale determines how
+ range expressions in glob patterns are handled.
+
+
+ 6/21
+ ----
+builtins/read.def
+ - display a message and return error status if -a is used with an
+ existing associative array. Fixes bug reported by Curtis Doty
+ <curtis@greenkey.net>
+
+ 6/24
+ ----
+{jobs,nojobs}.c
+ - non-interactive shells now react to the setting of checkwinsize
+ and set LINES and COLUMNS after a foreground job exits. From a
+ suggestion by Leslie Rhorer <lrhorer@satx.rr.com>
+
+doc/{bash.1,bashref.texi}
+ - checkwinsize: remove language saying that only interactive shells
+ check the window size after each command
+
+lib/readline/histfile.c
+ - history_backupfile: new file, creates a backup history file name
+ given a filename (appending `-')
+ - history_do_write: when overwriting the history file, back it up
+ before writing. Restore backup file on a write error. Suggested
+ by chkno@chkno.net
+
+bashline.c
+ - find_cmd_name: two new arguments, return the start and end of the
+ actual text string used to find the command name, without taking
+ whitespace into account
+ - attempt_shell_completion: small changes to make sure that completion
+ attempted at the beginning of a non-empty line does not find a
+ programmable completion, even if the command name starts at point
+ - attempt_shell_completion: small change to make sure that completion
+ does not find a progcomp when in whitespace before the command
+ name
+ - attempt_shell_completion: small change to make sure that completion
+ does not find a progcomp when point is at the first character of a
+ command name, even when there is leading whitespace (similar to
+ above). Fixes problems noted by Ville Skytta <ville.skytta@iki.fi>
+
+subst.c
+ - brace_expand_word_list: since the individual strings in the strvec
+ returned by brace_expand are already allocated, don't copy them to
+ newly-allocated memory when building the WORD_LIST, just use them
+ intact
+
+locale.c
+ - locale_mb_cur_max: cache value of MB_CUR_MAX when we set or change
+ the locale to avoid a function call every time we need to read it
+
+shell.h
+ - new struct to save shell_input_line and associated variables:
+ shell_input_line_state_t
+ - add members of sh_parser_state_t to save and restore token and the
+ size of the token buffer
+
+parse.y
+ - {save,restore}_input_line_state: new functions to save and restore
+ shell_input_line and associated variables
+ - {save,restore}_parser_state: add code to save and restore the token
+ and token buffer size
+ - xparse_dolparen: call save_ and restore_input_line_state to avoid
+ problems with overwriting shell_input_line when we recursively
+ call the parser to parse a command substitution. Fixes bug
+ reported by Rui Santos <rsantos@grupopie.com>
+
+include/shmbutil.h
+ - use locale_mb_cur_max instead of MB_CUR_MAX in ADVANCE_CHAR and
+ similar macros
+
+lib/glob/smatch.c
+ - rangecmp,rangecmp_wc: change to take an additional argument, which
+ forces the use of strcoll/wscoll when non-zero. If it's 0, a new
+ variable `glob_asciirange' controls whether or not we use strcoll/
+ wscoll. If glob_asciirange is non-zero, we use straight
+ C-locale-like ordering. Suggested by Aharon Robbins
+ <arnold@skeeve.com>
+
+ 6/30
+ ----
+execute_cmd.c
+ - execute_pipeline: make sure the lastpipe code is protected by
+ #ifdef JOB_CONTROL. Fixes problem reported by Thomas Cort
+ <tcort@minix3.org>
+
+ 7/2
+ ---
+lib/readline/complete.c
+ - EXPERIMENTAL: remove setting of _rl_interrupt_immediately around
+ completion functions that touch the file system. Idea from Jan
+ Kratochvil <jan.ktratochvil@redhat.com> and the GDB development
+ team
+
+lib/readline/signals.c
+ - rl_signal_handler: if we're in callback mode, don't interrupt
+ immediately on a SIGWINCH
+
+ 7/3
+ ---
+bashline.c
+ - set_directory_hook: and its siblings are a new set of functions to
+ set, save, and restore the appropriate directory completion hook
+ - change callers to use {set,save,restore}_directory_hook instead of
+ manipulating rl_directory_rewrite_hook directly
+ - dircomplete_expand: new variable, defaults to 0, if non-zero causes
+ directory names to be word-expanded during word and filename
+ completion
+ - change {set,save,restore}_directory_hook to look at dircomplete_expand
+ and change rl_directory_completion_hook or rl_directory_rewrite_hook
+ appropriately
+
+bashline.h
+ - extern declaration for set_directory_hook so shopt code can use it
+
+ 7/6
+ ---
+builtins/shopt.def
+ - globasciiranges: new settable shopt option, makes glob ranges act
+ as if in the C locale (so b no longer comes between A and B).
+ Suggested by Aharon Robbins <arnold@skeeve.com>
+
+ 7/7
+ ---
+doc/{bash.1,bashref.texi}
+ - document new `globasciiranges' shopt option
+
+ 7/8
+ ---
+builtins/shopt.def
+ - direxpand: new settable option, makes filename completion expand
+ variables in directory names like bash-4.1 did.
+ - shopt_set_complete_direxpand: new function, does the work for the
+ above by calling set_directory_hook
+
+doc/{bash.1,bashref.texi}
+ - document new `direxpand' shopt option
+
+ 7/15
+ ----
+lib/readline/isearch.c
+ - _rl_isearch_dispatch: when adding character to search string, use
+ cxt->lastc (which we use in the switch statement) instead of c,
+ since lastc can be modified earlier in the function
+
+ 7/18
+ ----
+lib/readline/rlprivate.h
+ - _rl_search_context: add another member to save previous value of
+ (multibyte) lastc: pmb is to mb as prevc is to lastc
+
+lib/readline/isearch.c:
+ - _rl_isearch_dispatch: if a key sequence indexes into a new keymap,
+ but doesn't find any bound function (k[ind].function == 0) or is
+ bound to self-insert (k[ind].function == rl_insert), back up and
+ insert the previous character (the one that caused the index into a
+ new keymap) and arrange things so the current character is the next
+ one read, so both of them end up in the search string. Fixes bug
+ reported by Clark Wang <dearvoid@gmail.com>
+ - _rl_isearch_dispatch: a couple of efficiency improvements when adding
+ characters to the isearch string
+
+ 7/24
+ ----
+lib/readline/isearch.c
+ - _rl_isearch_dispatch: save and restore cxt->mb and cxt->pmb
+ appropriately when in a multibyte locale
+
+doc/{bash.1,bashref.texi}
+ - correct description of {x}>file (and other redirection operators
+ that allocate a file descriptor) to note the the fd range is
+ greater than or equal to 10. Fixes problem reported by
+ Christian Ullrich
+
+lib/readline/signals.c
+ - rl_signal_handler: don't interrupt immediately if in callback mode
+
+lib/readline/callback.c
+ - rl_callback_read_char: install signal handlers only when readline
+ has control in callback mode, so readline's signal handlers aren't
+ called when the application is active (e.g., between the calls to
+ rl_callback_handler_install and rl_callback_read_char). If the
+ readline signal handlers only set a flag, which the application
+ doesn't know about, the signals will effectively be ignored until
+ the next time the application calls into the readline callback
+ interface. Fixes problem of calling unsafe functions from signal
+ handlers when in callback mode reported by Jan Kratochvil
+ <jan.kratochvil@redhat.com>
+
+execute_cmd.c
+ - fix_assignment_words: when in Posix mode, the `command' builtin
+ doesn't change whether or not the command name it protects is an
+ assignment builtin. One or more instances of `command'
+ preceding `export', for instance, doesn't make `export' treat its
+ assignment statement arguments differently. Posix interpretation
+ #351
+
+doc/{bash.1,bashref.texi}
+ - document new Posix-mode behavior of `command' when preceding builtins
+ that take assignment statements as arguments
+
+builtins/printf.def
+ - printstr: if fieldwidth or precision are < 0 or > INT_MAX when
+ supplied explicitly (since we take care of the `-' separately),
+ clamp at INT_MAX like when using getint(). Fixes issue reported
+ by Ralph Coredroy <ralph@inputplus.co.uk>
+
+ 7/25
+ ----
+lib/readline/chardefs.h
+ - isxdigit: don't define if compiling with c++; declared as a c++
+ template function. Fixes bug reported by Miroslav Lichvar
+ <mlichvar@redhat.com>
+
+builtins/printf.def
+ - getint: if garglist == 0, return whatever getintmax returns (0).
+ Fixes bug reported by Ralph Coredroy <ralph@inputplus.co.uk>
+
+ 7/28
+ ----
+doc/{bash.1,bashref.texi}
+ - minor changes to the descriptions of the cd and pushd builtins
+
+lib/sh/zread.c
+ - zsyncfd: change variable holding return value from lseek to
+ off_t. Bug report and fix from Gregory Margo <gmargo@pacbell.net>
+
+ 8/1
+ ---
+expr.c
+ - don't check for division by 0 when in a context where no evaluation
+ is taking place. Fixes bug reported by dnade.ext@orange-ftgroup.com
+
+ 8/6
+ ---
+execute_cmd.c
+ - execute_command_internal: the parent branch of the subshell code
+ (where the child calls execute_in_subshell) should not close all
+ open FIFOs with unlink_fifo_list if it's part of a shell function
+ that's still executing. Fixes bug reported by Maarten Billemont
+ <lhunath@lyndir.com>
+
+ 8/9
+ ---
+builtins/common.c
+ - get_exitstat: return EX_BADUSAGE (2) on a non-numeric argument
+
+builtins/return.def
+ - return_builtin: just call get_exitstat to get the return status,
+ let it handle proper parsing and handling of arguments. Fixes
+ issue most recently raised by Linda Walsh <bash@tlinx.org>.
+ Reverses change from 9/11/2008 (see above)
+
+ 8/16
+ ----
+doc/{bash.1,bashref.texi}
+ - clean up `set -e' language to make it clearer that any failure of
+ a compound command will cause the shell to exit, not just subshells
+ and brace commands
+
+ 8/17
+ ----
+configure.in
+ - make the various XXX_FOR_BUILD variables `precious' to autoconf to
+ avoid stale data
+ - change how CC_FOR_BUILD is initialized when cross-compiling and not,
+ but do not change behavior
+ - initialize CFLAGS_FOR_BUILD to -g when cross-compiling
+ - initialize LIBS_FOR_BUILD to $(LIBS) when not cross-compiling, empty
+ when cross-compiling
+ - create AUTO_CFLAGS variable to hold basic CFLAGS defaults; used when
+ CFLAGS not inherited from environment (like effect of old
+ auto_cflags variable)
+ - substitute LIBS_FOR_BUILD into output Makefiles
+ [changes inspired by bug report from Nathan Phillip Brink
+ <ohnobinki@ohnopublishing.net> -- gentoo bug 378941]
+
+builtins/Makefile.in
+ - substitute LIBS_FOR_BUILD from configure, not strictly initialized
+ to $(LIBS)
+
+ 8/27
+ ----
+doc/{bash.1,bashref.texi}
+ - minor changes to the here string description to clarify the
+ expansions performed on the word
+
+support/shobj-conf
+ - handle compilation on Lion (Mac OS X 10.7/darwin11) with changes
+ to darwin stanzas. Fixes readline bug reported by Vincent
+ Sheffer <vince.sheffer@apisphere.com>
+
+lib/sh/strtrans.c
+ - ansic_wshouldquote: check a string with multi-byte characters for
+ characters that needs to be backslash-octal escaped for $'...'
+ - ansic_shouldquote: if is_basic fails for one character, let
+ ansic_wshouldquote examine the rest of the string and return what
+ it returns. From a patch sent by Roman Rakus <rrakus@redhat.com>
+
+ 8/30
+ ----
+lib/sh/strtrans.c
+ - ansic_quote: changes to quote (or not) multibyte characters. New
+ code converts them to wide characters and uses iswprint to check
+ valid wide chars. From a patch sent by Roman Rakus
+ <rrakus@redhat.com>
+
+ 9/7
+ ---
+lib/sh/shquote.c
+ - sh_backslash_quote: change to be table-driven so we can use a
+ different table if we want to
+ - sh_backslash_quote: takes a second char table[256] argument;
+
+externs.h
+ - sh_backslash_quote: add second argument to function prototype
+
+bashline.c,braces.c,parse.y,builtins/printf.def
+ - change callers of sh_backslash_quote to add second argument
+
+bashline.c
+ - filename_bstab: table of characters to pass to sh_backslash_quote;
+ characters with value 1 will be backslash-quoted
+ - set_filename_bstab: turn on characters in filename backslash-quote
+ table according to passed string argument
+ - call set_filename_bstab every time rl_filename_quote_characters is
+ assigned a value
+ - bash_quote_filename: call sh_backslash_quote with filename_bstab
+ as second argument. This allows other characters in filenames to
+ be quoted without quoting, for instance, a dollar sign in a shell
+ variable reference
+
+ 9/8
+ ---
+bashline.c
+ - complete_fullquote: new variable, controls table passed to
+ sh_backslash_quote. If non-zero (the default), the standard set
+ of shell metacharacters -- as in bash versions up to and including
+ bash-4.2 -- gets backslash-quoted by the completion code. If zero,
+ sh_backslash_quote gets the table with the characters in the
+ variable reference removed, which means they are removed from the
+ set of characters to be quoted in filenames
+
+ 9/10
+ ----
+bashline.c
+ - bash_filename_stat_hook: new function, designed to expand variable
+ references in filenames before readline passes them to stat(2)
+ to determine whether or not they are a directory
+
+ 9/15
+ ----
+builtins/declare.def
+ - if assign_array_element fails due to a bad (or empty) subscript, mark
+ it as an assignment error and don't attempt any further processing
+ of that declaration. Fixes segfault bug reported by Diego Augusto
+ Molina <diegoaugustomolina@gmail.com>
+
+ 9/19
+ ----
+expr.c
+ - exppower: replace the simple exponentiation algorithm with an
+ implementation of exponentiation by squaring. Inspired by report
+ from Nicolas ARGYROU <nargy@yahoo.com>
+
+bashline.c
+ - bash_quote_filename: check for rtext being non-null before
+ dereferencing it
+ - set_saved_history: operate_and_get_next assumes that the previous
+ line was added to the history, even when the history is stifled and
+ at the max number of entries. If it wasn't, make sure the history
+ number is incremented properly. Partial fix for bug reported by
+ gregrwm <backuppc-users@whitleymott.net>
+
+doc/{bash.1,bashref.texi},lib/readline/doc/{hsuser,rluser}.texi
+ - minor editorial changes inspired by suggestions from
+ Roger Zauner <rogerx.oss@gmail.com>
+
+ 9/20
+ ----
+lib/intl/localealias.c
+ - read_alias_file: close resource leak (fp) when returning on error
+
+ 9/22
+ ----
+execute_command.c
+ - execute_intern_function: implement Posix interpretation 383 by making
+ it an error to define a function with the same name as a special
+ builtin when in Posix mode.
+ http://austingroupbugs.net/view.php?id=383#c692
+
+ 9/25
+ ----
+doc/{bash.1,bashref.texi}
+ - formatting and some content changes from Benno Schulenberg
+ <bensberg@justemail.net>
+ - document new posix-mode behavior from interp 383 change of 9/22
+
+ 9/30
+ ----
+execute_cmd.c
+ - shell_execve: add strerror to error message about executable file
+ that shell can't execute as a shell script. From suggestion by
+ daysleeper <daysleeper@centrum.cz>
+
+ 10/1
+ ----
+bashhist.c
+ - maybe_add_history: act as if literal_history is set when parser_state
+ includes PST_HEREDOC, so we save the bodies of here-documents just
+ as they were entered. Fixes bug reported by Jonathan Wakely
+ <bugs@kayari.org>
+ - bash_add_history: make sure that the second and subsequent lines of
+ a here document don't have extra newlines or other delimiting
+ chars added, since they have the trailing newline preserved, when
+ `lithist' is set and history_delimiting_chars isn't called
+
+execute_cmd.c
+ - execute_command_internal: avoid fd exhaustion caused by using
+ process substitution in loops inside shell functions by using
+ copy_fifo_list and close_new_fifos (). Fixes debian bash bug
+ 642504
+
+lib/readline/complete.c
+ - new variable, rl_filename_stat_hook, used by append_to_match. If
+ filename completion is desired, and rl_filename_stat_hook points
+ to a function, call that function to expand the filename in an
+ application-specific way before calling stat.
+
+bashline.c
+ - bash_default_completion: if variable completion returns a single
+ match, use bash_filename_stat_hook and file_isdir to determine
+ whether or not the variable name expands to a directory. If it
+ does, set the filename_append_character to `/'. This is not
+ perfect, so we will see how it works out. Adds functionality
+ requested by Peter Toft <pto@linuxbog.dk> and Patrick Pfeifer
+ <patrick@pfeifer.de>
+ - rl_filename_stat_hook: assigned bash_filename_stat_hook, so things
+ like $HOME/Downloads (after completion) have a slash appended.
+ In general, this causes the stat hook to be called whenever
+ filename completion is appended. Adds functionality requested by
+ Patrick Pfeifer <patrick@pfeifer.de>
+
+lib/readline/readline.h
+ - new extern declaration for rl_filename_stat_hook
+
+lib/readline/doc/rltech.texi
+ - rl_directory_rewrite_hook: now documented
+ - rl_filename_stat_hook: document
+
+pcomplete.c
+ - gen_action_completions: in the CA_DIRECTORY case, turn off
+ rl_filename_completion_desired if it was off before we called
+ rl_filename_completion_function and we didn't get any matches.
+ Having it on causes readline to quote the matches as if they
+ were filenames. Adds functionality requested by many,
+ including Clark Wang <dearvoid@gmail.com>
+
+assoc.[ch]
+ - assoc_replace: new function, takes the same arguments as
+ assoc_insert, but returns the old data instead of freeing it
+ - assoc_insert: if the object returned by hash_insert doesn't have
+ the same value for its key as the key passed as an argument, we
+ are overwriting an existing value. In this case, we can free the
+ key. Fixes bug reported by David Parks <davidparks21@yahoo.com>
+
+ 10/5
+ ----
+print_cmd.c
+ - indirection_level_string: small change to only re-enable `x'
+ option after calling decode_prompt_string if it was on before. In
+ normal mode, it will be, but John Reiser <jreiser@bitwagon.com>
+ has a novel use for that code in conjunction with a pre-loaded
+ shared library that traces system call usage in shell scripts
+
+ 10/10
+ -----
+Makefile.in
+ - Fix from Mike Frysinger <vapier@gentoo.org> to avoid trying to
+ build y.tab.c and y.tab.h with two separate runs of yacc if
+ parse.y changes. Problem with parallel makes
+ - Fix from Mike Frysinger <vapier@gentoo.org> to avoid subdirectory
+ builds each trying to make version.h (and all its dependencies)
+
+lib/sh/Makefile.in
+ - remove some dependencies on version.h where it doesn't make sense
+
+variables.c
+ - initialize_shell_variables: while reading the environment, a shell
+ running in posix mode now checks for SHELLOPTS being readonly (it
+ gets set early on in main()) before trying to assign to it. It
+ saves an error message and the variable gets parsed as it should.
+ Fixes bug reported by Len Giambrone <Len.Giambrone@intersystems.com>
+
+ 10/14
+ -----
+doc/{bash.1,bashref.texi}
+ - add to the "duplicating file descriptors" description that >&word
+ doesn't redirect stdout and stderr if word expands to `-'
+ - add to the "appending standard output and standard error"
+ description a note that >&word, where word is a number or `-',
+ causes other redirection operators to apply for sh and Posix
+ compatibility reasons. Suggested by Greg Wooledge
+ <wooledg@eeg.ccf.org>
+
+ 10/15
+ -----
+pcomplete.c
+ - change pcomp_filename_completion_function to only run the filename
+ dequoting function in the cases (as best as it can figure) where
+ readline won't do it via rl_filename_completion_function. Based
+ on reports from <lolilolicon@gmail.com>
+
+ 10/19
+ -----
+bashline.c
+ - attempt_shell_completion: add call to set_directory_hook() to make
+ sure the rewrite functions are correct. It's cheap and doesn't
+ hurt
+ - command_word_completion_function: if completing a command name that
+ starts with `.' or `..', temporarily suppress the effects of the
+ `direxpand' option and restore the correct value after calling
+ rl_filename_completion_function. If it's enabled, the directory
+ name will be rewritten and no longer match `./' or `../'. Fixes
+ problem reported by Michael Kalisz <michael@kalisz.homelinux.net>
+
+ 10/22
+ -----
+builtins/history.def
+ - push_history: make sure remember_on_history is enabled before we
+ try to delete the last history entry -- the `history -s' command
+ might not have been saved. Fixes bug reported by
+ lester@vmw-les.eng.vmware.com
+
+lib/readline/complete.c
+ - rl_callback_read_char: add calls to a macro CALLBACK_READ_RETURN
+ instead of straight return; add same call at end of function.
+ Placeholder for future work in deinstalling signal handlers when
+ readline is not active
+
+ 10/25
+ -----
+expr.c
+ - exp2: catch arithmetic overflow when val1 == INTMAX_MIN and val2 == -1
+ for DIV and MOD and avoid SIGFPE. Bug report and pointer to fix
+ from Jaak Ristioja <jaak.ristioja@cyber.ee>
+ - expassign: same changes for arithmetic overflow for DIV and MOD
+
+ 10/28
+ -----
+subst.c
+ - parameter_brace_expand: allow pattern substitution when there is an
+ expansion of the form ${var/} as a no-op: replacing nothing with
+ nothing
+ - parameter_brace_patsub: don't need to check for PATSUB being NULL;
+ it never is
+
+flags.c
+ - if STRICT_POSIX is defined, initialize history_expansion to 0, since
+ history expansion (and its treatment of ! within double quotes) is
+ not a conforming posix environment. From austin-group issue 500
+
+lib/readline/histexpand.c
+ - history_expand: when processing a string within double quotes
+ (DQUOTE == 1), make the closing double quote inhibit history
+ expansion, as if the word were outside double quotes. In effect,
+ we assume that the double quote is followed by a character in
+ history_no_expand_chars. tcsh and csh seem to do this. This
+ answers a persistent complaint about history expansion
+
+ 10/29
+ -----
+make_cmd.c
+ - make_arith_for_command: use skip_to_delim to find the next `;'
+ when breaking the string between the double parens into three
+ separate components instead of a simple character loop. Fixes
+ bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 11/2
+ ----
+Makefile.in
+ - make libbuiltins.a depend on builtext.h to serialize its creation
+ and avoid conflict between multiple invocations of mkbuiltins.
+ Fix from Mike Frysinger <vapier@gentoo.org>
+
+ 11/5
+ ----
+findcmd.c
+ - user_command_matches: if stat(".", ...) returns -1, set st_dev
+ and st_ino fields in dotinfo to 0 to avoid same_file matches
+ - find_user_command_in_path: check stat(2) return the same way
+
+lib/glob/glob.c
+ - glob_vector: don't call strlen(pat) without checking pat == 0
+ - glob_dir_to_array: make sure to free `result' and all allocated
+ members before returning error due to malloc failure
+ - glob_vector: make sure to free `nextname' and `npat' on errors
+ (mostly when setting lose = 1)
+ - glob_vector: if flags & GX_MATCHDIRS but not GX_ALLDIRS, make
+ sure we free `subdir'
+ - glob_filename: when expanding ** (GX_ALLDIRS), make sure we
+ free temp_results (return value from glob_vector)
+
+lib/glob/xmbsrtowcs.c
+ - xdupmbstowcs: fix call to realloc to use sizeof (char *) instead
+ of sizeof (char **) when assigning idxtmp
+
+execute_cmd.c
+ - print_index_and_element: return 0 right away if L == 0
+ - is_dirname: fix memory leak by freeing `temp'
+ - time_command: don't try to deref NULL `command' when assigning
+ to `posix_time'
+ - shell_execve: null-terminate `sample' after READ_SAMPLE_BUF so it's
+ terminated for functions that expect that
+
+builtins/read.def
+ - read_builtin: don't call bind_read_variable with a potentially-null
+ string
+
+pcomplete.c
+ - gen_command_matches: don't call dispose_word_desc with a NULL arg
+ - gen_compspec_completions: fix memory leak by freeing `ret' before
+ calling gen_action_completions (tcs, ...). happens when
+ performing directory completion as default and no completions
+ have been generated
+ - gen_progcomp_completions: make sure to set foundp to 0 whenever
+ returning NULL
+ - it_init_aliases: fix memory leak by freeing alias_list before
+ returning
+
+bashline.c
+ - command_word_completion_function: don't call restore_tilde with a
+ NULL directory_part argument
+ - bash_directory_expansion: bugfix: don't throw away results of
+ rl_directory_rewrite_hook if it's set and returns non-zero
+ - bind_keyseq_to_unix_command: free `kseq' before returning error
+
+arrayfunc.c
+ - assign_array_element_internal: make sure `akey' is freed if non-null
+ before returning error
+ - assign_compound_array_list: free `akey' before returning error
+ - array_value_internal: free `akey' before returning error
+ - unbind_array_element: free `akey' before returning error
+
+subst.c
+ - array_length_reference: free `akey' before returning error in case
+ of expand_assignment_string_to_string error
+ - array_length_reference: free `akey' after call to assoc_reference
+ - skip_to_delim: if skipping process and command substitution, free
+ return value from extract_process_subst
+ - parameter_brace_substring: free `val' (vtype == VT_VARIABLE) before
+ returning if verify_substring_values fails
+ - parameter_brace_expand: remove two duplicate lines that allocate
+ ret in parameter_brace_substring case
+ - parameter_brace_expand: convert `free (name); name = xmalloc (...)'
+ to use `xrealloc (name, ...)'
+ - parameter_brace_expand: free `name' before returning when handling
+ ${!PREFIX*} expansion
+ - split_at_delims: fix memory leak by freeing `d2' before returning
+
+redir.c
+ - redirection_error: free `filename' if the redirection operator is
+ REDIR_VARASSIGN by assigning allocname
+
+eval.c
+ - send_pwd_to_eterm: fix memory leak by freeing value returned by
+ get_working_directory()
+
+builtins/cd.def
+ - change_to_directory: fix memory leak by freeing return value from
+ resetpwd()
+ - cd_builtin: fix memory leak by freeing value returned by dirspell()
+ - cd_builtin: fix memory leak by freeing `directory' if appropriate
+ before overwriting with return value from resetpwd()
+
+builtins/type.def
+ - describe_command: free `full_path' before overwriting it with return
+ value from sh_makepath
+
+builtins/complete.def
+ - compgen_builtin: fix memory leak by calling strlist_dispose (sl)
+ before overwriting sl with return value from completions_to_stringlist
+
+builtins/hash.def
+ - list_hashed_filename_targets: fix memory leak by freeing `target'
+
+make_cmd.c
+ - make_arith_for_command: free `init', `test', and `step' before
+ returning error on parse error
+
+jobs.c
+ - initialize_job_control: don't call move_to_high_fd if shell_tty == -1
+
+general.c
+ - check_dev_tty: don't call close with an fd < 0
+ - legal_number: deal with NULL `string' argument, return invalid
+
+lib/sh/fmtulong.c
+ - fmtulong: if the `base' argument is invalid, make sure we index
+ buf by `len-1' at maximum
+
+print_cmd.c
+ - print_deferred_heredocs: don't try to dereference a NULL `cstring'
+ - cprintf: make sure to call va_end (args)
+
+variables.c
+ - push_dollar_vars: fix call to xrealloc to use sizeof (WORD_LIST *)
+ instead of sizeof (WORD_LIST **)
+
+lib/sh/zmapfd.c
+ - zmapfd: if read returns error, free result and return -1 immediately
+ instead of trying to reallocate it
+
+ 11/6
+ ----
+execute_cmd.c
+ - cpl_reap: rewrote to avoid using pointer after freeing it; now builds
+ new coproc list on the fly while traversing the old one and sets the
+ right values for coproc_list when done
+
+ 11/12
+ -----
+builtins/set.def
+ - if neither -f nor -v supplied, don't allow a readonly function to
+ be implicitly unset. Fixes bug reported by Jens Schmidt
+ <jens.schmidt35@arcor.de>
+
+lib/readline/callback.c
+ - change CALLBACK_READ_RETURN to clear signal handlers before returning
+ from rl_callback_read_char so readline's signal handlers aren't
+ installed when readline doesn't have control. Idea from Jan
+ Kratochvil <jan.ktratochvil@redhat.com> and the GDB development
+ team
+
+pcomplete.h
+ - COPT_NOQUOTE: new complete/compgen option value
+
+builtins/complete.def
+ - noquote: new complete/compgen option; will be used to disable
+ filename completion quoting
+
+pcomplete.c
+ - pcomp_set_readline_variables: pay attention to COPT_NOQUOTE; turns
+ of rl_filename_quoting_desired if set; turns it on if unset (value
+ is inverted, since default is on)
+
+doc/bash.1,lib/readline/doc/rluser.texi
+ - document new -o noquote option to complete/compgen/compopt
+
+pathexp.c
+ - quote_string_for_globbing: if QGLOB_REGEXP, make sure characters
+ between brackets in an ERE bracket expression are not inappropriately
+ quoted with backslashes. This is a pretty substantial change,
+ should be stressed when opening bash up for alpha and beta tests.
+ Fixes bug pointed out by Stephane Chazleas
+ <stephane_chazelas@yahoo.fr>
+
+doc/{bash.1,bashref.texi}
+ - document that regexp matches can be inconsistent when quoting
+ characters in bracket expressions, since usual quoting characters
+ lose their meaning within brackets
+ - note that regular expression matching when the pattern is stored
+ in a shell variable which is quoted for expansion causes string
+ matching
+
+redir.h
+ - RX_SAVEFD: new flag value; notes that a redirection denotes an
+ fd used to save another even if it's not >= SHELL_FD_BASE
+
+redir.c
+ - do_redirection_internal: when deciding whether or not to reset the
+ close-on-exec flag on a restored file descriptor, trust the value
+ of redirect->flags & RX_SAVCLEXEC even if the fd is < SHELL_FD_BASE
+ if the RX_SAVEFD flag is set
+ - add_undo_redirect: set the RX_SAVEFD flag if the file descriptor
+ limit is such that the shell can't duplicate to a file descriptor
+ >= 10. Fixes a limitation that tripped a coreutils test reported
+ by Paul Eggert <eggert@cs.ucla.edu>
+
+ 11/19
+ -----
+doc/{bash.1,bashref.texi},lib/readline/doc/hsuser.texi
+ - make it clear that bash runs HISTFILESIZE=$HISTSIZE after reading
+ the startup files
+ - make it clear that bash runs HISTSIZE=500 after reading the
+ startup files
+ - make it clear that setting HISTSIZE=0 causes commands to not be
+ saved in the history list
+ - make it clear that setting HISTFILESIZE=0 causes the history file
+ to be truncated to zero size
+
+variables.c
+ - sv_histsize: change so setting HISTSIZE to a value less than 0
+ causes the history to be `unstifled'
+ - sv_histsize: change so setting HISTFILESIZE to a value less than 0
+ results in no file truncation
+ - make it clear that numeric values less than 0 for HISTFILESIZE or
+ HISTSIZE inhibit the usual functions
+
+ 11/23
+ -----
+parse.y
+ - save_input_line_state: add missing `return ls' at the end, since the
+ function is supposed to return its argument. Pointed out by
+ Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/read.def
+ - skip over NUL bytes in input, as most modern shells seem to. Bug
+ report by Matthew Story <matt@tablethotels.com>
+
+lib/readline/vi_mode.c
+ - rl_vi_replace: set _rl_vi_last_key_before_insert to invoking key
+
+ 11/25
+ -----
+builtins/read.def
+ - read_builtin: if xrealloc returns same pointer as first argument,
+ don't bother with the remove_unwind_protect/add_unwind_protect pair
+ - read_builtin: set a flag (`reading') around calls to zread/zreadc
+ and readline()
+ - sigalrm: change to set flag (`sigalrm_seen') and only longjmp if
+ currently in read(2) (reading != 0)
+ - CHECK_ALRM: new macro, checks sigalrm_seen and longjmps if non-zero,
+ behavior of old SIGALRM catching function
+ - read_builtin: call CHECK_ALRM in appropriate places while reading
+ line of input. Fixes bug reported by Pierre Gaston
+ <pierre.gaston@gmail.com>
+
+lib/readline/vi_mode.c
+ - rl_vi_replace: initialize characters before printing characters in
+ vi_replace_keymap to their default values in vi_insertion_keymap,
+ since we're supposed to be in insert mode replacing characters
+ - rl_vi_replace: call rl_vi_start_inserting to set last command to
+ `R' for undo
+ - rl_vi_replace: set _rl_vi_last_key_before_insert to `R' for future
+ use by _rl_vi_done_inserting
+ - vi_save_insert_buffer: new function, broke out code that copies text
+ into vi_insert_buffer from _rl_vi_save_insert
+ - _rl_vi_save_replace: new function, saves text modified by
+ rl_vi_replace (using current point and vi_replace_count to figure
+ it out) to vi_replace_buffer
+ - _rl_vi_save_insert: call vi_save_insert_buffer
+ - _rl_vi_done_inserting: if _rl_vi_last_key_before_insert == 'R', call
+ _rl_vi_save_replace to save text modified in replace mode (uses
+ vi_save_insert_buffer)
+ - _rl_vi_replace_insert: new function, replaces the number of chars
+ in vi_insert_buffer after rl_point with contents ov vi_insert_buffer
+ - rl_vi_redo: call _rl_vi_replace_insert if last command == 'R' and
+ there's something in vi_insert_buffer. Fixes bug with `.' not
+ redoing the most recent `R' command, reported by Geoff Clare
+ <g.clare@opengroup.org> in readline area on savannah
+
+ 11/26
+ -----
+lib/readline/rlprivate.h
+ - RL_SIG_RECEIVED(): evaluate to non-zero if there is a pending signal
+ to be handled
+ - RL_SIGINT_RECEIVED(): evaluate to non-zero if there is a pending
+ SIGINT to be handled
+
+lib/readline/complete.c
+ - remove all mention of _rl_interrupt_immediately
+ - rl_completion_matches: check RL_SIG_RECEIVED after each call to
+ the entry function, call RL_CHECK_SIGNALS if true to handle the
+ signal
+ - rl_completion_matches: if RL_SIG_RECEIVED evaluates to true, free
+ and zero out the match_list this function allocated
+ - rl_completion_matches: if the completion entry function is
+ rl_filename_completion_function, free the contents of match_list,
+ because that function does not keep state and will not free the
+ entries; avoids possible memory leak pointed out by
+ Garrett Cooper <yanegomi@gmail.com>
+ - gen_completion_matches: if RL_SIG_RECEIVED evalutes to true after
+ calling rl_attempted_completion_function, free the returned match
+ list and handle the signal with RL_CHECK_SIGNALS; avoids
+ possible memory leak pointed out by Garrett Cooper
+ <yanegomi@gmail.com>
+ - gen_completion_matches: if RL_SIG_RECEIVED evaluates to true after
+ calling rl_completion_matches, free the returned match list and
+ handle the signal with RL_CHECK_SIGNALS
+
+lib/readline/util.c
+ - rl_settracefp: new utility function to set the tracing FILE *
+
+lib/readline/signals.c
+ - _rl_sigcleanup: pointer to a function that will be called with the
+ signal and a void * argument from _rl_handle_signal
+ - _rl_sigcleanarg: void * that the rest of the code can set to have
+ passed to the signal cleanup function
+ - _rl_handle_signal: if _rl_sigcleanup set, call as
+ (*_rl_sigcleanup) (sig, _rl_sigcleanarg)
+
+lib/readline/rlprivate.h
+ - extern declarations for _rl_sigcleanup and _rl_sigcleanarg
+
+lib/readline/complete.c
+ - _rl_complete_sigcleanup: signal cleanup function for completion code;
+ calls _rl_free_match_list on _rl_sigcleanarg if signal == SIGINT
+ - rl_complete_internal: before calling display_matches if what_to_do
+ == `?', set _rl_sigcleanup to _rl_complete_sigcleanup so the match
+ list gets freed on SIGINT; avoids possible memory leak pointed out
+ by Garrett Cooper <yanegomi@gmail.com>
+ - rl_complete_internal: in default switch case, call _rl_free_match_list
+ before returning to avoid memory leak
+
+doc/bashref.texi
+ - start at a set of examples for the =~ regular expression matching
+ operator, touching on keeping the pattern in a shell variable and
+ quoting portions of the pattern to remove their special meaning
+
+ 12/1
+ ----
+lib/glob/gmisc.c
+ - extglob_pattern: new function, returns 1 if pattern passed as an
+ argument looks like an extended globbing pattern
+
+lib/glob/glob.c
+ - skipname: return 0 immediately if extglob_pattern returns non-zero,
+ let the extended globbing code do the right thing with skipping
+ names beginning with a `.'
+ - mbskipname: return 0 immediately if extglob_pattern returns non-zero,
+ let the extended globbing code do the right thing with skipping
+ names beginning with a `.'. Fixes bug reported by Yongzhi Pan
+ <panyongzhi@gmail.com>
+
+ 12/2
+ ----
+lib/glob/smatch.c
+ - patscan, patscan_wc: no longer static so other parts of the glob
+ library can use them, renamed to glob_patscan, glob_patscan_wc
+
+lib/glob/glob.c
+ - extern declarations for glob_patscan, glob_patscan_wc
+ - wchkname: new function, does skipname on wchar_t pattern and dname,
+ old body of mbskipname after converting to wide chars
+ - extglob_skipname: new function, checks all subpatterns in an extglob
+ pattern to determine whether or not a filename should be skipped.
+ Calls skipname for each subpattern. Dname is only skipped if all
+ subpatterns indicate it should be. Better fix for bug reported by
+ Yongzhi Pan <panyongzhi@gmail.com>
+ - wextglob_skipname: wide-char version of extglob_skipname, calls
+ wchkname instead of calling back into mbskipname for each
+ subpattern to avoid problems with char/wchar_t mismatch
+ - skipname: call extglob_skipname if extglob_pattern returns non-zero
+ - mbskipname: call wextglob_skipname if extglob_pattern returns non-zero
+ - mbskipname: short-circuit immediately if no multibyte chars in
+ pattern or filename
+
+execute_cmd.c
+ - execute_cond_node: added parens to patmatch assignment statement to
+ make intent clearer
+
+ 12/3
+ ----
+configure.in,config.h.in
+ - check for imaxdiv, define HAVE_IMAXDIV if present
+
+expr.c
+ - expassign, exp2: use imaxdiv if available. Doesn't help with checks
+ for overflow from 10/25
+
+ 12/6
+ ----
+lib/readline/complete.c
+ - compute_lcd_of_matches: if we're ignoring case in the matches, only
+ use what the user typed as the lcd if it matches the first match
+ (after sorting) up to the length of what was typed (if what the
+ user typed is longer than the shortest of the possible matches, use
+ the shortest common length of the matches instead). If it doesn't
+ match, use the first of the list of matches, as if case were not
+ being ignored. Fixes bug reported by Clark Wang
+ <dearvoid@gmail.com>
+
+ 12/7
+ ----
+builtins/cd.def
+ - cd_builtin: add code to return error in case cd has more than one
+ non-option argument, conditional on CD_COMPLAINS define (which is
+ not defined anywhere)
+
+doc/{bash.1,bashref.texi}
+ - note that additional arguments to cd following the directory name
+ are ignored. Suggested by Vaclav Hanzl <hanzl@noel.feld.cvut.cz>
+
+ 12/10
+ -----
+lib/readline/input.c
+ - rl_read_key: don't need to increment key sequence length here; doing
+ it leads to an off-by-one error
+
+lib/readline/macro.c
+ - rl_end_kbd_macro: after off-by-one error with rl_key_sequence_length
+ fixed, can decrement current_macro_index by rl_key_sequence_length
+ (length of key sequence that closes keyboard macro)
+
+lib/readline/readline.c
+ - _rl_dispatch_subseq: fix extra increment of rl_key_sequence_length
+ when ESC maps to a new keymap and we're converting meta characters
+ to ESC+key
+ - _rl_dispatch_subseq: better increment of rl_key_sequence_length
+ before we dispatch to a function in the ISFUNC case (where the
+ second increment above should have happened)
+ - rl_executing_keyseq: the full key sequence that ended up executing
+ a readline command. Available to the calling application, maintained
+ by _rl_dispatch_subseq, indexed by rl_key_sequence_length
+ - rl_executing_key: the key that was bound to the currently-executing
+ readline command. Same as the `key' argument to the function
+
+lib/readline/readline.h
+ - rl_executing_keyseq: extern declaration
+ - rl_executing_key: extern declaration
+ - rl_key_sequence_length: declaration moved here from rlprivate.h,
+ now part of public interface
+
+lib/readline/rlprivate.h
+ - new extern declaration for _rl_executing_keyseq_size, buffer size
+ for rl_executing_keyseq
+
+lib/readline/doc/rltech.texi
+ - documented new variables: rl_executing_key, rl_executing_keyseq,
+ rl_key_sequence_length
+
+ 12/13
+ -----
+bashline.c
+ - bash_execute_unix_command: replace ad-hoc code that searches
+ cmd_xmap for correct command with call to rl_function_of_keyseq
+ using rl_executing_keyseq; now supports key sequences longer
+ than two characters. Fixes bug reported by Michael Kazior
+ <kazikcz@gmail.com>
+
+ 12/15
+ -----
+make_cmd.c
+ - make_function_def: don't null out source_file before calling
+ make_command so it can be used later on when the function definition
+ is executed
+
+execute_cmd.c
+ - execute_intern_function: second argument is now FUNCTION_DEF *
+ instead of COMMAND *
+ - execute_command_internal: call execute_intern_function with the
+ new second argument (the entire FUNCTION_DEF instead of just the
+ command member)
+ - execute_intern_function: if DEBUGGER is defined, call
+ bind_function_def before calling bind_function, just like
+ make_function_def does (might be able to take out the call in
+ make_function_def depending on what the debugger does with it).
+ Fixes bug reported by <dethrophes@motd005>
+
+expr.c
+ - more minor changes to cases of INTMAX_MIN % -1 and INTMAX_MIN / 1;
+ fix typos and logic errors
+
+ 12/16
+ -----
+bashline.c
+ - find_cmd_start: change flags to remove SD_NOSKIPCMD so it skips over
+ command substitutions and doesn't treat them as command separators
+ - attempt_shell_completion: instead of taking first return from
+ find_cmd_name as command name to use for programmable completion,
+ use loop to skip over assignment statements. Fixes problem reported
+ by Raphael Droz <raphael.droz+floss@gmail.com>
+ - attempt_shell_completion: if we don't find a command name but the
+ command line is non-empty, assume the other words are all assignment
+ statements and flag that point is in a command position so we can
+ do command name completion
+ - attempt_shell_completion: if the word being completed is the first
+ word following a series of assignment statements, and the
+ command line is non-empty, flag that point is in a command position
+ so we can do command name completion
+
+lib/readline/history.c
+ - history_get_time: atol -> strtol
+
+ 12/18
+ -----
+parse.y
+ - parser_in_command_position: external interface to the
+ command_token_position macro for use by other parts of the shell,
+ like the completion mechanism
+
+externs.h
+ - extern declaration for parser_in_command_position
+
+ 12/19
+ -----
+
+builtins/read.def
+ - read_builtin: make sure all calls to bind_read_variable are passed
+ a non-null string. Fixes bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+bashline.c
+ - attempt_shell_completion: mark that we're in a command position if
+ we're at the start of the line and the parser is ready to accept
+ a reserved word or command name. Feature most recently suggested
+ by Peng Yu <pengyu.ut@gmail.com>
+
+ 12/21
+ -----
+lib/readline/bind.c
+ - _rl_escchar: return the character that would be backslash-escaped
+ to denote the control character passed as an argument ('\n' -> 'n')
+ - _rl_isescape: return 1 if character passed is one that has a
+ backslash escape
+ - _rl_untranslate_macro_value: new second argument: use_escapes, if
+ non-zero translate to backslash escapes where possible instead of
+ using straight \C-x for control character `x'. Change callers
+ - _rl_untranslate_macro_value: now global
+
+lib/readline/rlprivate.h
+ - _rl_untranslate_macro_value: extern declaration
+
+lib/readline/{macro.c,readline.h}
+ - rl_print_last_kbd_macro: new bindable function, inspired by patch
+ from Mitchel Humpherys
+
+lib/readline/funmap.c
+ - print-last-kbd-macro: new bindable command, bound to
+ rl_print_last_kbd_macro
+
+lib/readline/doc/{rluser.texi,readline.3},doc/bash.1
+ - print-last-kbd-macro: document.
+
+lib/readline/text.c
+ - _rl_insert_next: if we're defining a macro, make sure the key gets
+ added to the macro text (should really audit calls to rl_read_key()
+ and make sure the right thing is happening for all of them)
+
+bashline.[ch]
+ - print_unix_command_map: new function, prints all bound commands in
+ cmd_xmap using rl_macro_dumper in a reusable format
+
+builtins/bind.def
+ - new -X option: print all keysequences bound to Unix commands using
+ print_unix_command_map. Feature suggested by Dennis Williamson
+ (2/2011)
+
+doc/{bash.1,bashref.texi}
+ - document new `bind -X' option
+
+ 12/24
+ -----
+
+doc/{bash.1,bashref.texi}
+ - add a couple of sentences to the description of the case modification
+ operators making it clearer that each character of parameter is
+ tested against the pattern, and that the pattern should only attempt
+ to match a single character. Suggested by Bill Gradwohl
+ <bill@ycc.com>
+
+ 12/28
+ -----
+shell.c
+ - init_noninteractive: instead of calling set_job_control(0) to
+ unconditionally turn off job control, turn on job control if
+ forced_interactive or jobs_m_flag is set
+ - shell_initialize: call initialize_job_control with jobs_m_flag as
+ argument so `bash -m script' enables job control while running the
+ script
+
+jobs.c
+ - initialize_job_control: if the `force' argument is non-zero, turn on
+ job control even if the shell is not currently interactive
+ (interactive == 0)
+
+ 12/29
+ -----
+
+flags.h
+ - new extern declaration for jobs_m_flag
+
+builtins/{cd,set}.def,doc/{bash.1,bashref.texi}
+ - added text clarifying the descriptions of cd -L and -P, suggested by
+ Padraig Brady <p@draigbrady.com>
+ - slight change to the description of `set -P' about resolving symbolic
+ links
+
+lib/readline/doc/rluser.texi
+ - Added an example to the programmable completion section: _comp_cd,
+ a completion function for cd, with additional verbiage. Text
+ includes a reference to the bash_completion project
+
+ 1/1/2012
+ --------
+jobs.c
+ - set_job_status_and_cleanup: note that a job is stopped due to
+ SIGTSTP (any_tstped) if job_control is set; there's no need to
+ test interactive
+
+ 1/5
+ ---
+quit.h
+ - LASTSIG(): new macro, expands to signal number of last terminating
+ signal received (terminating_signal or SIGINT)
+
+trap.c
+ - first_pending_trap: returns lowest signal number with a trap pending
+ - trapped_signal_received: set to the last trapped signal the shell
+ received in trap_handler(); reset to 0 in run_pending_traps
+
+builtins/read.def
+ - read_builtin: changes to posix-mode (posixly_correct != 0) to make
+ `read' interruptible by a trapped signal. After the trap runs,
+ read returns 128+sig and does not assign the partially-read line
+ to the named variable(s). From an austin-group discussion started
+ by David Korn
+
+ 1/11
+ ----
+doc/{bash.1,bashref.texi}
+ - slight changes to the descriptions of the compat32 and compat40 shell
+ options to clarify their meaning
+
+ 1/12
+ ----
+lib/readline/{colors.[ch],parse-colors.[ch]}
+ - new files, part of color infrastructure support
+
+Makefile.in,lib/readline/Makefile.in
+ - arrange to have colors.o and parse-colors.o added to readline
+ library
+
+{configure,config.h}.in
+ - check for stdbool.h, define HAVE_STDBOOL_H if found
+
+ 1/14
+ ----
+lib/readline/bind.c
+ - colored_stats: new bindable variable, enables using colors to
+ indicate file type when listing completions
+
+lib/readline/complete.c
+ - _rl_colored_stats: new variable, controlled by colored-stats bindable
+ variable
+ - colored_stat_start, colored_stat_end: new functions to set and reset
+ the terminal color appropriately depending on the type of the
+ filename to be printed
+ - print_filename: changes to print colors if `colored-stats' variable
+ set. Changes contributed by Raphael Droz
+ <raphael.droz+floss@gmail.com>
+
+lib/readline/readline.c
+ - rl_initialize_everything: add call to _rl_parse_colors to parse
+ color values out of $LS_COLORS. May have to add to rl_initialize
+ to make more dynamic if LS_COLORS changes (which doesn't happen
+ very often, if at all)
+
+lib/readline/rlprivate.h
+ - _rl_colored_stats: new extern declaration
+
+lib/readline/doc/{readline.3,rluser.texi},doc/bash.1
+ - colored-stats: document new bindable readline variable
+
+lib/readline/colors.c
+ - _rl_print_color_indicator: call rl_filename_stat_hook before calling
+ lstat/stat so we can get color indicators for stuff like
+ $HOME/Applications
+
+lib/readline/complete.c
+ - stat_char: call rl_filename_stat_hook before calling lstat/stat
+
+findcmd.[ch],execute_cmd.c
+ - search_for_command: now takes a second `flags' argument; changed
+ header function prototype and callers
+ - search_for_command: if (flags & 1), put the command found in $PATH
+ into the command hash table (previous default behavior)
+
+execute_cmd.c
+ - is_dirname: call search_for_command with flags argument of 0 so it
+ doesn't try to put something in the command hash table
+
+bashline.c
+ - bash_command_name_stat_hook: a hook function for readline's
+ filename_stat_hook that does $PATH searching the same way that
+ execute_cmd.c:execute_disk_command() does it, and rewrites the
+ passed filename if found. Does not put names into command hash
+ table. This allows command name completion to take advantage
+ of `visible-stats' and `colored-stats' settings.
+ - executable_completion: new function, calls the directory completion
+ hook to expand the filename before calling executable_file or
+ executable_or_directory; change command_word_completion_function to
+ call executable_completion. This allows $HOME/bin/[TAB] to do
+ command completion and display alternatives
+
+ 1/17
+ ----
+pcomplete.c
+ - gen_command_matches: now takes a new second argument: the command
+ name as deciphered by the programmable completion code and used
+ to look up the compspec; changed callers (gen_compspec_completions)
+ - gen_shell_function_matches: now takes a new second argument: the
+ command that originally caused the completion function to be
+ invoked; changed callers (gen_compspec_completions))
+ - build_arg_list: now takes a new second argument: the command name
+ corresponding to the current compspec; changed callers
+ (gen_command_matches, gen_shell_function_matches)
+ - build_arg_list: now uses `cmd' argument to create $1 passed to
+ invoked command or shell function
+ - gen_compspec_completions: if we skipped a null command at the
+ beginning of the line (e.g., for completing `>'), add a new word for
+ it at the beginning of the word list and increment nw and cw
+ appropriately. This is all a partial fix for the shortcoming
+ pointed out by Sung Pae <sungpae@gmail.com>
+
+ 1/18
+ ----
+
+{configure,config.h}.in
+ - new check: check for AUDIT_USER_TTY defined in <linux/audit.h>,
+ define HAVE_DECL_AUDIT_USER_TTY if both are found
+
+lib/readline/rlconf.h
+ - ENABLE_TTY_AUDIT_SUPPORT: new define, allows use of the Linux kernel
+ tty auditing system if it's available and enabled
+
+lib/readline/util.c
+ - _rl_audit_tty: new function, send a string to the kernel tty audit
+ system
+
+lib/readline/rlprivate.h
+ - _rl_audit_tty: new extern declaration
+
+lib/readline/readline.c
+ - readline: call _rl_audit_tty with line to be returned before returning
+ it if the Linux tty audit system is available and it's been enabled
+ in rlconf.h Original patch from Miroslav Trmac; recent request
+ from Miroslav Lichvar <mlichvar@redhat.com>
+
+ 1/21
+ ----
+
+lib/readline/readline.c:
+ - _rl_dispatch_subseq: add an inter-character timeout for multi-char
+ key sequences. Suggested by <rogerx.oss@gmail.com>. Still needs
+ work to make a user-settable variable
+
+parse.y
+ - shell_getc: make code that uses the pop_alias dependent on ALIAS
+ define
+
+variables.h
+ - sv_tz: extern define should only depend on HAVE_TZSET
+
+expr.c
+ - expr_streval: if ARRAY_VARS is not defined, set lvalue->ind to -1;
+ move assignment to `ind' inside define
+ - expr_bind_array_element: declaration and uses need to be #ifdef
+ ARRAY_VARS
+
+arrayfunc.h
+ - AV_ALLOWALL, AV_QUOTED, AV_USEIND: define to 0 if ARRAY_VARS not
+ defined; used in subst.c unconditionally
+
+sig.h
+ - make the signal blocking functions not dependent on JOB_CONTROL
+
+sig.c
+ - sigprocmask: make the replacement definition not dependent on
+ JOB_CONTROL
+
+trap.c
+ - use BLOCK_SIGNAL/UNBLOCK_SIGNAL instead of code dependent on
+ HAVE_POSIX_SIGNALS and BSD signals
+
+ 1/24
+ ----
+
+print_cmd.c
+ - print_redirection_list: change the conditions under which
+ r_duplicating_output_word is mapped to r_err_and_out to more or
+ less match those used in redir.c. Fixes bug pointed out by
+ Dan Douglas <ormaaj@gmail.com>
+
+
+ 1/29
+ ----
+lib/readline/signals.c
+ - _rl_block_sigwinch,_rl_release_sigwinch: don't compile in bodies
+ unless SIGWINCH is defined. Fixes bug reported by Pierre Muller
+ <pierre.muller@ics-cnrs.unistra.fr>
+
+doc/{bash.1,bashref.texi}
+ - small modifications to the introduction to the REDIRECTION section
+ to describe how redirections can modify file handles
+ - small modification to the section describing base#n to make it
+ clearer that n can be denoted using non-numerics. From a posting
+ by Linda Walsh <bash@tlinx.org>
+
+ 2/2
+ ---
+builtins/printf.def
+ - printf_builtin: make sure vbuf is intialized and non-null when -v
+ is supplied, since other parts of the code assume that it's not
+ null (e.g., bind_printf_variable()). Fixes bug reported by Jim
+ Avera <james_avera@yahoo.com>
+
+ 2/4
+ ---
+lib/readline/undo.c
+ - _rl_free_undo_list: new function, old body of rl_free_undo_list,
+ frees undo entries in UNDO_LIST * passed as argument
+ - rl_free_undo_list: call _rl_free_undo_list
+
+lib/readline/rlprivate.h
+ - _rl_free_undo_list: new extern declaration
+ - _rl_keyseq_timeout: new extern declaration (see below)
+
+lib/readline/misc.c
+ - rl_clear_history: new function. Clears the history list and frees
+ all associated data similar to history.c:clear_history(), but
+ takes rl_undo_list into account and frees and UNDO_LISTs saved as
+ `data' members of a history list entry
+
+lib/readline/doc/rltech.texi
+ - rl_clear_history: documented
+
+lib/readline/readline.c
+ - _rl_keyseq_timeout: new variable to hold intra-key timeout value
+ from 1/21 fix; specified in milliseconds. Default value is 500
+ - _rl_dispatch_subseq: change to use _rl_keyseq_timeout as intra-key
+ timeout if it's greater than 0; no timeout if <= 0
+ - _rl_dispatch_subseq: don't check for queued keyboard input if we have
+ pushed or pending input, or if we're reading input from a macro
+
+lib/readline/bind.c
+ - keyseq-timeout: new bindable variable, shadows _rl_keyseq_timeout
+ - string_varlist: add keyseq-timeout
+ - sv_seqtimeout: new function to modify value of _rl_keyseq_timeout;
+ clamps negative values at 0 for now
+ - _rl_get_string_variable_value: return value for keyseq-timeout
+
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+ - keyseq-timeout: documented
+
+lib/readline/isearch.c
+ - _rl_isearch_dispatch: modification to fix from 7/18 to not use
+ cxt->keymap and cxt->okeymap, since by the time this code is
+ executed, they are equal. Use `f' to check for rl_insert or
+ unbound func
+ - _rl_isearch_dispatch: if we're switching keymaps, not in
+ callback mode, and don't have pending or pushed input, use
+ _rl_input_queued to resolve a potentially ambiguous key sequence.
+ Suggested by Roger Zauner <rogerx.oss@gmail.com>
+ - _rl_isearch_dispatch: if we have changed keymaps and resolved to
+ an editing function (not self-insert), make sure we stuff the
+ right characters back onto the input after changing the keymap
+ back so the right editing function is executed after the search
+ is terminated. Rest of fix for bug reported by Roger Zauner
+ <rogerx.oss@gmail.com>
+
+ 2/5
+ ---
+builtins/gen-helpfiles.c
+ - new file: reads struct builtin and writes the long docs to files
+ in the `helpdirs' subdirectory. The filename is given in the
+ previously-unused `handle' member of the struct builtin. Links
+ with `tmpbuiltins.o', which is created by Makefile to have the
+ right long documentation. When not cross-compiling, gets the
+ right #defines based on configuration options from config.h instead
+ of trying to parse conditional parts of def files. Fixes
+ shortcoming pointed out by Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/Makefile.in
+ - tmpbuiltins.c: new generated file, created to enable creation of
+ separate helpfiles based on correct #defines instead of trying to
+ parse conditional parts of def files
+ - gen-helpfiles: new program to generate helpfiles, links with
+ tmpbuiltins.o
+ - HELPFILES_TARGET: new target, substituted by configure to `helpdoc'
+ if separate helpfiles requested
+ - targets: new target, libbuiltins.a and $(HELPFILES_TARGET)
+ - CREATED_OBJECTS: new variable, holds created object files for
+ make clean; changed make clean to remove created objects
+ - helpdoc: changed to call gen-helpfiles instead of mkbuiltins
+
+Makefile.in
+ - when building libbuiltins.a, recursively call make with `targets'
+ argument to make sure separate helpfiles get built
+
+configure.in
+ - substitute `helpdoc' as value of HELPFILES_TARGET if
+ --enable-separate-helpfiles supplied as configure argument
+
+builtins/mkbuiltins.c
+ - `-nofunctions': new argument, causes mkbuiltins to not write value
+ for function implementing a particular builtin to struct builtin
+ and to write document file name to `handle' member of struct builtin
+ - no longer writes separate helpfiles; that is left to gen-helpfiles
+
+ 2/8
+ ---
+subst.c
+ - make sure last_command_exit_value is set to a non-zero value before
+ any calls to report_error, since `-e' set will short-circuit
+ report_error. Fixes bug reported by Ewan Mellor
+ <Ewan.Mellor@eu.citrix.com>
+
+variables.c
+ - make_local_array_variable: added second argument; if non-zero,
+ function will return an existing local associative array variable
+ instead of insisting on an indexed array
+
+variable.h,subst.c
+ - make_local_array_variable: changed prototype and caller
+
+builtins/declare.def
+ - declare_internal: add second arg to call to make_local_array_variable;
+ making_array_special, which indicates we're processing an
+ assignment like declare a[b]=c. Fixes seg fault resulting from
+ a being an already-declared local associative array variable in a
+ function. Ubuntu bash bug 928900.
+
+ 2/14
+ ----
+
+execute_cmd.c
+ - execute_command_internal: if redirections into or out of a loop fail,
+ don't try to free ofifo_list unless saved_fifo is non-zero. It's
+ only valid if saved_fifo is set
+
+ 2/15
+ ----
+{arrayfunc,braces,variables}.c
+ - last_command_exit_value: make sure it's set before any calls to
+ report_error, since -e will cause that to exit the shell
+
+builtins/common.c
+ - get_job_by_name: call internal_error instead of report_error so this
+ doesn't exit the shell
+
+ 2/18
+ ----
+builtins/evalstring.c
+ - parse_and_execute: make sure the file descriptor to be redirected to
+ is 1 before calling cat_file. One fix for bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+parse.y
+ - read_token_word: don't return NUMBER if a string of all digits
+ resolves to a number that overflows the bounds of an intmax_t.
+ Other fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 2/19
+ ----
+lib/sh/strtrans.c
+ - ansicstr: use 0x7f as the boundary for characters that translate
+ directly from ASCII to unicode (\u and \U escapes) instead of
+ UCHAR_MAX, since everything >= 0x80 requires more than one byte.
+ Bug and fix from John Kearney <dethrophes@web.de>
+
+builtins/printf.def
+ - tescape: ditto for printf \u and \U escape sequences
+
+ 2/20
+ ----
+lib/sh/unicode.c
+ - u32toutf8: fix to handle encodings up to six bytes long correctly
+ (though technically UTF-8 only has characters up to 4 bytes long).
+ Report and fix from John Kearney <dethrophes@web.de>
+ - u32toutf8: first argument is now an unsigned 32-bit quantity,
+ changed callers (u32cconv) to pass c instead of wc
+ - u32reset: new function, resets local static state to uninitialized
+ (locale information, currently)
+
+locale.c
+ - call u32reset whenever LC_CTYPE/LC_ALL/LANG is changed to reset the
+ cached locale information used by u32cconv. From a report from
+ John Kearney <dethrophes@web.de>
+
+ 2/21
+ ----
+doc/{bash,builtins}.1
+ - minor changes from Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+lib/sh/unicode.c
+ - u32cconv: only assume you can directly call wctomb on the passed
+ value if __STDC_ISO_10646__ is defined and the value is <=
+ 0x7fffffff
+ - stub_charset: return locale as default instead of "ASCII", let
+ rest of code decide what to do with it
+
+lib/readline/parens.c
+ - _rl_enable_paren_matching: make paren matching work in vi insert
+ mode. Bug report from <derflob@derflob.de>
+
+ 2/22
+ ----
+lib/sh/shquote.c
+ - sh_backslash_quote: quote tilde in places where it would be
+ expanded. From a report from John Kearney <dethrophes@web.de>
+
+ 2/23
+ ----
+execute_cmd.c
+ - execute_pipeline: wrap the discard_unwind_frame call in #ifdef
+ JOB_CONTROL, since the frame is only created if JOB_CONTROL is
+ defined. Bug and fix from Doug Kehn <rdkehn@yahoo.com>
+
+ 2/25
+ ----
+error.c
+ - report_error: make sure last_command_exit_value is non-zero before
+ we call exit_shell, since the exit trap may reference it. Call
+ exit_shell with last_command_exit_value to allow exit statuses
+ other than 1
+
+unicode.c
+ - stub_charset: use local static buffer to hold charset, don't change
+ value returned by get_locale_var. Based on idea and code from
+ John Kearney <dethrophes@web.de>
+ - u32toutf16: function to convert unsigned 32-bit value (unicode) to
+ UTF-16. From John Kearney <dethrophes@web.de>
+ - u32cconv: call u32toutf16 if __STDC_ISO_10646__ defined and wchar_t
+ is two bytes, send result to wcstombs, return if not encoding error.
+ From John Kearney <dethrophes@web.de>
+ - u32cconv: return UTF-8 conversion if iconv conversion to local
+ charset is unsupported
+
+ 3/2
+ ---
+lib/readline/complete.c
+ - print_filename: if there is no directory hook, but there is a stat
+ hook, and we want to append a slash to directories, call the stat
+ hook before calling path_isdir on the expanded directory name.
+ Report and pointer to fix from Steve Rago <sar@nec-labs.com>
+
+ 3/3
+ ---
+builtins/evalstring.c
+ - parse_and_execute: fix to change of 2/18: make sure the file
+ descriptor being redirected to is 0 before calling cat_file when
+ we see something like $(< file). Real fix for bug reported by
+ Dan Douglas <ormaaj@gmail.com>
+
+subst.c
+ - parameter_brace_patsub: run the replacement string through quote
+ removal even if the expansion is within double quotes, because
+ the parser and string extract functions treat the quotes and
+ backslashes as special. If they're treated as special, quote
+ removal should remove them (this is the Posix position and
+ compatible with ksh93). THIS IS NOT BACKWARDS COMPATIBLE.
+
+ 3/4
+ ---
+lib/readline/complete.c
+ - rl_menu_complete: fix to make show-all-if-ambiguous and
+ menu-complete-display-prefix work together if both are set. Fix
+ from Sami Pietila <sami.pietila@gmail.com>
+
+ 3/5
+ ---
+bashline.c
+ - dircomplete_expand_relpath: new variable, if non-zero, means that
+ `shopt -s direxpand' should expand relative pathnames. Zero by
+ default, not user-settable yet
+ - bash_directory_completion_hook: if we have a relative pathname that
+ isn't changed by canonicalization or spell checking after being
+ appended to $PWD, then don't change what the user typed. Controlled
+ by dircomplete_expand_relpath
+
+ 3/7
+ ---
+m4/timespec.m4
+ - new macros, cribbed from gnulib and coreutils: find out whether we
+ have `struct timespec' and what file includes it
+
+m4/stat-time.m4
+ - new macros, cribbed from gnulib and coreutils: find out whether the
+ mtime/atime/ctime/etctime fields of struct stat are of type
+ struct timespec, and what the name is
+
+include/stat-time.h
+ - new file, cribbed from gnulib, with additions from coreutils: include
+ the right file to get the struct timespec define, or provide our own
+ replacement. Provides a bunch of inline functions to turn the
+ appropriate members of struct stat into `struct timespec' values,
+ zeroing out the tv_nsec field if necessary
+
+test.c
+ - include "stat-time.h" for the nanosecond timestamp resolution stuff
+ - stat_mtime: new function, returns struct stat and the mod time
+ normalized into a `struct timespec' for the filename passed as the
+ first argument
+ - filecomp: call stat_mtime instead of sh_stat for each filename
+ argument to get the mtime as a struct timespec
+ - filecomp: call timespec_cmp instead of using a straight arithmetic
+ comparison for the -nt and -ot operators, using timespec returned by
+ stat_mtime. Added functionality requested by by Werner Fink
+ <werner@suse.de> for systems that can support it
+
+ 3/10
+ ----
+include/posixdir.h
+ - REAL_DIR_ENTRY: remove dependency on _POSIX_SOURCE, only use feature
+ test macros to decide whether dirent.d_ino is present and usable;
+ define D_INO_AVAILABLE. Report and fix from Fabrizion Gennari
+ <fabrizio.ge@tiscali.it>
+ - D_FILENO_AVAILABLE: define if we can use dirent.d_fileno
+
+lib/sh/getcwd.c
+ - use D_FILENO_AVAILABLE to decide whether or not to compile in
+ _path_checkino and whether or not to call it. Report and initial
+ fix from Fabrizion Gennari <fabrizio.ge@tiscali.it>
+
+lib/readline/signals.c
+ - make sure all occurrences of SIGWINCH are protected by #ifdef
+
+sig.c
+ - make sure all occurrences of SIGCHLD are protected by #ifdef
+
+nojobs.c
+ - make sure SA_RESTART is defined to 0 if the OS doesn't define it
+
+version.c
+ - show_shell_version: don't use string literals in printf, use %s.
+ Has added benefit of removing newline from string to be translated
+
+trap.c
+ - queue_sigchld_trap: new function, increments the number of pending
+ SIGCHLD signals by the argument, which is by convention the number
+ of children reaped in a call to waitchld()
+
+trap.h
+ - queue_sigchld_trap: new extern declaration
+
+jobs.c
+ - waitchld: if called from the SIGCHLD signal handler (sigchld > 0),
+ then call queue_sigchld_trap to avoid running the trap in a signal
+ handler context. Report and original fix from Siddhesh Poyarekar
+ <siddhesh@redhat.com>
+
+lib/sh/unicode.c
+ - u32tocesc: take an unsigned 32-bit quantity and encode it using
+ ISO C99 string notation (\u/\U)
+ - u32cconv: call u32tocesc as a fallback instead of u32cchar
+ - u32cconv: call u32tocesc if iconv cannot convert the character.
+ Maybe do the same thing if iconv_open fails
+ - u32reset: call iconv_close on localconv if u32init == 1
+
+ 3/11
+ ----
+config-top.h
+ - CHECKWINSIZE_DEFAULT: new define, set to initial value of
+ check_window_size (shopt checkwinsize): 0 for off, 1 for on.
+ Default is 0
+
+{jobs,nojobs}.c
+ - check_window_size: default initial value to CHECKWINSIZE_DEFAULT
+
+ 3/13
+ ----
+doc/bashref.texi
+ - change text referring to the copying restrictions to that
+ recommended by the FSF (no Front-Cover Texts and no Back-Cover
+ Texts)
+
+lib/readline/doc/{history,rlman,rluserman}.texi
+ - change text referring to the copying restrictions to that
+ recommended by the FSF (no Front-Cover Texts and no Back-Cover
+ Texts)
+
+ 3/15
+ ----
+array.c
+ - LASTREF_START: new macro to set the starting position for an array
+ traversal to `lastref' if that's valid, and to the start of the array
+ if not. Used in array_reference, array_insert, array_remove
+ - array_remove: try to be a little smarter with lastref instead of
+ unconditionally invalidating it
+
+ 3/16
+ ----
+array.c
+ - array_insert: fix memory leak by deleting element to be added in the
+ case of an error
+
+ 3/18
+ ----
+lib/sh/mbschr.c
+ - mbschr: don't call mbrlen unless is_basic is false; devolves to a
+ straight character-by-character run through the string
+
+ 3/19
+ ----
+stringlib.c
+ - substring: use memcpy instead of strncpy, since we know the length
+ and are going to add our own NUL terminator
+
+ 3/20
+ ----
+subst.c
+ - parameter_brace_expand_rhs: if expand_string_for_rhs returns a quoted
+ null string (a list with one element for which
+ QUOTED_NULL(list->word->word) returns true), return the quoted null
+ and set the flags in the returned word to indicate it. Fixes bug
+ reported by Mark Edgar <medgar123@gmail.com>
+
+lib/sh/tmpfile.c
+ - use random(3) instead of get_random_number to avoid perturbing the
+ random sequence you get using $RANDOM. Bug report and fix from
+ Jurij Mihelic <jurij.mihelic@fri.uni-lj.si>
+
+ 3/21
+ ----
+config-top.h
+ - OPTIMIZE_SEQUENTIAL_ARRAY_ASSIGNMENT: define to 1 to optimize
+ sequential indexed array assignment patterns. Defined to 1 by
+ default
+
+array.c
+ - array_insert: if OPTIMIZE_SEQUENTIAL_ARRAY_ASSIGNMENT is defined,
+ start the search at lastref (see change from 3/15)
+
+ 3/27
+ ----
+print_cmd.c
+ - debug_print_word_list: new debugging function, prints a word list
+ preceded by an optional string and using a caller-specified
+ separator
+
+ 4/1
+ ---
+command.h
+ - W_ASSNGLOBAL: new flag, set to indicate declare -g
+
+execute_cmd.c
+ - fix_assignment_words: note that we have a -g argument to an assignment
+ builtin and set the W_ASSNGLOBAL flag in the variable word
+
+subst.c
+ - dump_word_flags: print out W_ASSNGLOBAL if present
+ - do_assignment_internal: only set ASS_MKLOCAL if W_ASSIGNARG is set
+ and W_ASSNGLOBAL is not. Don't want to create a local variable even
+ if variable_context is non-zero if ASSNGLOBAL is set. Fixes bug
+ reported by Bill Gradwohl <bill@ycc.com>
+
+ 4/7
+ ---
+lib/readline/readline.c
+ - _rl_dispatch_subseq: make the `keyseq-timeout' variable apply to
+ ESC processing when in vi mode. After hitting ESC, readline will
+ wait up to _rl_keyseq_timeout*1000 microseconds (if set) for
+ additional input before dispatching on the ESC and switching to
+ command/movement mode. Completes timeout work suggested by
+ <rogerx.oss@gmail.com>; this prompted by report from Barry Downes
+ <barry.downes@gmail.com>
+
+lib/sh/shmbchar.c
+ - sh_mbsnlen: new function, returns the number of (possibly multibyte)
+ characters in a passed string with a passed length, examining at most
+ maxlen (third argument) bytes
+
+externs.h
+ - sh_mbsnlen: extern declaration for new function
+
+shell.c
+ - exit_shell: call maybe_save_shell_history if remember_on_history is
+ set, not just in interactive shells. That means the history is
+ saved if history is enabled, regardless of whether or not the shell
+ is interactive
+
+doc/{bash.1,bashref.texi}
+ - TMOUT: fix description to make it explicit that TMOUT is the timeout
+ period for a complete line of input, not just any input. Fixes
+ problem reported in Ubuntu bug 957303:
+ https://bugs.launchpad.net/ubuntu/+source/bash/+bug/957303
+ - HISTFILE: document change to write history list to history file in
+ any shell with history enabled, not just interactive shells. This
+ seems to be more logical behavior. Suggested by Greg Wooledge
+ <wooledg@eeg.ccf.org>
+
+ 4/12
+ ----
+lib/readline/colors.h
+ - only include stdbool.h if HAVE_STDBOOL_H is defined
+ - if HAVE_STDBOOL_H is not defined, provide enough definition for the
+ library to use `bool', `true', and `false'
+
+lib/readline/parse-colors.[ch]
+ - don't try to include <stdbool.h> at all; rely on colors.h to do it
+
+lib/sh/snprintf.c
+ - vsnprintf_internal: only treat '0' as a flag to indicate zero padding
+ if `.' hasn't been encountered ((flags&PF_DOT) == 0); otherwise treat
+ it as the first digit of a precision specifier. Fixes bug reported
+ by Petr Sumbera <petr.sumbera@sun.com>
+
+ 4/15
+ ----
+lib/sh/snprintf.c
+ - vsnprintf_internal: if the '0' and '-' flags both occur, the '0'
+ flag is ignored -- Posix. Start of a series of fixes based on
+ tests and patches from Petr Sumbera <petr.sumbera@sun.com>
+ - PUT_PLUS: make sure PF_PLUS flag is specified before putting the `+'
+ - vsnprintf_internal: when '+' is read as a flag, don't set right-
+ justify flag if the LADJUST (`-') flag has already been supplied
+ - floating: make sure to output space padding before the `+', zero
+ padding after
+ - exponent: make sure to output space padding before the `+', zero
+ padding after
+ - exponent: only subtract one from the width for the decimal point
+ if we're really going to print one
+ - floating: use presence of PF_PLUS flag to decide whether to account
+ for the `+' in the padded field width. Ditto for exponent()
+
+ 4/16
+ ----
+lib/sh/snprintf.c
+ - vsnprint_internal: only reduce precision by 1 when processing the `g'
+ format if it's > 0. A precision of 0 should stay 0; otherwise it
+ gets set to -1 (NOT_FOUND) and converted to the default
+ - number, lnumber: if an explicit precision is supplied, turn off the
+ zero-padding flag and set the pad character back to space
+ - number, lnumber: only account for a `+' when performing the field
+ width calculation if the coversion is base 10; we don't add a `+'
+ for other bases
+
+ 4/18
+ ----
+tests/printf3.sub
+ - try using "perl -e 'print time'" to get the current time in seconds
+ since the epoch if "date +%s" is not available (solaris 8-10)
+
+ 4/19
+ ----
+tests/run-printf
+ - use cat -v instead of relying on diff -a being available to convert
+ control characters to ascii and avoid the dreaded "Binary files
+ /tmp/xx and printf.right differ"
+
+ 4/20
+ ----
+lib/sh/strftime.c
+ - incoporated new version from Aharon Robbins <arnold@skeeve.com>
+
+ 4/22
+ ----
+doc/{bash.1,bashref.texi}
+ - slight change to the description of /dev/tcp and /dev/udp
+
+subst.c
+ - match_wpattern: logic fix to the calculation of `simple' (was |=,
+ needs to be &=). Bug report from Mike Frysinger <vapier@gentoo.org>,
+ fix from Andreas Schwab <schwab@linux-m68k.org>
+
+bashline.c
+ - bash_filename_stat_hook: add code from bash_directory_completion_hook
+ that performs pathname canonicalization in the same way that cd and
+ other builtins will do
+
+ 4/25
+ ----
+execute_cmd.c
+ - execute_pipeline: change the call to move_to_high_fd to make it use
+ getdtablesize() and to not stomp on existing open file descriptors,
+ like the fd the shell is using to read a script. Bug report from
+ Greg Wooledge <wooledg@eeg.ccf.org>
+
+ 5/6
+ ---
+subst.c
+ - expand_word_internal: case '$': after calling param_expand and
+ setting had_quoted_null, set TEMP to null. The code that builds the
+ returned string at the end of the function will take care of making
+ and returning a quoted null string if there's nothing else in
+ ISTRING. If there is, the quoted null should just go away. Part of
+ fix for bug reported by Ruediger Kuhlmann <RKuhlmann@orga-systems.com>
+ - expand_word_internal: when processing ISTRING to build return value,
+ only set W_HASQUOTEDNULL in the returned word flags if the word is
+ a quoted null string AND had_quoted_null is set. Rest of fix
+
+ 5/9
+ ---
+variables.c
+ - bind_variable_internal: if we get an array variable here (implicit
+ assignment to index 0), call make_array_variable_value, which
+ dummies up a fake SHELL_VAR * from array[0]. This matters when
+ we're appending and have to use the current value
+ - bind_variable_internal: after computing the new value, treat assoc
+ variables with higher precedence than simple array variables; it
+ might be that a variable has both attributes set
+
+arrayfunc.c
+ - bind_array_var_internal: break code out that handles creating the
+ new value to be assigned to an array variable index into a new
+ function, make_array_variable_value. This handles creating a
+ dummy SHELL_VAR * for implicit array[0] assignment. Fixes bug
+ reported by Dan Douglas <ormaaj@gmail.com>
+
+arrayfunc.h
+ - make_array_variable_value: new extern declaration
+
+ 5/19
+ ----
+variables.c
+ - bind_int_variable: if an assignment statement like x=y comes in
+ from the expression evaluator, and x is an array, handle it like
+ x[0]=y. Fixes bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 5/24
+ ----
+
+braces.c
+ - mkseq: handle possible overflow and break the sequence generating
+ loop if it occurs. Fixes OpenSUSE bug 763591:
+ https://bugzilla.novell.com/show_bug.cgi?id=763591
+
+ 5/25
+ ----
+Makefile.in
+ - LDFLAGS_FOR_BUILD: add to compilation recipes for build tools
+ buildversion, mksignames, mksyntax
+ - LDFLAGS_FOR_BUILD: add to compilation recipes for test tools
+ recho, zecho, printenv, xcase
+
+builtins/Makefile.in
+ - LDFLAGS_FOR_BUILD: add to compilation recipes for build tools
+ gen-helpfiles, psize.aux
+
+variables.c
+ - bind_int_variable: if LHS is a simple variable name without an array
+ reference, but resolves to an array variable, call
+ bind_array_variable with index 0 to make x=1 equivalent to x[0]=1.
+ Fixes bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 5/27
+ ----
+subst.c
+ - expand_word_internal: make sure has_dollar_at doesn't get reset before
+ recursive calls to param_expand or expand_word_internal, since it has
+ to save state of what came before. Use temp variable and make sure
+ has_dollar_at is incremented if recursive call processes "$@".
+ Fixes bug reported by gregrwm <backuppc-users@whitleymott.net> and
+ supplemented by Dan Douglas <ormaaj@gmail.com>
+
+doc/{bash.1,bashref.texi}
+ - changes to the description of substring expansion inspired by
+ suggestions from Bill Gradwohl <bill@ycc.com>
+
+doc/bashref.texi
+ - added substring expansion examples inspired by suggestions from
+ Bill Gradwohl <bill@ycc.com>
+
+variables.c
+ - find_shell_variable: search for a variable in the list of shell
+ contexts, ignore the temporary environment
+ - find_variable_tempenv: search for a variable in the list of shell
+ contexts, force search of the temporary environment
+ - find_variable_notempenv: search for a variable in the list of shell
+ contexts, don't force search of the temporary environment
+
+variables.h
+ - find_shell_variable: extern declaration
+ - find_variable_tempenv: extern declaration
+ - find_variable_notempenv: extern declaration
+
+arrayfunc.c
+ - bind_array_variable: call find_shell_variable instead of calling
+ var_lookup directly
+
+findcmd.c
+ - search_for_command: call find_variable_tempenv instead of
+ find_variable_internal directly
+ - _find_user_command_internal: call find_variable_tempenv instead of
+ find_variable_internal directly
+
+builtins/setattr.def
+ - set_var_attribute: call find_variable_notempenv instead of
+ find_variable_internal directly
+ - show_name_attributes: call find_variable_tempenv instead of
+ find_variable_internal directly
+
+ 6/1
+ ---
+sig.c
+ - termsig_handler: don't try to save the shell history on a terminating
+ signal any more, since it just causes too many problems on Linux
+ systems using glibc and glibc malloc
+
+lib/readline/vi_mode.c
+ - rl_vi_change_to: change to correctly redo `cc', since `c' is not a vi
+ motion character. From Red Hat bug 813289
+ - rl_vi_delete_to: change to correctly redo `dd', since `d' is not a vi
+ motion character
+ - rl_vi_yank_to: change to correctly redo `yy', since `y' is not a vi
+ motion character
+
+ 6/4
+ ---
+lib/sh/mktime.c
+ - current versions of VMS do not need to include <stddef.h>. Fix from
+ John E. Malmberg <wb8tyw@qsl.net>
+
+ 6/5
+ ---
+lib/sh/eaccess.c
+ - sh_stat: instead of using a static buffer to do the DEV_FD_PREFIX
+ translation, use a dynamically-allocated buffer that we keep
+ resizing. Fixes potential security hole reported by David Leverton
+ <levertond@googlemail.com>
+
+ 6/5
+ ---
+braces.c
+ - expand_seqterm: check errno == ERANGE after calling strtoimax for
+ rhs and incr. Part of a set of fixes from Scott McMillan
+ <scotty.mcmillan@gmail.com>
+ - expand_seqterm: incr now of type `intmax_t', which changes
+ arguments to mkseq
+ - mkseq: a better fix for detecting overflow and underflow since it's
+ undefined in C and compilers `optimize' out overflow checks. Uses
+ ADDOVERFLOW and SUBOVERFLOW macros
+ - mkseq: use sh_imaxabs (new macro) instead of abs() for intmax_t
+ variables
+ - mkseq: don't allow incr to be converted to -INTMAX_MIN
+ - mkseq: make sure that strvec_create isn't called with a size argument
+ greater than INT_MAX, since it only takes an int
+
+ 6/6
+ ---
+braces.c
+ - mkseq: try and be smarter about not overallocating elements in
+ the return array if the increment is not 1 or -1
+
+ 6/7
+ ---
+parse.y
+ - history_delimiting_chars: if the parser says we're in the middle of
+ a compound assignment (PST_COMPASSIGN), just return a space to avoid
+ adding a stray semicolon to the history entry. Fixes bug reported
+ by "Davide Brini" <dave_br@gmx.com>
+
+ 6/8
+ ---
+bashline.c
+ - bash_directory_completion_hook: don't attempt spelling correction
+ on the directory name unless the direxpand option is set and we are
+ going to replace the directory name with the corrected one in the
+ readline line. Suggested by Linda Walsh <bash@tlinx.org>
+
+lib/sh/shquote.c
+ - sh_backslash_quote: now takes a third argument: flags. If non-zero,
+ tildes are not backslash-escaped. Have to handle both printf %q,
+ where they should be escaped, and filename completion, where they
+ should not when used as usernames
+
+externs.h
+ - sh_backslash_quote: declaration now takes a third argument
+
+builtins/printf.def
+ - printf_builtin: call sh_backslash_quote with 1 as third argument
+ so tildes get escaped
+
+{bashline,bracecomp}.c
+ - call sh_backslash_quote with 0 as third argument so tildes are not
+ escaped in completed words
+
+doc/bash.1
+ - add `coproc' to the list of reserved words. From a report by
+ Jens Schweikhardt <schweikh@schweikhardt.net>
+
+ 6/10
+ ----
+execute_cmd.c
+ - line_number_for_err_trap: now global, so parse_and_execute can save
+ and restore it with unwind-protect
+
+builtins/evalstring.c
+ - parse_prologue: save and restore line_number_for_err_trap along
+ with line_number
+ - restore_lastcom: new function, unwind-protect to restore
+ the_printed_command_except_trap
+ - parse_prologue: use restore_lastcom to save and restore the value
+ of the_printed_command_except_trap around calls to parse_and_execute
+ (eval/source/.)
+
+ 6/15
+ ----
+lib/readline/complete.c
+ - complete_fncmp: change filename comparison code to understand
+ multibyte characters, even when doing case-sensitive or case-mapping
+ comparisons. Fixes problem reported by Nikolay Shirokovskiy
+ <nshyrokovskiy@gmail.com>
+
+ 6/20
+ ----
+builtins/mapfile.def
+ - mapfile: move the line count increment and check for having read
+ the specified number of lines to the end of the loop to avoid
+ reading an additional line with zgetline. Fixes bug reported by
+ Dan Douglas <ormaaj@gmail.com>
+
+ 6/21
+ ----
+
+execute_cmd.c
+ - execute_pipeline: make sure `lastpipe_flag' is initialized to 0 on
+ all systems, since it's tested later in the function. Fixes bug
+ reported by John E. Malmberg <wb8tyw@qsl.net>
+
+ 6/22
+ ----
+mailcheck.c
+ - file_mod_date_changed: return 0 right away if mailstat() does not
+ return success. Fixes bug with using uninitialized values reported
+ by szymon.kalasz@uj.edu.pl
+
+builtins/set.def
+ - the `monitor' option is not available when the shell is compiled
+ without job control, since the underlying `m' flag is not available
+
+nojobs.c
+ - job_control: now declared as int variable, initialized to 0, never
+ modified
+
+jobs.h
+ - job_control: extern declaration no longer dependent on JOB_CONTROL
+
+execute_cmd.c
+ - execute_pipeline: made necessary changes so `lastpipe' shell option
+ is now available in all shells, even those compiled without
+ JOB_CONTROL defined
+
+ 6/23
+ ----
+lib/glob/glob.c
+ - glob_filename: check for interrupts before returning if glob_vector
+ returns NULL or an error. Bug reported by Serge van den Boom
+ <svdb@stack.nl>, fix from Andreas Schwab <schwab@linux-m68k.org>
+ - call run_pending_traps after each call to QUIT or test of
+ interrupt_state, like we do in mainline shell code
+ - glob_vector: don't call QUIT; in `if (lose)' code block; just free
+ memory, return NULL, and let callers deal with interrupt_state or
+ other signals and traps
+
+ 6/25
+ ----
+lib/readline/input.c
+ - rl_read_key: restructure the loop that calls the event hook a little,
+ so that the hook is called only after rl_gather_tyi returns no input,
+ and any pending input is returned first. This results in better
+ efficiency for processing pending input without calling the hook
+ on every input character as bash-4.1 did. From a report from
+ Max Horn <max@quendi.de>
+
+ 6/26
+ ----
+trap.c
+ - signal_is_pending: return TRUE if SIG argument has been received and
+ a trap is waiting to execute
+
+trap.h
+ - signal_is_pending: extern declaration
+
+lib/glob/glob.c
+ - glob_vector: check for pending SIGINT trap each time through the loop,
+ just like we check for interrupt_state or terminating_signal, and
+ set `lose = 1' so we clean up after ourselves and interrupt the
+ operation before running the trap. This may require a change later,
+ maybe call run_pending_traps and do that if run_pending_traps returns?
+
+variables.c
+ - sv_histtimefmt: set history_comment_character to default (`#') if
+ it's 0 when we're turning on history timestamps. The history code
+ uses the history comment character to prefix timestamps, and
+ leaving it at 0 effectively removes them from the history. From a
+ report to help-bash by Dennis Williamson <dennistwilliamson@gmail.com>
+
+ 6/27
+ ----
+lib/readline/signals.c
+ - rl_maybe_restore_sighandler: new function, sets handler for SIG to
+ HANDLER->sa_handler only if it's not SIG_IGN. Needs to be called
+ on same signals set using rl_maybe_set_sighandler, which does not
+ override an existing SIG_IGN handler (SIGALRM is ok since it does
+ the check inline; doesn't mess with SIGWINCH)
+
+ 6/30
+ ----
+variables.h
+ - additional defines for the new `nameref' variable attribute
+ (att_nameref): nameref_p, nameref_cell, var_setref
+
+variables.c
+ - find_variable_nameref: resolve SHELL_VAR V through chain of namerefs
+ - find_variable_last_nameref: resolve variable NAME until last in a
+ chain of possibly more than one nameref starting at shell_variables
+ - find_global_variable_last_nameref: resolve variable NAME until last
+ in a chain of possibly more than one nameref starting at
+ global_variables
+ - find_nameref_at_context: resolve SHELL_VAR V through chain of namerefs
+ in a specific variable context (usually a local variable hash table)
+ - find_variable_nameref_context: resolve SHELL_VAR V through chain of
+ namerefs following a chain of varible contexts
+ - find_variable_last_nameref_context: resolve SHELL_VAR V as in
+ find_variable_last_context, but return the final nameref instead of
+ what the final nameref resolves to
+ - find_variable_tempenv, find_variable_notempenv, find_global_variable,
+ find_shell_variable, find_variable: modified to follow namerefs
+ - find_global_variable_noref: look up a global variable without following
+ any namerefs
+ - find_variable_noref: look up a shell variable without following any
+ namerefs
+ - bind_variable_internal: modify to follow a chain of namerefs in the
+ global variables table; change to handle assignments to a nameref by
+ following nameref chain
+ - bind_variable: modify to follow chain of namerefs when binding to a
+ local variable
+ - unbind_variable: changes to unset nameref variables (unsets both
+ nameref and variable it resolves to)
+
+subst.c
+ - parameter_brace_expand_word: change to handle expanding nameref whose
+ value is x[n]
+ - parameter_brace_expand_indir: change to expand in ksh93-compatible
+ way if variable to be indirected is nameref and a simple (non-array)
+ expansion
+ - param_expand: change to expand $foo where foo is a nameref whose value
+ is x[n]
+
+execute_cmd.c
+ - execute_for_command: changes to implement ksh93 semantics when index
+ variable is a nameref
+
+builtins/setattr.def
+ - show_var_attributes: change to add `n' to flags list if att_nameref
+ is set
+
+builtins/set.def
+ - unset_builtin: changes to error messages to follow nameref variables
+
+builtins/declare.def
+ - document new -n option
+ - declare_internal: new `-n' and `+n' options
+ - declare_internal: handle declare -n var[=value] and
+ declare +n var[=value] for existing and non-existant variables.
+ Enforce restriction that nameref variables cannot be arrays.
+ Implement semi-peculiar ksh93 semantics for typeset +n ref=value
+
+ 7/5
+ ---
+variables.c
+ - unbind_variable: unset whatever a nameref resolves to, leaving the
+ nameref variable itself alone
+ - unbind_nameref: new function, unsets a nameref variable, not the
+ variable it references
+
+variables.h
+ - unbind_nameref: extern declaration
+
+builtins/set.def
+ - unset_builtin: modify to add -n option, which calls unbind_nameref
+ leaving unbind_variable for the usual case. This required slight
+ changes and additions to the test suite
+
+doc/{bash.1,bashref.texi}
+ - document namerefs and typeset/declare/local/unset -n
+
+ 7/13
+ ----
+lib/sh/casemod.c
+ - include shmbchar.h for is_basic and supporting pieces
+ - sh_casemod: use _to_wupper and _to_wlower to convert wide character
+ case instead of TOUPPER and TOLOWER. Fixes bug reported by
+ Dennis Williamson <dennistwilliamson@gmail.com>, fix from
+ Andreas Schwab <schwab@linux-m68k.org>
+ - cval: short-circuit and return ascii value if is_basic tests true
+ - sh_casemod: short-circuit and use non-multibyte case modification
+ and toggling code if is_basic tests true
+
+lib/readline/signals.c
+ - _rl_{block,release}_sigint: remove the code that actually blocks and
+ releases the signals, since we defer signal handling until calls to
+ RL_CHECK_SIGNALS()
+
+lib/readline/{callback,readline,util}.c
+ - if HAVE_POSIX_SIGSETJMP is defined, use sigsetjmp/siglongjmp without
+ saving and restoring the signal mask instead of setjmp/longjmp
+
+lib/readline/rltty.c
+ - prepare_terminal_settings: don't mess with IXOFF setting if
+ USE_XON_XOFF defined
+
+doc/{bash.1,bashref.texi}
+ - add some text to the description of set -e clarifying its effect
+ on shell functions and shell function execution. Suggested by
+ Rainer Blome <rainer.blome@gmx.de>
+
+bashline.c
+ - edit_and_execute_command: increment current_command_line_count before
+ adding partial line to command history (for command-oriented-history
+ because of rl_newline at beginning of function), then reset it to 0
+ before adding the dummy history entry to make sure the dummy entry
+ doesn't get added to previous incomplete command. Partial fix for
+ problem reported by Peng Yu <pengyu.ut@gmail.com>
+
+ 7/24
+ ----
+configure.in
+ - interix: define RECYCLES_PIDS. Based on a report from Michael
+ Haubenwallner <michael.haubenwallner@salomon.at>
+
+ 7/26
+ ----
+jobs.c
+ - make_child: call bgp_delete on the newly-created pid unconditionally.
+ Some systems reuse pids before cycling through an entire set of
+ CHILD_MAX/_SC_CHILD_MAX unique pids. This is no longer dependent
+ on RECYCLES_PIDS. Based on a report from Michael Haubenwallner
+ <michael.haubenwallner@salomon.at>
+
+support/shobj-conf
+ - Mac OS X: drop MACOSX_DEPLOYMENT_TARGET=10.3 from the LDFLAGS. We
+ can finally kill Panther
+
+ 7/28
+ ----
+subst.c
+ - command_substitute: make sure last_made_pid gets reset if make_child
+ fails
+
+execute_cmd.c
+ - execute_command_internal: case cm_simple: decide whether or not to
+ wait_for a child if already_making_children is non-zero, indicates
+ that there is an unwaited-for child. More of fix for bug report
+ from Michael Haubenwallner <michael.haubenwallner@salomon.at>
+
+jobs.c
+ - make_child: call delete_old_job (new_pid) unconditionally, don't
+ bother to check whether or not pid wrap occurred. Rest of fix for
+ bug report from Michael Haubenwallner
+ <michael.haubenwallner@salomon.at>
+
+ 7/29
+ ----
+shell.c
+ - subshell_exit: new function, exits the shell (via call to sh_exit())
+ after calling any defined exit trap
+
+externs.h
+ - subshell_exit: new extern declaration
+
+execute_cmd.c
+ - execute_command_internal: make sure to call subshell_exit for
+ {} group commands executed asynchronously (&). Part of fix for
+ EXIT trap bug reported by Maarten Billemont <lhunath@lyndir.com>
+
+sig.c
+ - reset_terminating_signals: make sure to set termsigs_initialized back
+ to 0, so a subsequent call to initialize_terminating_signals works
+ right. Rest of fix for bug reported by Maarten Billemont
+ <lhunath@lyndir.com>
+
+{execute_cmd,general,jobs,mailcheck,mksyntax,test}.c
+builtins/{cd,fc,pushd,ulimit}.def
+lib/malloc/getpagesize.h
+lib/sh/{clktck,fpurge,inet_aton,mailstat,oslib,pathcanon,pathphys,spell,strerror}.c
+ - make inclusion of <sys/param.h> dependent on HAVE_SYS_PARAM_H
+ consistently
+
+ 8/6
+ ---
+lib/readline/histexpand.c
+ - history_expand_internal: now takes an additional argument saying
+ whether the history expansion occurs within a quoted string, set to
+ the open quote character
+ - history_expand_internal: use new argument instead of checking prev
+ char and initializing quoted_search_delimiter, pass qc directly to
+ get_history_event, where it allows a matching quote to terminate a
+ string defining an event
+ - history_expand: change single-quote handling code so that if
+ history_quotes_inhibit_expansion is 0, single quotes are treated
+ like double quotes
+ - history_expand: change call to history_expand_internal to pass new
+ argument of `"' if double-quoted string, `'' if single-quoted string;
+ this lets history_expand decide what is a quoted string and what
+ is not
+
+ 8/7
+ ---
+configure.in
+ - AC_CANONICAL_BUILD: invoke for later use
+
+lib/readline/macro.c
+ - _rl_prev_macro_key: new function, inverse of _rl_next_macro_key:
+ backs up the index into the current macro by 1
+
+lib/readline/rlprivate.h
+ - _rl_prev_macro_key: extern declaration
+
+
+lib/readline/readline.c
+ - _rl_dispatch_subseq, _rl_subseq_result: don't call _rl_unget_char
+ if we're currently reading from a macro; call _rl_prev_macro_key
+ instead. Fixes bug reported by Clark Wang <clark.wang@oracle.com>
+
+ 8/13
+ ----
+builtins/evalstring.c
+ - evalstring(): new function, wrapper around parse_and_execute.
+ make sure we handle cases where parse_and_execute can call `return'
+ and short-circuit without cleaning up properly. We call
+ parse_and_execute_cleanup() then jump to the previous-saved return
+ location
+
+builtins/common.h
+ - extern declaration for evalstring()
+
+builtins/eval.def
+ - eval_builtin: make sure we handle `eval " ... return"' in contexts
+ where `return' is valid by calling evalstring(). Fixes bug with
+ `eval return' in sourced files reported by Clark Wang
+ <dearvoid@gmail.com>
+
+trap.c
+ - run_pending_traps: call evalstring instead of parse_and_execute.
+ XXX - still needs to handle saving and restoring token state in the
+ presence of `return'; could use unwind_protects for that
+
+builtins/mapfile.def
+ - run_callback: call evalstring instead of parse_and_execute
+
+ 8/15
+ ----
+bashline.c
+ - bash_filename_stat_hook: make sure we don't free local_dirname
+ before using it to canonicalize any expanded filename. Make sure
+ it always points to *dirname and only free it if we're replacing
+ it.
+
+lib/readline/complete.c
+ - append_to_match: make sure we call rl_filename_stat_hook with
+ newly-allocated memory to avoid problems with freeing it twice
+
+ 8/17
+ ----
+variables.c,config-top.h
+ - if ARRAY_EXPORT is defined to 1 when variables.c is compiled, the
+ code that allows indexed arrays to be exported is enabled and
+ included
+
+ 8/19
+ ----
+shell.c
+ - call start_debugger from main() only if dollar_vars[1] != 0 (close
+ enough to a non-interactive shell, since we can be interactive with
+ -i while running a shell script). Fixes oddity reported by
+ Techlive Zheng <techlivezheng@gmail.com>
+
+ 8/20
+ ----
+arrayfunc.c
+ - quote_array_assignment_chars: don't bother quoting if the word has
+ not been marked as an assignment (W_ASSIGNMENT)
+ - quote_array_assignment_chars: turn on W_NOGLOB in the word flags
+ so assignment statements don't undergo globbing. Partial fix for
+ problems reported by Dan Douglas <ormaaj@gmail.com>
+
+ 8/21
+ ----
+command.h
+ - W_NOBRACE: new word flag that means to inhibit brace expansion
+
+subst.c
+ - brace_expand_word_list: suppress brace expansion for words with
+ W_NOBRACE flag
+
+ 8/22
+ ----
+builtins/read.def
+ - read_builtin: don't call dequote_string on what we've read, even if
+ we saw an escape character, unless (input_string && *input_string).
+ We may have escaped an IFS whitespace character. Fixes seg fault
+ reported by <armandsl@gmail.com>
+
+execute_cmd.c
+ - execute_command_internal: set the_printed_command_except trap when
+ about to execute a ( ... ) user subshell. For now, set it only if
+ ERR is trapped; can relax that later. Fixes bug reported by
+ Mike Frysinger <vapier@gentoo.org>
+
+ 8/23
+ ----
+jobs.c
+ - remove references to first_pid and pid_wrap, since we're not using
+ them for anything anymore
+
+ 8/24
+ ----
+subst.c
+ - changes for W_NOBRACE everywhere appropriate: so it can be displayed
+ for debugging, and passed out of expand_word_internal
+
+doc/{bash.1,bashref.texi}
+ - small changes to make it clearer that the = and == operators are
+ equivalent, and will cause pattern matching when used with [[.
+ From a question from Michal Soltys <soltys@ziu.info>
+
+doc/bashref.texi
+ - some small formatting changes from Karl Berry <karl@freefriends.org>
+
+ 8/27
+ ----
+lib/readline/doc/{history,rlman,rluserman}.texi
+ - some small formatting changes from Karl Berry <karl@freefriends.org>
+
+arrayfunc.c
+ - assign_array_element_internal, assign_compound_array_list,
+ unbind_array_element, array_value_internal: changes to make
+ assignment statements to negative indices (a[-1]=2) and unsetting
+ array elements using negative indices (unset 'a[-1]') work.
+ From suggestions by Dennis Williamson <dennistwilliamson@gmail.com>
+ and Chris F. A. Johnson <chris@cfajohnson.com>
+
+subst.c
+ - array_length_reference: changes to make length references to array
+ elements using negative indices (${#a[-1]}) work
+
+ 8/28
+ ----
+doc/{bash.1,bashref.texi}
+ - document new treatment of negative indices to indexed arrays when
+ assigning, referencing, calculating length, and unsetting
+
+ 8/29
+ ----
+shell.c
+ - show_shell_usage: add -l to list of shell invocation options (short
+ for --login). From Red Hat bug 852469
+
+configure.ac
+ - renamed from configure.in, as latest autoconf versions want. Patches
+ Stefano Lattarini <stefano.lattarini@gmail.com>
+
+MANIFEST,Makefile.in,doc/bashref.texi,support/mkconffiles
+ - configure.in -> configure.ac
+
+ 9/1
+ ---
+
+parse.y
+ - read_token_word: allow words like {array[ind]} to be valid redirection
+ words for constructs like {x}<file
+
+redir.c
+ - redir_varassign: bind_var_to_int already handles array assignments,
+ so don't need to do anything more for things like {a[i]}<file
+ - redir_varvalue: changes to allow references to {a[i]} when
+ performing redirections using valid_array_reference and
+ get_array_value. Adds functionality requested most recently by
+ <unknown@vmw-les.eng.vmware.com>
+
+lib/readline/display.c
+ - update_line: if the first difference between the old and new lines
+ is completely before any invisible characters in the prompt, we
+ should not adjust _rl_last_c_pos, since it's before any invisible
+ characters. Fixed in two places
+ - prompt_modechar: return a character indicating the editing mode:
+ emacs (@), vi command (:), or vi insert (+)
+ - _rl_reset_prompt: new function, just calls rl_expand_prompt. Will be
+ inlined, placeholder for more changes
+ - expand_prompt: if show-mode-in-prompt is enabled, add a character to
+ the front of the prompt indicating the editing mode, adjusting the
+ various variables as appropriate to keep track of the number of
+ visible characters and number of screen positions
+
+lib/readline/bind.c
+ - show-mode-in-prompt: new bindable boolean variable, shadowed by
+ _rl_show_mode_in_prompt variable
+ - hack_special_boolean_var: call _rl_reset_prompt when toggling or
+ setting show-mode-in-prompt
+
+lib/readline/readline.c
+ - readline_internal_setup: make sure the correct vi mode keymap is set
+ before expanding the prompt string for the first time
+
+lib/readline/misc.c
+ - rl_emacs_editing_mode: make sure to call _rl_reset_prompt if we're
+ showing the editing mode in the prompt
+
+lib/readline/rlprivate.h
+ - _rl_reset_prompt, _rl_show_mode_in_prompt: extern declarations
+
+lib/readline/vi_mode.c
+ - rl_vi_insertion_mode: call _rl_reset_prompt
+ - rl_vi_movement_mode: call _rl_reset_prompt. Finishes changes for
+ showing mode in prompt string, originally requested by Miroslav
+ Koskar <mkoskar@gmail.com> and most recently by Jordan Michael
+ Ziegler <jziegler@bnl.gov>
+
+doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
+ - document new show-mode-in-prompt variable, off by default
+
+ 9/3
+ ---
+
+jobs.c
+ - set_childmax: new function, external mechanism for other parts of
+ the shell to set js.c_childmax, the number of saved exited child
+ statuses to remember
+jobs.h
+ - set_childmax: extern declaration
+
+variables.c
+ - CHILD_MAX: new special variable, with sv_childmax function to
+ run when it changes. Setting CHILD_MAX to a value greater than
+ zero but less than some maximum (currently 8192) sets the number of
+ exited child statuses to remember. set_childmax (jobs.c) ensures
+ that the number does not drop below the posix-mandated minimum
+ (CHILD_MAX)
+
+doc/{bash.1,bashref.texi}
+ - CHILD_MAX: document new meaning and action when variable is set
+
+ 9/5
+ ---
+redir.c
+ - redir_varassign: call stupidly_hack_special_variables after
+ assigning fd number to specified variable, so we can use constructs
+ like {BASH_XTRACEFD}>foo. Suggested by Pierre Gaston
+ <pierre.gaston@gmail.com>
+
+ 9/8
+ ---
+expr.c
+ - readtok: invalidate previous contents of `curlval' before freeing
+ and reallocating tokstr (which, chances are, will get the same
+ pointer as before and render curlval inconsistent). Fixes other
+ bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 9/9
+ ---
+lib/readline/complete.c
+ - rl_username_completion_function: protect call to setpwent() with
+ #ifdef (HAVE_GETPWENT)/#endif. Fixes bug reported by
+ Gerd Hofmann <gerd.hofmann.nbg@googlemail.com>
+
+lib/readline/display.c
+ - rl_message: second and subsequent calls to rl_message can result in
+ local_prompt being overwritten with new values (e.g., from the
+ successive calls displaying the incremental search string). Need
+ to free before overwriting if it's not the same as the value saved
+ in saved_local_prompt. Fixes memory leak reported by
+ Wouter Vermaelen <vermaelen.wouter@gmail.com>
+
+lib/readline/{terminal.c,rlprivate.h}
+ - move CUSTOM_REDISPLAY_FUNC and CUSTOM_INPUT_FUNC defines from
+ terminal.c to rlprivate.h so other files can use them
+
+expr.c
+ - expr_streval: if noeval is non-zero, just return 0 right away,
+ short-circuiting evaluation completely. readtok will leave curtok
+ set correctly without re-entering the evaluator at all. Rest of
+ fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+ 9/11
+ ----
+
+parse.y
+ - parse_comsub: make sure the `reserved word ok in this context' flag
+ is preserved after we read `do' followed by whitespace. Fixes bug
+ reported by Benoit Vaugon <benoit.vaugon@gmail.com>
+
+ 9/13
+ ----
+configure.ac,config.h.in
+ - enable-direxpand-default: new configure option, turns the `direxpand'
+ shell option on by default
+
+bashline.c
+ - dircomplete_expand, dircomplete_expand_relpath: initialize to 1 if
+ DIRCOMPLETE_EXPAND_DEFAULT is defined and non-zero
+
+doc/bashref.texi
+ - enable-direxpand-default: document new configure option
+
+ 9/14
+ ----
+shell.c
+ - --protected: make option valid only when wordexp is compiled into
+ the shell. Fix from Roman Rakus <rrakus@redhat.com>
+
+configure.ac
+ - HP NonStop (*-nsk*): compile --without-bash-malloc. Change from
+ Joachim Schmitz <jojo@schmitz-digital.de>
+
+ 9/16
+ ----
+subst.c,execute_cmd.c,lib/glob/sm_loop.c,lib/sh/shquote.c
+ - minor code cleanups from Joachim Schmitz <jojo@schmitz-digital.de>
+
+lib/readline/colors.h
+ - workaround for HP NonStop compiler issue with <stdbool.h> from
+ Joachim Schmitz <jojo@schmitz-digital.de>
+
+ 9/17
+ ----
+builtins/printf.def
+ - printf_builtin: handle localtime returning NULL, as can happen when
+ encountering overflow. Bug report and initial fix from
+ Eduardo A. Bustamante López <dualbus@gmail.com>
+
+doc/{bash.1,bashref.texi}
+ - emphasize that brace expansion using character ranges ({a..c}) acts
+ as if the C locale were in use. Prompted by message from
+ Marcel Giannelia <info@skeena.net>
+
+ 9/20
+ ----
+lib/sh/wcsnwidth.c
+ - wcsnwidth: new function, variant of wcwidth, returns the number of
+ wide characters from a string that will be displayed to not exceed
+ a specified max column position
+
+ 9/21
+ ----
+builtins/help.def
+ - show_builtin_command_help: break code that displays the short-doc
+ for each builtin in two columns into a new function: dispcolumn
+ - wdispcolumn: multibyte-char version of dispcolumn; uses wide
+ chars and printf "%ls" format. Fixes problem reported by
+ Nguyá»n Thái Ngá»c Duy <pclouds@gmail.com>
+
+ 9/22
+ ----
+execute_cmd.c
+ - execute_disk_command: before running the command-not-found hook,
+ call kill_current_pipeline() to make sure we don't add processes
+ to an existing pipeline or wait for processes erroneously
+
+ 9/23
+ ----
+lib/readline/input.c
+ - rl_input_available_hook: new hook function, called from
+ _rl_input_available (or _rl_input_queued) to return whether or not
+ input is available wherever the input source is
+
+lib/readline/doc/rltech.texi
+ - rl_input_available_hook: document
+
+ 9/27
+ ----
+lib/glob/sm_loop.c:
+ - GMATCH: after one or more `*', an instance of ?(x) can match zero or
+ 1 times (unlike ?, which has to match one character). The old code
+ failed if it didn't match at least once. Fixes `a*?(x)' bug.
+ - GMATCH: if we hit the end of the search string, but not the end of
+ the pattern, and the rest of the pattern is something that can
+ match the NUL at the end of the search string, we should successfully
+ match. Fixes `a*!(x)' bug reported by <hans1worst@gmail.com>
+
+ 10/2
+ ----
+command.h
+ - add c_lock member to coproc structure for future use to tell who is
+ manipulating it
+
+execute_cmd.c
+ - execute_coproc: block SIGCHLD while parent is forking coproc
+ process and adding pid to sh_coproc struct to avoid race condition
+ where child is reaped before the pid is assigned and the coproc is
+ never marked as having died. Fixes race condition identified by
+ Davide Baldini <baldiniebaldini@gmail.com>
+ - add assignments to c_lock member of struct coproc in various
+ functions that manipulate it; was used to identify race condition
+ - coproc_pidchk: don't call coproc_dispose to avoid using malloc and
+ other functions in a signal handler context
+ - coproc_dispose: call BLOCK_SIGNAL/UNBLOCK_SIGNAL for SIGCHLD while
+ manipulating the sh_coproc struct
+
+ 10/6
+ ----
+lib/readline/complete.c
+ - rl_display_match_list: if printing completions horizontally, don't
+ bother with spacing calculations if limit == 1, which means we are
+ printing one completion per line no matter what. Fixes bug
+ reported by David Kaasen <kaasen@nvg.ntnu.no>
+
+ 10/7
+ ----
+builtins/declare.def
+ - declare_internal: add error checking for nameref attribute and
+ variable assignments: self-references, attempts to make an array
+ variable a nameref
+
+subst.c
+ - parameter_brace_expand: handle parameter_brace_expand_word returning
+ &expand_param_fatal or &expand_param_error and return the appropriate
+ error value
+ - parameter_brace_expand_word: if a nameref variable's value is not a
+ valid identifier, return an error
+ - param_expand: if a nameref variable's value is not a valid identifier,
+ return an error
+
+test.c
+ - unary_operator: add new -R variable, returns true if variable is set
+ and has the nameref attribute. From ksh93
+
+builtins/test.def
+ - add -R to description of conditional commands for help test
+
+doc/{bash.1,bashref.texi}
+ - document new -R unary conditional operator
+
+ 10/13
+ -----
+trap.c
+ - check_signals_and_traps: new function, convenience function for the
+ rest of the shell to check for pending terminating and interrupt
+ signals, and to check for and process any pending traps
+ - any_signals_trapped: new function, returns non-zero if any signals
+ are trapped and -1 if not
+
+trap.h
+ - extern declaration for check_signals_and_traps
+
+bashline.c
+ - bashline_reset: make sure we reset the event hook
+ - bash_event_hook: call check_signals_and_traps instead of just
+ checking for terminating signals so we can run pending traps and
+ react to interrupts, and reset the event hook when we're done
+
+
+ 10/14
+ -----
+trap.c
+ - trap_handler: if executing in a readline signal handler context,
+ call bashline_set_event_hook to install bash_event_hook to process
+ the signal (if bash cares about it)
+
+sig.c
+ - sigint_sighandler: call bashline_set_event_hook to set the event
+ hook if we're executing in a readline signal handler context
+
+lib/readline/input.c
+ - rl_getc: call RL_CHECK_SIGNALS if read returns -1/EINTR and the caught
+ signal is SIGINT or SIGQUIT rather than waiting until the next time
+ around the loop
+ - rl_getc: call rl_event_hook after calling RL_CHECK_SIGNALS to allow
+ an application signal handler to set the event hook in its own
+ signal handler (e.g., like bash trap_handler or sigint_sighandler)
+
+
+parse.y
+ - yy_readline_get: don't set interrupt_immediately before we call
+ readline(). Inspired by report from lanshun zhou
+ <zls.sogou@gmail.com>
+
+input.c
+ - getc_with_restart: add call to run_pending_traps after call to
+ CHECK_TERMSIG
+
+lib/sh/zread.c
+ - zread: call check_signals_and_traps if read() returns -1/EINTR
+ instead of just ignoring the EINTR and deferring handling any
+ signal that generated it
+
+builtins/mapfile.def
+ - mapfile: don't set interrupt_immediately before calling zgetline()
+ (which uses zread internally)
+
+builtins/read.def
+ - read_builtin: don't set interrupt_immediately before calling zread
+ (moved code around so that it was only being set right around calls
+ to zread to avoid signal handler conflicts). Inspired by report
+ from lanshun zhou <zls.sogou@gmail.com>
+ - edit_line: don't set interrupt_immediately around call to readline()
+ - include shmbutil.h
+ - read_builtin: don't call read_mbchar unless is_basic(c) returns
+ false for the character we just read
+
+ 10/15
+ -----
+sig.c
+ - throw_to_top_level: if interrupt_state is non-zero, make sure that
+ last_command_exit_value reflects 128+SIGINT if it's not already
+ greater than 128
+
+ 10/20
+ -----
+builtins/wait.def
+ - WAIT_RETURN: set wait_signal_received back to 0 for the potential
+ next call to wait
+
+quit.h
+ - CHECK_WAIT_INTR: macro to check whether trap_handler handled a
+ signal and set wait_signal_received; longjmp to wait_intr_buf in
+ that case
+
+jobs.c
+ - wait_for, waitchld: call CHECK_WAIT_INTR at the same places we call
+ CHECK_TERMSIG to check for terminating signals
+ - wait_sigint_handler: don't longjmp out of the wait builtin unless
+ interrupt_immediately is set; otherwise just SIGRETURN from the
+ handler
+ - wait_sigint_handler: if interrupt_immediately not set, but we are
+ executing in the wait builtin and SIGINT is not trapped, treat it
+ as a `normally received' SIGINT: restore the signal handler and
+ send SIGINT to ourselves
+ - waitchld: when in posix mode and running SIGCHLD traps, don't longjmp
+ to wait_intr_buf (and let wait be interrupted) if we're running from
+ a signal handler. Wait for CHECK_WAIT_INTR to do the longjmp.
+ run_pending_traps will run the SIGCHLD trap later
+
+nojobs.c
+ - reap_zombie_children, wait_for_single_pid, wait_for: call
+ CHECK_WAIT_INTR where we call CHECK_TERMSIG
+ - wait_sigint_handler: don't longjmp out of the wait builtin unless
+ interrupt_immediately is set; otherwise just SIGRETURN from the
+ handler
+
+trap.c
+ - trap_handler: make sure wait_signal_received is set if the wait
+ builtin is executing, and only longjmp if interrupt_immediately is
+ set. This whole set of fixes was prompted by report from
+ lanshun zhou <zls.sogou@gmail.com>
+
+ 10/24
+ -----
+lib/glob/glob.c
+ - glob_filename: only check directory_name for globbing chars if
+ it's of non-zero length
+
+lib/sh/strchrnul.c
+ - new simpler implementation
+
+subst.c
+ - command_substitute: call set_shellopts after turning off errexit
+ in subshells so it's reflected in $SHELLOPTS
+
+ 11/7
+ ----
+builtins/evalstring.c
+ - parse_and_execute: treat ERREXIT case like reader_loop does: set
+ variable_context to 0 before longjmping back to top_level. Don't
+ run the unwind-protect context to avoid side effects from popping
+ function contexts. Part of fix for problem reported by Nikolai
+ Kondrashov <nikolai.kondrashov@redhat.com>
+
+execute_cmd.c
+ - execute_simple_command: call unlink_fifo_list only if this is the
+ last element of a pipeline (or not in a pipeline), rather than for
+ every child. Fixes difference in behavior between /dev/fd and
+ FIFOs reported by Zev Weiss <zev@bewilderbeest.net>
+ - execute_null_command: do the same thing in the parent branch after
+ make_child
+
+ 11/14
+ -----
+subst.c
+ - parameter_brace_expand: a variable is null if it's special ($@, $*),
+ the expansion occurs within double quotes, and the expansion turns
+ into a quoted null. Fixes debian bug 692447 reported by
+ Matrosov Dmitriy <sgf.dma@gmail.com>
+
+jobs.c
+ - run_sigchld_trap: make sure `running_trap' sentinel is set
+ appropriately
+ - waitchld: only run the sigchld trap if we're not in a signal
+ handler, not running a trap, and executing the wait builtin.
+ Otherwise, queue for later handling. We still run one instance
+ of the trap handler per exited child. Bulk of fix for bug
+ reported by Elliott Forney <idfah@cs.colostate.edu>
+
+trap.c
+ - queue_sigchld_trap: set catch_flag so run_pending_traps notices,
+ and set trapped_signal_received for completeness. Rest of fix
+ for bug reported by Elliott Forney <idfah@cs.colostate.edu>
+
+lib/malloc/malloc.c
+ - block_signals: renamed to _malloc_block_signals, made public
+ - unblock_signals: renamed to _malloc_unblock_signals, made public
+
+lib/malloc/imalloc.h
+ - extern declarations for _malloc_{un,}block_signals
+
+lib/malloc/table.c
+ - mregister_alloc, mregister_free: block signals around table
+ manipulation
+
+ 11/15
+ -----
+trap.c
+ - run_pending_traps: set SIG_INPROGRESS flag around calls to
+ run_sigchld_handler so other parts of the shell know that the
+ SIGCHLD trap handler is executing
+ - run_pending_traps: if we get a situation where we are looking at
+ running a SIGCHLD trap but the trap string is IMPOSSIBLE_TRAP_HANDLER
+ and the SIG_INPROGRESS flag is set, just skip it. This is possible
+ if run_pending_traps is called from a SIGCHLD trap handler run by
+ run_sigchld_trap
+
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+ - corrected description of the effect of `set history-size 0'. Report
+ from Vesa-Matti J Kari <vmkari@cc.helsinki.fi>
+
+include/stdc.h
+ - CPP_STRING: new define, replaces __STRING
+
+lib/malloc/{malloc.c,imalloc.h}
+ - replace __STRING with CPP_STRING
+
+ 11/16
+ -----
+lib/readline/bind.c
+ - sv_histsize: if argument evaluates to a value < 0, unstifle the
+ history
+
+ 11/22
+ -----
+redir.c
+ - do_redirection_internal: if we have REDIR_VARASSIGN set in the
+ redirection flags and we set up `redirector' using fcntl or dup2,
+ don't add a redirect to make sure it stays open. Let the
+ script programmer manage the file handle. Fixes bug reported by
+ Sam Liddicott <sam@liddicott.com>
+
+ 11/24
+ -----
+jobs.c
+ - wait_for_any_job: new function, waits for an unspecified background
+ job to exit and returns its exit status. Returns -1 on no background
+ jobs or no children or other errors. Calls wait_for with new
+ sentinel value ANY_PID
+ - wait_for: changes to handle argument of ANY_PID: don't look up or
+ try to modify the child struct, only go through the wait loop once.
+ Return -1 if waitpid returns no children
+
+jobs.h
+ - ANY_PID: new define
+
+builtins/wait.def
+ - new option: -n. Means to wait for the next job and return its exit
+ status. Returns 127 if there are no background jobs (or no
+ children). Feature most recently requested by Elliott Forney
+ <idfah@cs.colostate.edu>
+
+doc/{bash.1,bashref.texi}
+ - document new `wait -n' option
+
+execute_cmd.c
+ - execute_command_internal: save make_command_string () result in a
+ temp variable before calling savestring() on it; avoids evaluating
+ make_command_string() result twice. Fix from John E. Malmberg
+ <wb8tyw@qsl.net>
+
+ 11/28
+ -----
+
+builtins/declare.def
+ - declare_internal: if an array variable is declared using `declare -a'
+ or `declare -A', but not assigned a value, set the `invisible'
+ attribute so the variable does not show up as set. Fix for bug
+ about variable initialization reported by Tim Friske <me@timfriske.com>
+
+builtins/{mapfile,read}.def
+ - after calling find_or_make_array_variable, make sure the invisible
+ flag is turned off, in case the variable was declared previously
+ using `declare -a' or `declare -A'. Side effect of above change to
+ declare_internal
+
+subst.c
+ - shell_expand_word_list: handle the W_ASSNGLOBAL flag and put -g into
+ the list of options passed to make_internal_declare as appropriate.
+ Fix for bug reported by Tim Friske <me@timfriske.com>
+
+ 11/30
+ -----
+test.c
+ - unary_op: make sure -v and -n check that the variable is not marked
+ as invisible before calling var_isset. Fix for bug reported by Tim
+ Friske <me@timfriske.com>
+
+ 12/2
+ ----
+subst.c
+ - process_substitute: turn off the `expanding_redir' flag, which
+ controls whether or not variables.c:find_variable_internal uses the
+ temporary environment to find variables. We want to use the
+ temp environment, since we don't have to worry about order of
+ evaluation in a subshell. Fixes bug reported by Andrey Borzenkov
+ <arvidjaar@gmail.com>
+
+ 12/4
+ ----
+lib/glob/glob.c
+ - glob_filename: changes to avoid null filenames and multiple entries
+ returned for patterns like **/** (globstar enabled). Fixes bug
+ reported by Ulf Magnusson <ulfalizer@gmail.com>
+
+ 12/10
+ -----
+lib/glob/glob.c
+ - glob_filename: finish up a series of changes to make globstar-style
+ globbing more efficient, avoid more duplicate filenames, and be more
+ compatible with other shells that implement it
+ o collapse a sequence of **/**/** to one **
+ o note when the directory name is all ** or ends in ** so we
+ can treat it specially when the filename is **
+ All inspired by report from Andrey Borzenkov <arvidjaar@gmail.com>
+
+lib/sh/zread.c
+ - zreadn: new function, like zread, but takes an additional argument
+ saying how many bytes to read into the local buffer. Can be used to
+ implement `read -N' without so many one-byte calls to zreadc. Code
+ from Mike Frysinger <vapier@gentoo.org>
+
+ 12/12
+ -----
+lib/glob/sm_loop.c
+ - PATSCAN (glob_patscan): if passed string already points to end of
+ pattern, return NULL immediately. Fixes problem with
+ extglob_skipname reported by Raphaël Droz <raphael.droz@gmail.com>
+
+ 12/13
+ -----
+execute_cmd.c
+ - execute_coproc: handle the command's exit status being inverted
+ (an oversight). Fixes bug reported by DJ Mills
+ <danielmills1@gmail.com> and Andreas Schwab <schwab@linux-m68k.org>
+
+ 12/14
+ -----
+lib/readline/readline.c
+ - bind_arrow_keys_internal: add MINGW key bindings for Home, End,
+ Delete, and Insert keys. Fix from Pierre Muller
+ <pierre.muller@ics-cnrs.unistra.fr>
+
+builtins/printf.def
+ - printf_builtin: '%()T' conversion: if there is no argument supplied,
+ behave as if -1 had been supplied (current time). ksh93-like feature
+ suggested by Clark Wang <dearvoid@gmail.com>
+
+doc/{bash.1,bashref.texi}
+ - document new printf %()T default argument behavior
+
+ 12/15
+ -----
+lib/readline/display.c
+ - displaying_prompt_first_line: new variable, indicates whether or
+ not the first line of output is displaying the prompt. Always true
+ in normal mode, sometimes false in horizontal scrolling mode
+ - rl_redisplay: set displaying_prompt_first_line to true unless we
+ are in horizontal mode; set to false in horizontal mode if the left
+ margin of the displayed line is greater than the end of the prompt
+ string
+ - rl_redisplay: when in horizontal scroll mode, don't adjust
+ _rl_last_c_pos by the wrap offset unless the line is displaying
+ a prompt containing invisible chars
+ - update line: don't adjust _rl_last_c_pos by the wrap offset unless
+ the line is displaying a prompt containing invisible chars
+ - update_line: if shrinking the line by reducing the number of
+ displayed characters, but we have already moved the cursor to the
+ beginning of the line where the first difference starts, don't
+ try to delete characters
+
+builtins/read.def
+ - unbuffered_read: set to 2 if invoked as `read -N'
+ - if unbuffered_read is set to 2, compute the number of chars we
+ need to read and read that many with zreadn. Posix mode still
+ uses zreadintr. Code from Mike Frysinger <vapier@gentoo.org>
+
+doc/{bash.1,bashref.texi}
+ - read: make it clear that if read times out, it saves any input
+ read to that point into the variable arguments. Report from
+ Fiedler Roman <Roman.Fiedler@ait.ac.at>
+
+subst.c
+ - command_substitute: change direct assignment of exit_immediately_on_error
+ to use change_flag ('e', FLAG_OFF) instead
+
+flags.c
+ - use errexit_flag as the variable modified by changes to the -e
+ option, reflect those changes to exit_immediately_on_error
+
+execute_cmd.c
+ - execute_builtin: new global variable, builtin_ignoring_errexit, set
+ to 0 by default and set to 1 if eval/source/command executing in a
+ context where -e should be ignored
+ - execute_builtin: set exit_immediately_on_error to errextit_flag
+ after executing eval/source/command in a context where -e should
+ be ignored
+
+flags.c
+ - if builtin_ignoring_errexit is set, changes to errexit_flag are
+ not reflected in the setting of exit_immediately_on_error. Fixes
+ bug reported by Robert Schiele <rschiele@gmail.com>
+
+ 12/23
+ -----
+include/posixjmp.h
+ - setjmp_nosigs: new define, call setjmp in such a way that it will
+ not manipulate the signal mask
+
+{expr,test,trap}.c
+ - setjmp_nosigs: call instead of setjmp; don't need to manipulate
+ signal mask
+
+builtins/read.def
+ - read_builtin: setjmp_nosigs: call instead of setjmp; don't need
+ to manipulate signal mask
+
+builtins/evalstring.c:
+ - parse_and_execute: setjmp_nosigs: call instead of setjmp; don't need
+ to manipulate signal mask
+ - parse_string: setjmp_nosigs: call instead of setjmp; don't need
+ to manipulate signal mask
+ - parse_and_execute: save and restore the signal mask if we get a
+ longjmp that doesn't cause us to return or exit (case DISCARD)
+
+ 12/24
+ -----
+general.c
+ - bash_tilde_expand: only set interrupt_immediately if there are no
+ signals trapped; we want to jump to top level if interrupted but
+ not run any trap commands
+
+ 12/25
+ -----
+jobs.c
+ - run_sigchld_trap: no longer set interrupt_immediately before calling
+ parse_and_execute, even if this is no longer run in a signal handler
+ context
+
+input.c
+ - getc_with_restart: add call to QUIT instead of CHECK_TERMSIG
+
+parse.y
+ - yy_stream_get: now that getc_with_restart calls QUIT, don't need to
+ set interrupt_immediately (already had call to run_pending_traps)
+
+execute_cmd.c
+ - execute_subshell_builtin_or_function,execute_function,execute_in_subshell:
+ setjmp_nosigs: call instead of setjmp when saving return_catch; don't
+ need to manipulate signal mask
+ - execute_subshell_builtin_or_function,execute_in_subshell:
+ setjmp_nosigs: call instead of setjmp where appropriate when saving
+ top_level; don't need to manipulate signal mask if we're going to
+ exit right away
+
+subst.c
+ - command_substitute: setjmp_nosigs: call instead of setjmp when saving
+ return_catch; don't need to manipulate signal mask
+ - command_substitute: setjmp_nosigs: call instead of setjmp where
+ appropriate when saving top_level; don't need to manipulate signal
+ mask if we're going to exit right away
+
+trap.c
+ - run_exit_trap: setjmp_nosigs: call instead of setjmp when saving
+ return_catch; don't need to manipulate signal mask
+ - run_exit_trap: setjmp_nosigs: call instead of setjmp where
+ appropriate when saving top_level; don't need to manipulate signal
+ mask if we're going to exit right away
+ - _run_trap_internal: setjmp_nosigs: call instead of setjmp when saving
+ return_catch; don't need to manipulate signal mask
+
+builtins/evalfile.c
+ - _evalfile: setjmp_nosigs: call instead of setjmp when saving
+ return_catch; don't need to manipulate signal mask
+
+builtins/evalstring.c
+ - evalstring: setjmp_nosigs: call instead of setjmp when saving
+ return_catch; don't need to manipulate signal mask
+
+shell.c
+ - main: setjmp_nosigs: call instead of setjmp where appropriate when
+ saving top_level; don't need to manipulate signal mask if we're
+ going to exit right away
+ - run_one_command: setjmp_nosigs: call instead of setjmp where
+ appropriate when saving top_level; don't need to manipulate signal
+ mask if we're going to exit right away
+ - run_wordexp: setjmp_nosigs: call instead of setjmp where
+ appropriate when saving top_level; don't need to manipulate signal
+ mask if we're going to exit right away
+
+eval.c
+ - reader_loop: save and restore the signal mask if we get a longjmp
+ that doesn't cause us to return or exit (case DISCARD)
+
+ 12/26
+ -----
+parse.y
+ - shell_input_line_{index,size,len}: now of type size_t; in some cases
+ the unsigned property makes a difference
+ - STRING_SAVER: saved_line_{size,index} now of type size_t
+ - shell_getc: don't allow shell_input_line to grow larger than SIZE_MAX;
+ lines longer than that are truncated until read sees a newline;
+ addresses theoretical buffer overflow described by Paul Eggert
+ <eggert@cs.ucla.edu>
+ - set_line_mbstate: size_t changes like shell_getc
+ - shell_getc: if shell_input_line is larger than 32K, free it and
+ start over to avoid large memory allocations sticking around
+
+variables.c
+ - bind_global_variable: new function, binds value to a variable in
+ the global shell_variables table
+
+variables.h
+ - bind_global_variable: new extern declaration
+
+builtins/declare.def
+ - declare_internal: if -g given with name=value, but variable is not
+ found in the global variable table, make sure to call
+ bind_global_variable so the variable is created and modified at
+ global scope. Fixes a bug where declare -g x=y could modify `x'
+ at a previous function scope
+
+command.h
+ - W_ASSIGNARRAY: new word flag, compound indexed array assignment
+
+subst.h
+ - ASS_MKGLOBAL: new assignment flag, forcing global assignment even in
+ a function context, used by declare -g
+
+execute_cmd.c
+ - fix_assignment_words: set W_ASSIGNARRAY flag if -a option given to
+ declaration builtin
+
+subst.c
+ - do_assignment_internal: explicitly handle case where we are
+ executing in a function and we want to create a global array or
+ assoc variable
+ - shell_expand_word_list: call make_internal_declare if -a option
+ given to declaration builtin (W_ASSIGNARRAY); handle -g option with
+ it (W_ASSNGLOBAL). Fixes inconsistency noticed by Vicente Couce
+ Diaz <vituko@gmail.com>, where declare -ag foo=(bar) could modify
+ array variable foo at previous function scope, not global scope
+
+ 12/27
+ -----
+bashline.c
+ - Minix needs the third argument to tputs to be a void funtion taking
+ an int argument, not an int-returning function. Fix from
+ John E. Malmberg <wb8tyw@qsl.net> as part of VMS bash port
+
+ 12/29
+ -----
+configure.ac,version.c,patchlevel.h
+ - bash-4.3-devel: new version, new shell compatibility level (43)
+
+subst.c
+ - parameter_brace_patsub: put the bash-4.2 code back in from the
+ change of 3/3 that runs the replacement string through quote
+ removal, make it dependent on shell_compatibility_level <= 42
+
+builtins/shopt.def
+ - compat42: new shopt option
+ - set_compatibility_level: change logic to set and unset various
+ compat variables and shell_compatibility_level
+
+COMPAT
+ - new documentation for bash-4.3 compatibility changes
+
+doc/{bash.1,bashref.texi}
+ - compat42: document new shopt option
+
+builtins/shopt.def
+ - set_compatibility_opts: new function, sets the various shopt
+ compat variables based on the value of shell_compatibility_level
+
+builtins/common.h
+ - set_compatibility_opts: new extern declaration
+
+variables.c
+ - BASH_COMPAT: new special variable; sets the shell compatibility
+ level. Accepts values in decimal (4.2) or integer (42) form;
+ Unsetting variable, setting it to empty string, or setting it to
+ out-of-range value sets the shell's compatibility level to the
+ default for the current version. Valid values are 3.1/31 through
+ the current version
+ - sv_shcompat: new function implementing logic for BASH_COMPAT
+
+variables.h
+ - sv_shcompat: new extern declaration
+
+doc/{bash.1,bashref.texi}
+ - BASH_COMPAT: description of new variable
+
+lib/readline/complete.c
+ - _rl_colored_stats: default back to 0 for 4.3 release branch
+
+ 1/5/2013
+ --------
+quit.h
+ - remove spurious call to itrace in CHECK_WAIT_INTR
+
+bashline.c
+ - bash_event_hook: if we're going to jump to top_level, make sure we
+ clean up after readline() by calling rl_cleanup_after_signal().
+ Fixes bug reported against devel branch by Raphaël Droz
+ <raphael.droz@gmail.com>
+ - bash_event_hook: reset the event hook before checking for signals
+ or traps in case we longjmp
+
+doc/{bash.1,bashref.texi}
+ - small additions to the set -e section to make it more clear that
+ contexts where -e is ignored extend to compound commands as well
+ as shell functions
+
+lib/readline/readline.h
+ - rl_signal_event_hook: new extern declaration
+
+lib/readline/input.c
+ - rl_signal_event_hook: new variable, hook function to call when a
+ function (currently just read(2)) is interrupted by a signal and
+ not restarted
+ - rl_getc: call rl_signal_event_hook instead of rl_event_hook
+
+lib/readline/doc/rltech.texi
+ - rl_signal_event_hook: document new function
+
+bashline.c
+ - changes to set rl_signal_event_hook instead of rl_event_hook
+
+lib/readline/readline.h
+ - change readline version numbers to 6.3
+
+ 1/6
+ ---
+doc/{bash.1,bashref.texi}
+ - a couple of changes to the descriptions of the ERR trap and its
+ effects based on a message from Rob Nagler <nagler@bivio.biz>
+
+ 1/9
+ ---
+expr.c
+ - expassign: invalidate curlval before freeing and NULLing tokstr to
+ avoid aliasing issues. Fixes bug reported by Eduardo A. Bustamante
+ López<dualbus@gmail.com> and Dan Douglas <ormaaj@gmail.com>
+
+braces.c
+ - array_concat: don't be so aggressive in trying to short-circuit. We
+ can only short-circuit if we have a single-element array where the
+ element is an empty string (array[0] == "" array[1] = 0x0). Existing
+ practice requires us to replicate arrays and prefix or append empty
+ strings. Fixes bug reported by Eduardo A. Bustamante López
+ <dualbus@gmail.com>
+
+ 1/11
+ ----
+execute_cmd.c
+ - execute_builtin: since mapfile uses evalstring() to run its callbacks
+ internally, just like eval, so it needs to handle the case where the
+ temp environment given to mapfile persists throughout the entire
+ set of callback commands. This might be a problem with trap also, but
+ trap isn't run in the same way. Fixes bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+ 1/13
+ ----
+redir.c
+ - redirection_error: before expanding the redirection word (if
+ expandable_redirection_filename returns true), disable command
+ substitution during expansion. Fixes bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+subst.c
+ - expand_word_internal: case '\\': if the next character is an IFS
+ character, and the expansion occurs within double quotes, and the
+ character is not one for which backslash retains its meaning, add
+ the (escaped) '\' and the (escaped) character. Fixes bug reported
+ by Dan Douglas <ormaaj@gmail.com>
+
+ 1/15
+ ----
+builtins/cd.def
+ - cd_builtin: make sure call to internal_getopt handles -e option.
+ Fixes bug reported by <mashimiao.fnst@cn.fujitsu.com>
+
+ 1/17
+ ----
+subst.c
+ - expand_word_list_internal: make sure tempenv_assign_error is
+ initialized to 0
+
+execute_cmd.c
+ - execute_simple_command: make sure tempenv_assign_error is reset to 0
+ after it's tested to see if an error should force the shell to exit.
+ Fixes problem where a the failure of a tempenv assignment preceding
+ a non-special builtin `sticks' and causes the next special builtin
+ to exit the shell. From a discussion on bug-bash started by
+ douxin <wq-doux@cn.fujitsu.com>
+
+ 1/20
+ ----
+subst.c
+ - parameter_brace_expand_rhs: call stupidly_hack_special_variables
+ after assigning with ${param[:]=word} even if IFS is changing.
+ Suggested by Dan Douglas <ormaaj@gmail.com> [TENTATIVE, needs work
+ on IFS side effects]
+
+command.h
+ - W_GLOBEXP (which was unused) is now W_SPLITSPACE (which isn't used
+ yet)
+
+{execute_cmd,subst,variables}.c
+ - removed all code that mentioned W_GLOBEXP
+ - removed mention of gnu_argv_flags and code that set it
+
+ 1/22
+ ----
+subst.c
+ - param_expand: set W_SPLITSPACE if we expand (unquoted) $* and
+ IFS is unset or null so we can be sure to split this on spaces
+ no matter what happens with IFS later
+ - expand_word_internal: note that param_expand returns W_SPLITSPACE
+ in the returned word flags and keep track of that state with
+ `split_on_spaces'
+
+ 1/23
+ ----
+subst.c
+ - expand_word_internal: if split_on_spaces is non-zero, make sure
+ we split `istring' on spaces and return the resultant word. The
+ previous expansions should have quoted spaces in the positional
+ parameters where necessary. Suggested by Dan Douglas
+ <ormaaj@gmail.com>
+
+execute_cmd.c
+ - execute_command_internal: make sure any subshell forked to run a
+ group command or user subshell at the end of a pipeline runs any
+ EXIT trap it sets. Fixes debian bash bug 698411
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698411
+
+subst.c
+ - shell_expand_word_list: fix code that creates args for and calls
+ make_internal_declare to avoid calling it twice (missing `else'
+ in 12/26 change)
+ - do_assignment_internal: fix code from 12/26 change to fix problem
+ where an existing assoc variable could be converted to an array
+ without checking `mkassoc'
+
+ 1/24
+ ----
+builtins/evalfile.c
+ - _evalfile: add missing `close (fd)' calls before returning to
+ avoid fd leaks. Bug and fix from Roman Rakus <rrakus@redhat.com>
+
+ 1/25
+ ----
+builtins/read.def
+ - read_builtin: don't try to play tricks with the top of the unwind-
+ protect stack after read gets a SIGALRM; save input_string to new
+ memory, run the stack, then restore input_string and assign the
+ variables. Part of fix for bug reported by konsolebox
+ <konsolebox@gmail.com>; the rest of the fix is with the changes in
+ trap and signal handling and doing away with interrupt_immediately
+
+ 1/26
+ ----
+redir.c
+ - redirection_expand, write_here_string, write_here_document: before
+ calling any of the word expansion functions, after setting
+ expanding_redir to 1 (which bypasses the temp environment in the
+ variable lookup functions), call sv_ifs to reset the cached IFS-
+ related variables set by subst.c:setifs(). This ensures that
+ redirections will not get any IFS values that are set in the
+ temporary environment, as Posix specifies. Then, after the word
+ expansions, after resetting expanding_redir to 0, call sv_ifs
+ again to make sure the cached IFS values are set from any
+ assignments in the temporary environment. We force executing_builtin
+ to 1 to `fool' the variable lookup functions into using any temp
+ environment, then reset it to its old value after sv_ifs returns.
+ This is what allows read() to use the (cached) IFS variables set
+ in the temp environment. Fixes inconsistency reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+ 1/29
+ ----
+lib/readline/display.c
+ - update_line: fix off-by-one error when updating vis_lbreaks array
+ in a multibyte locale that occurs when moving multibyte chars from
+ one line down to another. Bug report and fix from Egmont
+ Koblinger <egmont@gmail.com>
+
+ 1/30
+ ----
+configure.ac
+ - changed version to 4.3-alpha
+
+redir.c
+ - redir_open: handle open returning -1/EINTR, which seems to happen
+ a lot with FIFOs and SIGCHLD, and call QUIT to handle other
+ signals that can interrupt open(2). Bug report and initial fix
+ from Mike Frysinger <vapier@gentoo.org>
+
+ 1/31
+ ----
+subst.c
+ - parameter_brace_expand: make sure to propagate the PF_ASSIGNRHS flag
+ to parameter_brace_expand_word
+ - parameter_brace_expand_word: make sure that if the PF_ASSIGNRHS flag
+ is set and we are expanding ${a[@]} or ${a[*]} we set quoted to
+ include Q_DOUBLE_QUOTES before calling array_value_internal, mirroring
+ what we do for $@ and $*. Fixes inconsistency reported by Dan
+ Douglas <ormaaj@gmail.com>
+
+configure.ac
+ - use AC_CHECK_TOOL instead of AC_CHECK_PROG to check for ar, since it
+ will find $host-prefixed versions of utilities. Report and fix from
+ Mike Frysinger <vapier@gentoo.org>
+
+builtins/setattr.def
+ - set_var_attribute: check whether bind_variable (called when the
+ variable whose attributes are being modified is found in the temp
+ environment) just modified a read-only global variable, and don't
+ bother marking the temporary variable for propagation if so. The
+ propagation is superfluous and will result in a strange error
+ message
+
+ 2/2
+ ---
+variables.c
+ - initialize_shell_variables: don't try to import function definitions
+ with invalid names from the environment if already in posix mode,
+ but create them as (invisible) exported variables so they pass
+ through the environment. Print an error message so user knows
+ what's wrong. Fixes bug reported by Tomas Trnka <ttrnka@mail.muni.cz>
+
+ 2/9
+ ---
+
+builtins/read.def
+ - sigalrm_seen, alrmbuf: now global so the rest of the shell (trap.c)
+ can use them
+ - sigalrm: just sets flag, no longer longjmps to alrmbuf; problem was
+ longjmp without manipulating signal mask, leaving SIGALRM blocked
+
+quit.h
+ - move CHECK_ALRM macro here from builtins/read.def so trap.c:
+ check_signals() can call it
+
+trap.c
+ - check_signals: add call to CHECK_ALRM before QUIT
+ - check_signals_and_traps: call check_signals() instead of including
+ CHECK_ALRM and QUIT inline. Integrating check for read builtin's
+ SIGALRM (where zread call to check_signals_and_traps can see it)
+ fixes problem reported by Mike Frysinger <vapier@gentoo.org>
+
+ 2/12
+ ----
+lib/glob/xmbsrtowcs.c
+ - xdupmbstowcs2: fixed but where end of string was not handled
+ correctly, causing loop to go past end of string in a bunch of cases.
+ Fixes bug reported by "Dashing" <dashing@hushmail.com>
+
+
+ 2/13
+ ----
+builtins/pushd.def
+ - popd_builtin: treat any argument that isn't -n or of the form
+ [-+][[:digit:]]* as an error. Fixes problem reported by Bruce
+ Korb <bruce.korb@gmail.com>
+
+ 2/14
+ ----
+configure.ac
+ - add check for sig_atomic_t; already a placeholder for it in
+ config.h.in
+
+ 2/15
+ ----
+subst.c
+ - do_compound_assignment: don't call assign_compound_array_list with
+ a NULL variable in case make_local_xxx_variable returns NULL
+ (it will if you try to shadow a readonly or noassign variable).
+ Fixes bug reported by Richard Tollerton <rich.tollerton@ni.com>
+
+ 2/16
+ ----
+variables.c
+ - make_local_variable: print error messager if an attempt is made to
+ create a local variable shadowing a `noassign' variable. Previously
+ we just silently refused to do it
+
+trap.[ch]
+ - get_original_signal: now global so rest of the shell can use it
+
+sig.c
+ - initialize_shell_signals: install a signal handler for SIGTERM
+ that does nothing except set a sigterm_received flag instead of
+ ignoring it with SIG_IGN, as long as SIGTERM is not ignored when
+ the shell is started. Use get_original_signal early to get the
+ original handler, since we will do that later anyway
+ - set_signal_handler: if installing sigterm_sighandler as the SIGTERM
+ handler, make sure to add SA_RESTART flag to make it as close to
+ SIG_IGN as possible
+
+sig.h
+ - sigterm_sighandler: new extern declaration
+
+quit.h
+ - RESET_SIGTERM: set sigterm_receved to 0
+ - CHECK_SIGTERM: check sigterm_received; if it's non-zero, treat it
+ as a fatal signal and call termsig_handler to exit the shell
+
+jobs.c
+ - make_child: call RESET_SIGTERM just before fork() so we can detect
+ if the child process received a SIGTERM before it's able to change
+ the signal handler back to what it was when the shell started
+ (presumably SIG_DFL). Only has effect if the shell installed
+ sigterm_sighandler for SIGTERM, interactive shells that were not
+ started with SIG_IGN as the SIGTERM handler
+ - make_child: call RESET_SIGTERM in the parent after fork() so the
+ rest of the shell won't react to it
+
+execute_cmd.c
+ - execute_simple_command: call CHECK_SIGTERM after make_child in child
+ to catch SIGTERM received after fork() and before restoring old
+ signal handlers
+ - execute_disk_command: call CHECK_SIGTERM after make_child in child
+ process after restoring old signal handlers and again just before
+ calling shell_execve. Fixes race condition observed by
+ Padraig Brady <p@draigbrady.com> when testing with his `timeout'
+ program
+
+lib/readline/display.c
+ - open_some_spaces: new function, subset of insert_some_chars that just
+ opens up a specified number of spaces to be overwritten
+ - insert_some_spaces: now just calls to open_some_spaces followed by
+ _rl_output_some_chars
+ - update_line: use col_temp instead of recalculating it using
+ _rl_col_width in the case where we use more columns with fewer bytes
+ - update_line: use open_some_spaces and then output the right number
+ of chars instead of trying to print new characters then overwrite
+ existing characters in two separate calls. This includes removing
+ some dodgy code and making things simpler. Fix from Egmont
+ Koblinger <egmont@gmail.com>
+ - use new variable `bytes_to_insert' instead of overloading temp in
+ some code blocks (nls - nfd, bytes that comprise the characters
+ different in the new line from the old)
+
+ 2/18
+ ----
+redir.c
+ - do_redirection_internal: add undoable redirection for the implicit
+ close performed by the <&n- and >&n- redirections. Fixes bug
+ reported by Stephane Chazelas <stephane.chazelas@gmail.com>
+
+ 2/19
+ ----
+sig.c
+ - termsig_handler: an interactive shell killed by SIGHUP and keeping
+ command history will try to save the shell history before exiting.
+ This is an attempt to preserve the save-history-when-the-terminal-
+ window-is-closed behavior
+
+ 2/21
+ ----
+braces.c
+ - brace_expand: if a sequence expansion fails (e.g. because the
+ integers overflow), treat that expansion as a simple string, including
+ the braces, and try to process any remainder of the string. The
+ remainder may include brace expansions. Derived from SuSE bug
+ 804551 example (https://bugzilla.novell.com/show_bug.cgi?id=804551)
+
+ 2/23
+ ----
+{quit,sig}.h,sig.c
+ - sigterm_received declaration now in sig.h; type is sig_atomic_t
+ - sigwinch_received type now sig_atomic_t
+ - sig.h includes bashtypes.h and <signal.h> if SIG_DFL not defined
+ (same logic as trap.h) to pick up sig_atomic_t
+
+unwind_prot.c
+ - include sig.h before quit.h (reverse order)
+
+ 2/27
+ ----
+builtins/shopt.def
+ - reset_shopt_options: make sure check_window_size is reset to the
+ default from config.h, not unconditionally to 0
+
+jobs.[ch]
+ - last_made_pid, last_asynchronous_pid: now volatile. Change from SuSE
+
+jobs.c
+ - wait_for: if we're using sigaction to install a handler for SIGCHLD,
+ make sure we specify SA_RESTART
+
+lib/{tilde,readline}/shell.c
+ - get_home_dir: instead of looking in the password file every time,
+ look once and cache the result
+
+sig.[ch]
+ - sigwinch_received, sigterm_received: now `volatile' qualified
+
+sig.c,quit.h
+ - interrupt_state,terminating_signal: now sig_atomic_t
+
+ 3/1
+ ---
+MANIFEST,examples/*
+ - removed around 120 files without FSF copyrights; requested by
+ Karl Berry in early January
+
+ 3/2
+ ---
+lib/malloc/malloc.c
+ - morecore: only check whether SIGCHLD is trapped if SIGCHLD is defined
+
+doc/bashref.texi
+ - Fixed most of the examples in the GNU Parallel section to use better
+ shell idioms following complaints on bug-bash; added a couple of
+ examples and smoothed out the text
+
+quit.h
+ - include "sig.h" for sig_atomic_t
+
+lib/readline/display.c
+ - update_line: when inserting one or more characters at the end of
+ the display line in a non-multibyte environment, just write from the
+ first difference to the end of the line and return. We don't have
+ to adjust _rl_last_c_pos. This is needed to adjust from the old
+ two-part copy to a single call to _rl_output_some_chars (change of
+ 2/16)
+
+ 3/4
+ ---
+Makefile.in,doc/Makefile.in
+ - PACKAGE_TARNAME, docdir: new variables substituted by autoconf
+ - OTHER_DOCS,OTHER_INSTALLED_DOCS: new variables with auxiliary
+ documentation files to be installed into $(docdir)
+ - install: add new rule to install $(OTHER_DOCS)
+ - uninstall: add new rule to uninstall $(docdir)/$(OTHER_INSTALLED_DOCS)
+
+doc/bash.1
+ - add URL to `POSIX' file in `SEE ALSO' section; put pointer to that
+ section in --posix and set -o posix descriptions
+
+examples/
+ - removed around 110 examples at the request of the FSF due to copyright
+ issues
+
+ 3/5
+ ---
+builtins/setattr.def
+ - readonly: modified help text slightly to make it clearer that
+ functions aren't changed or displayed unless the -f option is given.
+ Report from <gotmynick@gmail.com>
+
+ 3/9
+ ---
+include/typemax.h
+ - SIZE_MAX: define to 65535 (Posix minimum maximum) if not defined
+
+parse.y
+ - include "typemax.h" for possible SIZE_MAX definition, make sure we
+ include it after shell.h
+
+{braces,expr}.c
+ - include "typemax.h" for possible INTMAX_MIN and INTMAX_MAX definitions
+
+ 3/10
+ ----
+bashline.c
+ - bash_default_completion: make sure completion type of `!' (same as
+ TAB but with show-all-if-ambiguous set) and glob-word-completion
+ sets rl_filename_completion_desired to 0 so extra backslashes don't
+ get inserted by `quoting' the completion. We can't kill all the
+ matches because show-all-if-ambiguous needs them. Bug report from
+ Marcel (Felix) Giannelia <info@skeena.net>
+
+[bash-4.3-alpha frozen]
+
+ 3/14
+ ----
+general.c
+ - trim_pathname: use memmove instead of memcpy since the source and
+ destination pathnames may overlap. Report and fix from Matthew
+ Riley <mattdr@google.com>
+
+ 3/18
+ ----
+configure.ac
+ - socklen_t is defined as `unsigned int' if configure can't find it
+
+ 3/20
+ ----
+lib/readline/complete.c
+ - S_ISVTX: since it's not defined on all platforms (Minix), make sure
+ its use is protected with #ifdef
+
+ 3/21
+ ----
+doc/{bash.1,bashref.texi}
+ - Added mention of ${!name[@]} and ${!name[*]} expansions to get all
+ indices of an array. Suggested by Jonathan Leffler
+ <jonathan.leffler@gmail.com>
+
+ 3/24
+ ----
+subst.h
+ - SD_IGNOREQUOTE: new define for skip_to_delim; if set, means that
+ single quotes (for now) will be treated as ordinary characters
+
+subst.c
+ - skip_to_delim: handle SD_IGNOREQUOTE. no callers use it for now
+
+ 3/25
+ ----
+support/config.{guess,sub}
+ - updated to versions from autoconf-2.69
+
+ 3/31
+ ----
+lib/sh/shquote.c
+ - sh_single_quote: short-circuit quoting a single "'" instead of
+ creating a long string with empty single-quoted strings
+
+parser.h
+ - DOLBRACE_QUOTE2: new define, like DOLBRACE_QUOTE, but need to single-
+ quote results of $'...' expansion because quote removal will be
+ done later. Right now this is only done for ${word/pat/rep}
+
+parse.y
+ - parse_matched_pair: set state to DOLBRACE_QUOTE2 for pattern
+ substitution word expansion so we don't treat single quote specially
+ in the pattern or replacement string
+ - parse_matched_pair: if we're parsing a dollar-brace word expansion
+ (${...}) and we're not treating single quote specially within
+ double quotes, single-quote the translation of $'...' ansi-c
+ escaped strings. Original report and fix from Eduardo A.
+ Bustamante López <dualbus@gmail.com>
+
+subst.c
+ - extract_dollar_brace_string: ${word/pat/rep} scanning now sets the
+ DOLBRACE_QUOTE2 flag instead of DOLBRACE_QUOTE so we don't treat
+ single quotes specially within a double-quoted string
+
+execute_cmd.c
+ - fix_assignment_words: skip over assignment statements preceding a
+ command word before trying to figure out whether or not assignment
+ statements following a possible declaration command should be
+ treated specially. Fixes bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+ 4/4
+ ---
+lib/readline/readline.c
+ - _rl_dispatch_subseq: only call _rl_vi_set_last (and check whether
+ the key is a text modification command) if the key sequence length
+ is 1. That keeps the arrow keys from setting the last command
+ when called in vi command mode. Fixes bug reported by Ian A.
+ Watson <watson_ian_a@lilly.com>
+
+ 4/6
+ ---
+lib/readline/bind.c
+ - rl_parse_and_bind: when parsing a double-quoted string as the value
+ of a variable, make sure we skip past the leading double quote.
+ Fix from Andreas Schwab <schwab@linux-m68k.org>
+
+variables.c
+ - hash_lookup: set new local variable last_table_searched to the table
+ a successful lookup appears in; tested in make_local_variable to
+ solve the problem below
+ - make_local_variable: if we find a variable with the tempenv flag
+ set at the same `level' as variable_context', but not found in the
+ temporary_env (temp environment preceding the builtin), return it.
+ The temp environment preceding the function call has already been
+ merged (in execute_function) into the list of variable contexts the
+ function sees as shell_variables by the time this is called. Fixes
+ inconsistency pointed out by Dan Douglas <ormaaj@gmail.com>
+
+subst.c
+ - expand_arith_string: expanded out contents of expand_string,
+ expand_string_internal, expand_string_if_necessary to create a
+ WORD_DESC and call call_expand_word_internal() on it directly.
+ We don't want process substitution to be performed ( 1<(2) ) should
+ mean something different in an arithmetic expression context.
+ It doesn't work to just turn on the DQUOTE flag, since that means
+ that things like ${x["expression"]} are not expanded correctly.
+ Fixes problem pointed out by Dan Douglas <ormaaj@gmail.com>
+
+ 4/13
+ ----
+subst.c
+ - process_substitute: run the EXIT trap before exiting, as other
+ shells seem to. Fixes problem pointed out by Dan Douglas
+ <ormaaj@gmail.com>
+
+lib/readline/readline.c
+ - readline_internal_setup: call rl_vi_insertion_mode to enter vi
+ mode instead of rl_vi_insert_mode to avoid resetting the saved last
+ command information. Posix says that `.' can repeat a command
+ that was entered on a previous line so we need to save the info.
+ Fixes bug reported by Ian A. Watson <watson_ian_a@lilly.com>
+
+ 4/14
+ ----
+lib/readline/complete.c
+ - rl_completion_matches: make sure xrealloc returns something non-null
+ (can happen when interrupted by a signal) before trying to add
+ matches to match_list
+
+subst.c
+ - array_remove_pattern: return NULL right away if array_variable_part
+ returns an invisible variable
+ - array_length_reference: handle array_variable_part returning an
+ invisible variable
+ - get_var_and_type: handle array_variable_part returning an invisible
+ variable
+
+ 4/15
+ ----
+execute_cmd.c
+ - execute_command_internal: make sure to run the EXIT trap for group
+ commands anywhere in pipelines, not just at the end. From a point
+ raised by Andreas Schwab <schwab@linux-m68k.org>
+
+variables.c
+ - bind_int_variable: make sure invisible flag is unset. Fixes problems
+ like "declare -ai a; : $(( a[4]=4 ));"
+
+arrayfunc.c
+ - array_variable_part: return variable even if invisible flag set,
+ callers must handle invisible vars
+
+ 4/18
+ ----
+builtins/set.def
+ - unset_builtin: if -n flag given, call unset_nameref instead of
+ unset_variable
+
+variables.c
+ - find_variable_nameref: print warning message if nameref circular
+ reference detected, return NULL and let caller deal with it
+
+builtins/declare.def
+ - declare_builtin: only disallow global references at this point if
+ we are at the global scope
+
+ 5/16
+ ----
+configure.ac
+ - update release status to beta
+
+ 5/23
+ ----
+trap.c
+ - run_pending_traps: save and restore pipeline around calls to
+ evalstring() in case we get a trap while running a trap. Have to
+ figure out the recursive running traps issue elsewhere. Fixes
+ bug reported by Roman Rakus <rrakus@redhat.com>
+ - run_pending_traps: make sure to set running_trap to the appropriate
+ signal value when running a trap command
+ - run_pending_traps: short-circuit immediately if running_trap set
+ when invoked. Could change this later to only skip if it would
+ run the same trap as currently being run (running_trap == sig + 1)
+
+configure.ac
+ - add warning if bison not found
+
+lib/readline/doc/rltech.texi
+ - new section with an example program illustrating the callback
+ interface. Suggested by Peng Yu <pengyu.ut@gmail.com>
+
+examples/loadables/Makefile.in
+ - remove references to `cut' and `getconf', which were removed in
+ early March
+
+ 5/28
+ ----
+lib/sh/pathphys.c
+ - sh_realpath: correct inverted two arguments to call to sh_makepath.
+ Report and fix from Julien Thomas <jthomas@exosec.fr>
+
+ 6/7
+ ---
+execute_cmd.c
+ - executing_line_number: the else clauses that are conditional on
+ various options being defined can simply be if clauses -- they are
+ mutually exclusive and all have `return' in the body. Fixes bug
+ reported by Flavio Medeiros <flaviomotamedeiros@gmail.com>
+
+ 6/25
+ ----
+lib/readline/readline.c
+ - readline_internal_setup: only sent the meta-key enable string to the
+ terminal if we've been told to use one and the terminal has been
+ successfully initialized (RL_ISSTATE (RL_STATE_TERMPREPPED) != 0).
+ Suggested by Dan Mick <dan.mick@inktank.com>
+
+lib/readline/signals.c
+ - _rl_signal_handler: call any defined signal hook after calling
+ rl_resize_terminal when handling a SIGWINCH. We already have called
+ the original SIGWINCH handler but will not be resending the signal
+ to ourselves
+
+ 6/27
+ ----
+lib/readline/doc/history.3, doc/bash.1
+ - fix description of the `$' modifier to note that it expands to the
+ last *word*, which is not always the last argument. Report from
+ ariyetz@gmail.com via gnu.org RT
+
+ 6/29
+ ----
+lib/glob/smatch.c
+ - glob_asciiranges: initialize to value of GLOBASCII_DEFAULT instead
+ of 0 (0 if not defined)
+
+configure.ac,config.h.in
+ - --enable-glob-asciiranges-default: new option, controls the value of
+ GLOBASCII_DEFAULT; use it to turn globasciiranges shopt option on
+ by default
+
+doc/bashref.texi
+ - document new --enable-glob-asciiranges-default configure option
+
+variables.c
+ - assign_in_env: implement += value appending semantics for assignments
+ preceding command names
+
+ 7/4
+ ---
+expr.c
+ - set lasttok = NUM in all of the functions that result in a number,
+ even if it's a boolean, to avoid errors with constructs like
+ 1 * x = 1, which should be an asignment error. Fixes problem
+ pointed out by Dan Douglas <ormaaj@gmail.com>
+
+parse.y
+ - decode_prompt_string: don't bother to call strcpy if
+ polite_directory_format returns its argument unchanged. It's not
+ necessary and Mac OS X 10.9 aborts because of a supposed overlapping
+ string copy. Bug and fix from simon@hitzemann.org
+
+subst.c
+ - parameter_brace_find_indir: new function, code from
+ parameter_brace_expand_indir that looks up the indirectly-referenced
+ variable, but does not expand it
+ - parameter_brace_expand_indir: call parameter_brace_find_indir to
+ look up indirected variable reference
+ - get_var_and_type: call parameter_brace_find_indir if it looks like we
+ are trying to manipulate an indirect variable reference like
+ ${!b%%foo}. This makes a difference if !b references an array
+ variable. Bug report from Dan Douglas <ormaaj@gmail.com>
+
+ 7/6
+ ---
+lib/sh/casemod.c
+ - sh_modcase: make sure argument passed to is_basic is <= UCHAR_MAX,
+ since cval can convert something to a wchar_t greater than UCHAR_MAX.
+ Fixes bug reported by Tomasz Tomasik <scx.mail@gmail.com>
+
+ 7/8
+ ---
+lib/readline/history.c
+ - add_history_time: if history_length == 0, referencing history_length
+ - 1 will result in an array bounds error, so make history_length be
+ at least 1 before going on. Fixes bug reported by Geng Sheng Liu
+ <gsliu.tju@gmail.com>
+
+builtins/setattr.def
+ - show_func_attributes: display definition (if NODEFS argument is 0) and
+ attributes for a particular function; used by `declare -fp name'
+
+builtins/declare.def
+ - declare_internal: call show_func_attributes if -f supplied with -p.
+ Fixes inconsistency observed by Linda Walsh <bash@tlinx.org>
+
+builtins/common.h
+ - new extern declaration for show_func_attributes
+
+builtins/read.def
+ - read_builtin: check the first supplied variable name for validity
+ before attempting to read any input, since we know we will have to
+ at least use that one. Don't check any other names yet. Suggested
+ by jidanni@jidanni.org
+
+ 7/10
+ ----
+redir.c
+ - do_redirection_internal: when closing a file descriptor with
+ r_close_this ([n]<&-) count close errors as redirection errors if
+ errno ends up as EIO or ENOSPC. Originally reported back in April
+ 2012 by Andrey Zaitsev <jstcdr@gmail.com>
+
+ 7/11
+ ----
+redir.c
+ - do_redirection_internal: before calling check_bash_input, make sure
+ that we don't call check_bash_input for an asynchronous process that
+ is replacing stdin with something else. The seek backwards affects
+ the parent process as well, since parents and children share the
+ file pointer. Fixes problem originally reported in March 2013 by
+ Martin Jackson <mjackson220.list@gmail.com>
+
+ 7/13
+ ----
+doc/{bash.1,bashref.texi}
+ - slight change to add a description of `shopt -o' suggested by Bruce
+ Korb <bruce.korb@gmail.com>
+
+ 7/19
+ ----
+lib/readline/histfile.c
+ - history_do_write: if close returns < 0, make sure we restore the
+ backup history file and return a non-zero value
+ - history_truncate_file: if write or close return < 0, make sure we
+ return a non-zero value
+
+[bash-4.3-beta frozen]
+
+ 7/21
+ ----
+lib/readline/isearch.c
+ - rl_display_search: now takes an entire search context flags word as
+ the second argument, instead of just reverse flag; changed callers
+ - rl_display_search: if the search has failed, add `failed ' to the
+ beginning of the search prompt
+ - _rl_isearch_dispatch: if the search has failed, display the entire
+ search string with an indication that the search failed but with the
+ last matching line. Suggested by jidanni@jidanni.org
+
+command.h
+ - W_ASSIGNINT: new word flag; used internally for make_internal_declare
+ and set by fix_assignment_words
+
+execute_cmd.c
+ - fix_assignment_words: set W_ASSIGNINT if compound assignment and -i
+ given as option. We don't do anything with the value yet
+
+subst.c
+ - shell_expand_word_list: rework the way the option list that is
+ passed to make_internal_declare is created
+
+ 8/1
+ ---
+doc/{bash.1,bashref.texi}
+ - minor changes to description of $! based on a report from Chris
+ Down <chris@chrisdown.name>
+
+arrayfunc.c
+ - assign_array_element_internal: before trying to get an array's max
+ index to process a negative subscript, make sure the array exists.
+ Bug report from Geir Hauge <geir.hauge@gmail.com>
+
+ 8/2
+ ---
+arrayfunc.c
+ - assign_array_element_internal: before using array_max_index() when
+ processing a negative subscript, make sure the variable is an array.
+ if it's not, use 0 as array_max_index assuming it's a string.
+ Fixes bug report from Geir Hauge <geir.hauge@gmail.com>
+
+ 8/3
+ ---
+Makefile.in
+ - pcomplete.o: add dependency on $(DEFDIR)/builtext.h. Suggested by
+ Curtis Doty <curtis@greenkey.net>
+
+ 8/5
+ ---
+lib/glob/sm_loop.c
+ - strcompare: short-circuit and return FNM_NOMATCH if the lengths of the
+ pattern and string (pe - p and se - s, respectively) are not equal
+ - strcompare: don't bother trying to set *pe or *se to '\0' if that's
+ what they already are. Fixes bug reported by Geir Hauge
+ <geir.hauge@gmail.com>
+
+ 8/6
+ ---
+doc/{bash.1,bashref.texi},builtins/hash.def,lib/readline/doc/rluser.texi
+ - minor typo changes from Geir Hauge <geir.hauge@gmail.com>
+
+bultins/help.def
+ - show_longdoc: avoid trying to translate the empty string because it
+ often translates to some boilerplate about the project and
+ translation. Report and fix from Geir Hauge <geir.hauge@gmail.com>
+
+ 8/8
+ ---
+builtins/help.def
+ - help_builtin: try two passes through the list of help topics for each
+ argument: one doing exact string matching and one, if the first pass
+ fails to find a match, doing string prefix matching like previous
+ versions. This prevents `help read' from matching both `read' and
+ `readonly', but allows `help r' to match everything beginning with
+ `r'. Inspired by report from Geir Hauge <geir.hauge@gmail.com>
+
+ 8/13
+ ----
+builtins/fc.def
+ - fc_builtin,fc_gethnum: calculate `real' end of the history list and
+ use it if -0 is specified as the beginning or end of the history
+ range to list. Doesn't work for fc -e or fc -s by design. Feature
+ requested by Mike Fied <micfied@gmail.com>
+
+ 8/16
+ ----
+trap.c
+ - _run_trap_internal: use {save,restore}_parser_state instead of
+ {save,restore}_token_state. It's more comprehensive
+
+ 8/23
+ ----
+doc/bash.1
+ - disown: remove repeated text. Report and fix from Thomas Hood
+ <jdthood@gmail.com>
+
+ 8/25
+ ----
+lib/readline/rltty.c
+ - set_special_char: fix prototype (last arg is rl_command_func_t *)
+
+sig.c
+ - set_signal_handler: return oact.sa_handler only if sigaction
+ succeeds; if it doesn't, return SIG_DFL (reasonable default). From
+ https://bugzilla.redhat.com/show_bug.cgi?id=911404
+
+bashline.c
+ - attempt_shell_completion: fix to skip assignment statements preceding
+ command name even if there are no programmable completions defined.
+ From https://bugzilla.redhat.com/show_bug.cgi?id=994659
+ - attempt_shell_completion: if still completing command word following
+ assignment statements, do command completion even if programmable
+ completion defined for partial command name entered so far
+
+ 8/26
+ ----
+pcomplete.c
+ - pcomp_filename_completion_function: make sure rl_filename_dequoting_function
+ is non-NULL before trying to call it. Bug and fix from
+ Andreas Schwab <schwab@linux-m68k.org>
+
+bashline.c
+ - bash_command_name_stat_hook: if *name is not something we're going
+ to look up in $PATH (absolute_program(*name) != 0), just call the
+ usual bash_filename_stat_hook and return those results. This makes
+ completions like $PWD/exam[TAB] add a trailing slash
+
+ 9/2
+ ---
+builtins/read.def
+ - read_builtin: before comparing what we read to the delim, make sure
+ we are not supposed to be ignoring the delimiter (read -N). We
+ set the delim to -1, but it's possible to read a character whose
+ int value ends up being between -1 and -128. Fixes bug
+ reported by Stephane Chazelas <stephane.chazelas@gmail.com>
+
+doc/{bash.1,bashref.texi}
+ - word splitting: crib some language from Posix to make it clear that
+ characters in IFS are treated as field *terminators*, not field
+ *separators*. Addresses issue raised by DJ Mills
+ <danielmills1@gmail.com>
+
+lib/readline/{util.c,rldefs.h}
+ - _rl_stricmp,_rl_strnicmp: now take const char * string arguments;
+ changed prototype declarations
+
+ 9/5
+ ---
+doc/{bash.1,bashref.texi}
+ - [[: modify description of pattern matching to make it clear that the
+ match is performed as if the extglob option were enabled. From Red
+ Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=1002078
+
+ 9/12
+ ----
+lib/readline/isearch.c
+ - _rl_isearch_dispatch: if we read an ESC and it's supposed to
+ terminate the search, make sure we check for typeahead with
+ _rl_pushed_input_available, since installing a hook function causes
+ typeahead to be collected in `ibuffer' (input.c). If there is any,
+ make sure we still use the ESC as a prefix character. Bug and fix
+ from Mike Miller <mtmiller@ieee.org>
+
+ 9/16
+ ----
+builtins/{caller,cd,kill,pushd,wait}.def
+ - builtin_usage(): make sure call to this sets return status to
+ EX_USAGE
+
+ 9/18
+ ----
+terminal.c
+ - rl_change_environment: new application-settable variable; if non-
+ zero (the default), readline will modify LINES and COLUMNS in the
+ environment when it handles SIGWINCH
+ - _rl_get_screen_size: if rl_change_environment is non-zero, use setenv
+ to modify LINES and COLUMNS environment variables
+
+readline.h
+ - rl_change_environment: new extern declaration for applications
+
+ 9/22
+ ----
+configure.ac
+ - relstatus: bumped version to bash-4.3-beta2
+
+ 9/24
+ ----
+
+lib/readline/readline.c
+ - bind_arrow_keys_internal: added more key bindings for the numeric key
+ pad arrow keys on mingw32. Patch from Pierre Muller
+ <pierre.muller@ics-cnrs.unistra.fr>
+
+ 10/19
+ -----
+
+bashline.c
+ - maybe_restore_tilde: version of restore_tilde that honors `direxpand';
+ calls restore_tilde after saving directory expansion hook if
+ necessary. Report from Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/cd.def
+ - -@: new option, allows cd to use `extended attributes' present in
+ NFSv4, ZFS; idea taken from ksh93. Attributes associated with a
+ file are presented as a directory containing the attributes as
+ individual files. Original patch contributed by Cedric Blancher
+ <cedric.blancher@gmail.com>
+
+ 10/20
+ -----
+aclocal.m4
+ - BASH_CHECK_MULTIBYTE: check for wcwidth being broken with unicode
+ combining characters needs a value to use when cross-compiling.
+ Bug report from Bert Sutherland <bertsutherland@gmail.com>
+
+doc/{bash.1,bashref.texi}
+ - document new -@ option to cd builtin
+
+ 10/28
+ -----
+lib/glob/{{gmisc,glob}.c,glob.h}
+ - extglob_pattern renamed to extglob_pattern_p, declared in glob.h
+
+subst.c
+ - expand_word_internal: typo fix: case to fix " $@\ " bug in bash-4.2
+ had a typo (& isexp instead of &&)
+
+ 10/29
+ -----
+input.c
+ - getc_with_restart: make sure local_index and local_bufused are
+ reset to 0 before returning EOF, in case we are running an interactive
+ shell without line editing and ignoreeof is set. Report and fix
+ from Yong Zhang <yong.zhang@windriver.com>
+
+lib/readline/search.c
+ - _rl_nsearch_init: take out extra third argument to rl_message; it
+ only matches prototype (and maybe format) in cases where
+ PREFER_STDARG and USE_VARARGS are both undefined, which is rare
+
+ 10/31
+ -----
+subst.c
+ - process_substitute: when opening the named pipe in the child, open
+ without O_NONBLOCK to avoid race conditions. Happens often on AIX.
+ Bug report and fix from Michael Haubenwallner
+ <michael.haubenwallner@salomon.at>
+
+builtins/ulimit.def
+ - RLIMIT_NTHR: if RLIMIT_PTHREAD is not defined, but RLIMIT_NTHR is,
+ use RLIMIT_NTHR (NetBSD)
+
+ 11/5
+ ----
+locale.c
+ - set_default_locale_vars,set_locale_var: if TEXTDOMAINDIR has been
+ set, and default_dir has a non-null value, call bindtextdomain(3)
+ when TEXTDOMAIN is assigned a value. Fixes problem reported by
+ Michael Arlt <qwertologe@googlemail.com>
+
+ 11/6
+ ----
+builtins/cd.def
+ - cdxattr: only create synthetic pathname in `buf' if NDIRP argument
+ is non-null
+ - change_to_directory: if we have specified -@ and cdxattr returns
+ failure, fail immediately. Fixes bug reported by Joshuah Hurst
+ <joshhurst@gmail.com>
+
+ 11/12
+ -----
+redir.c
+ - print_redirection: change r_err_and_out (&>) and its append form,
+ r_append_err_and_out (&>>) cases to separate redirection operator
+ from filename by a space, in case we have a process substitution.
+ Fixes bug reported by admn ombres <admn.ombres@gmail.com>
+
+ 11/15
+ -----
+execute_cmd.c
+ - execute_simple_command: don't close process substitution fds until
+ we are finished executing any current shell function. Partial fix
+ for bug reported by John Dawson <john.dawson@gmail.com>
+
+support/shobj-conf
+ - add support for Darwin 13 (Mac OS X 10.9, Mavericks). Based on a
+ report by Ludwig Schwardt <ludwig.schwardt@gmail.com>
+
+ 11/20
+ -----
+[bash-4.3-rc1 frozen]
+
+ 11/24
+ -----
+builtins/printf.def
+ - bind_printf_variable: make sure that the variable assigned to is
+ no longer marked as invisible. Fixes bug reported by NBaH
+ <nbah@sfr.fr>
+
+ 11/28
+ -----
+jobs.c
+ - delete_old_job: fix off-by-one error in job index in call to
+ internal_warning. Bug report from Peter Cordes <peter@cordes.ca>
+
+ 11/30
+ -----
+doc/bashref.texi
+ - add string to description of special parameters with name of
+ special parameter prefixed by a $, so you can search for $#,
+ for instance
+
+ 12/2
+ ----
+lib/readline/{histexpand.c
+ - get_history_event: account for current_history() possibly returning
+ NULL. Report and fix from Pankaj Sharma <pankaj.s01@samsung.com>
+
+
+ 12/11
+ -----
+
+lib/readline/parse-colors.c
+ - get_funky_string: don't call abort if we see something we can't
+ parse; just return an error
+ - _rl_parse_colors: if we encounter an error while parsing $LS_COLORS
+ we need to leave _rl_color_ext_list as NULL after freeing its
+ elements, then turn off _rl_colored_stats. Report and fix from Martin
+ Wesdorp <mwesdorp@casema.nl>
+
+ 12/13
+ -----
+
+lib/readline/parse-colors.c
+ - _rl_parse_colors: if we encounter an unrecognized prefix, throw an
+ error but try to recover and go on to the next specification
+
+variables.c
+ - make_local_variable: for new variables this function creates, set
+ the att_invisible attribute. All callers from declare_internal.
+ Indirectly, this is a fix for bug with `declare -n var; var=foo;'
+ reported by Pierre Gaston <pierre.gaston@gmail.com>
+ - bind_variable: if assigning to nameref variable that doesn't have
+ a value yet (e.g., with `declare -n var; var=foo'), don't try to
+ use the unset name. Fixes a segfault reported by Pierre Gaston
+ <pierre.gaston@gmail.com>
+
+execute_cmd.c
+ - execute_command_internal: make sure last_command_exit_value is set
+ to 0 after any command executed in the background. Fixes bug
+ reported by Martin Kealey <martin@kurahaupo.gen.nz>
+
+ 12/17
+ -----
+support/config.{guess,sub}
+ - updated to latest versions from git
+
+ 12/19
+ -----
+parse.y
+ - struct STRING_SAVER: now has a new `flags' element, to identify the
+ caller: alias expansion, double-paren parsing, or parse_and_execute
+ - push_string: now sets flags to PSH_ALIAS if `ap' argument is non-NULL
+ - push_string: now doesn't attempt to call strlen on a NULL string to
+ set shell_input_line_size
+ - parser_expanding_alias, parser_save_alias, parser_restore_alias: new
+ functions to provide an external interface to push_string and
+ pop_string; parser_save_alias sets flags element to PSH_SOURCE (could
+ be renamed PSH_EXTERN someday)
+ - shell_getc: when yy_getc returns '\0', instead of just testing
+ whether the pushed_string_list is not-empty before popping it, don't
+ pop if if the saved string has flags PSH_SOURCE, indicating that
+ parse_and_execute set it before setting bash_input to the string.
+ We should continue reading to the end of that string before popping
+ back to a potential alias. Partial solution for the problem of aliases
+ with embedded newlines containing `.' commands being executed out of
+ order reported by Andrew Martin <andrew.martin@gmail.com>
+ - shell_getc: when yy_getc returns '\0' and there is a saved string of
+ type PSH_SOURCE, restart the read without popping the string stack
+ if we have not read to the end of bash_input.location.string. Rest
+ of fix for out-of-order execution problem
+
+externs.h
+ - parser_expanding_alias, parser_save_alias, parser_restore_alias: new
+ extern function declarations
+
+builtins/evalstring.c
+ - pe_prologue: if the parser is expanding an alias, make sure to add
+ an unwind-protect to restore the alias; undoes the work that will be
+ performed by parse_and_execute/parse_string
+ - parse_and_execute,parse_string: after calling push_stream to save
+ bash_input, check whether or not the parser is currently expanding
+ an alias (parser_expanding_alias() != 0). If it is, we want to save
+ that string in the pushed_string_list, which we do with
+ parser_save_alias.
+
+ 12/23
+ -----
+execute_cmd.c
+ - execute_for_command: make sure to set line_number before expanding
+ the word list, so expansion errors have the right line number.
+ From a report from Ben Okopnik <ben@okopnik.com>
+
+expr.c
+ - exp2: save token pointer before calling readtok(), arrange to use
+ saved token pointer when printing error token on a division by 0
+ error
+
+ 12/27
+ -----
+lib/readline/display.c
+ - rl_redisplay: when calculating effects of invisible characters in a
+ prompt that is split across physical screen lines to set the indices
+ of linebreaks, don't bother testing local_prompt_prefix (line 751).
+ That prefix doesn't matter when calculating prompt visible and
+ invisible characters. Fixes problem reported by Jinesh Choksi
+ <jinesh@onelittlehope.com>
+
+Makefile.in
+ - install: make sure to use $(DESTDIR) when installing OTHER_DOCS.
+ Report and fix from Matthias Klose <doko@debian.org>
+
+doc/texinfo.tex
+ - updated to version of 2013-09-11
+
+ 12/28
+ -----
+lib/readline/undo.c
+ - rl_do_undo: if we are undoing from a history entry (rl_undo_list ==
+ current_history()->data), make sure the change to rl_line_buffer is
+ reflected in the history entry. We use the guts of
+ rl_maybe_replace_line to do the work. Fixes problem reported by
+ gregrwm <backuppc-users@whitleymott.net>
+
+ 12/30
+ -----
+sig.c
+ - sigint_sighandler: if we get a SIGINT (and this signal handler is
+ installed) while the wait builtin is running, note that we received
+ it in the same way as jobs.c:wait_sigint_handler and return. The
+ various wait_for functions will look for that with CHECK_WAIT_INTR.
+ This fixes the wait builtin not being interruptible in an interactive
+ job control shell
+
+ 12/31
+ -----
+trap.c
+ - set_signal_hard_ignored: rename set_signal_ignored to this, since it
+ both sets original_signals[sig] and sets the HARD_IGNORE flag
+ - set_signal_ignored: new function, now just sets original_signals[sig]
+
+trap.h
+ - set_signal_hard_ignored: new external declaration
+
+sig.c
+ - initialize_terminating_signals: call set_signal_hard_ignored instead
+ of set_signal_ignored for signals with disposition SIG_IGN when the
+ shell starts
+
+execute_cmd.c
+ - setup_async_signals: make sure we get the original dispositions for
+ SIGINT and SIGQUIT before starting the subshell, and don't call
+ set_signal_ignored because that sets original_signals[sig]. If we
+ don't, subsequent attempts to reset handling using trap will fail
+ because it thinks the original dispositions were SIG_IGN. Posix
+ interpretation 751 (http://austingroupbugs.net/view.php?id=751)
+
+ 1/2/2014
+ --------
+lib/sh/stringvec.c
+ - strvec_mcreate, strvec_mresize: versions of create and resize that
+ use malloc and realloc, respectively, instead of xmalloc/xrealloc
+
+braces.c
+ - expand_amble,mkseq: use strvec_mcreate/strvec_mresize so we can
+ catch and handle memory allocation failures instead of aborting
+ with the xmalloc/xrealloc interface
+
+lib/sh/strdup.c
+ - strdup replacement function for ancient systems that don't have it
+
+lib/sh/itos.c
+ - mitos: new function, itos that uses strdup instead of savestring
+
+externs.h
+ - strvec_mcreate/strvec_mresize: new extern declarations
+ - mitos: new extern declaration
+
+configure.ac
+ - bash version moved to 4.3-rc2
+
+ 1/6
+ ---
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+ - separate the description of what happens when readline reads the
+ tty EOF character from the description of delete-char, leaving a
+ note in the delete-char description about common binding for ^D.
+ From suggestion by Parke <parke.nexus@gmail.com>
+
+lib/readline/doc/{version.texi,history.3,*.texi}
+ - updated email addresses and copyright dates
+
+ 1/7
+ ---
+variables.c
+ - delete_var: new function, just removes a variable from a hash table
+ and frees it, without doing anything else
+ - make_variable_value: if we are trying to assign to a nameref variable,
+ return NULL if the value is null or the empty string or not a valid
+ identifier
+
+variables.h
+ - delete_var: new extern declaration
+
+subst.h
+ - ASS_NAMEREF: new define for assignments, means assigning to a nameref
+ variable
+
+builtins/declare.def
+ - declare_internal: if we are creating and assigning to a nameref
+ variable, make sure the value is a valid variable name (checks done
+ by make_variable_value via bind_variable_value) and display an
+ error message, deleting the variable we just created, if it is not.
+ Fixes bug reported by Peggy Russell <prusselltechgroup@gmail.com>
+
+ 1/9
+ ---
+builtins/declare.def
+ - declare_internal: turning on nameref attribute for an existing
+ variable turns off -i/-l/-u/-c attributes (essentially the ones
+ that cause evaluation at assignment time) for ksh93 compat
+
+builtins/setattr.def
+ - show_name_attributes: if asked to display attributes and values for
+ a nameref variable, don't follow the nameref chain to the end. More
+ ksh93 compat
+
+ 1/10
+ ----
+trap.c
+ - _run_trap_internal: use {save,restore}_parser_state instead of
+ {save,restore}_token_state, like in run_pending_traps(); don't
+ need to save and restore last_command_exit_value as a result
+ - _run_trap_internal: call {save,restore}_pipeline like in
+ run_pending_traps()
+ - run_pending_traps: since we no longer run traps in a signal handler
+ context, do not block and unblock the trapped signal while the
+ trap is executing
+ - run_pending_traps: allow recursive invocations (basically, running
+ traps from a trap handler) with only a warning if the shell is
+ compiled in debug mode. If a caller doesn't want this to happen,
+ it should test running_trap > 0. signal_in_progress (sig) only works
+ for the signals the shell handles specially
+
+bashline.c
+ - bash_event_hook: make sure we clean up readline if interrupt_state
+ is set, not only when SIGINT is not trapped. check_signals_and_traps
+ will call check_signals, which calls QUIT, which will longjmp back
+ to top_level, running the interrupt trap along the way. Fixes the
+ problem of signal handlers being reset out from under readline, and
+ not being set properly the next time readline is called, because
+ signals_set_flag is still set to 1. XXX - might need to do this
+ for other signals too?
+
+ 1/11
+ ----
+subst.h
+ - SD_GLOB: new define for skip_to_delim; means we are scanning a
+ glob pattern.
+
+subst.c
+ - skip_to_delim: if flags include SD_GLOB, assume we are scanning a
+ glob pattern. Currently only used to skip bracket expressions
+ which may contain one of the delimiters
+
+ 1/12
+ ----
+subst.c
+ - parameter_brace_expand: when expanding $@ as part of substring
+ expansion, pattern substitution, or case modification, don't turn
+ on the QUOTED_NULL flag. The code that constructs the word to be
+ returned from expand_word_internal expects a different code path
+ when $@ is being expanded. Fixes bug reported by Theodoros
+ V. Kalamatianos <thkala@gmail.com>
+
+ 1/19
+ ----
+subst.c
+ - list_dequote_escapes: new function; analogue of list_quote_escapes
+
+pathexp.c
+ - quote_string_for_globbing: fix case where unescaped ^A is last char
+ in string; need to pass it through unaltered instead of turning it
+ into a bare backslash
+ - quote_string_for_globbing: when quoting for regexp matching in [[,
+ don't treat backslash as a quote character; quote the backslash as
+ any other character. Part of investigation into reports from
+ Eduardo A. Bustamante López <dualbus@gmail.com>
+
+ 1/25
+ ----
+builtins/gen-helpfiles.c
+ - write_helpfiles: add prototype
+ - make sure to #undef xmalloc/xfree/xrealloc/free if USING_BASH_MALLOC
+ is defined. the code does not use them, and we don't link against
+ xmalloc.o. Report from Linda Walsh <bash@tlinx.org>
+
+Makefile.in
+ - variables.o: add dependency on builtins/builtext.h; helps with
+ parallel builds. Report from Linda Walsh <bash@tlinx.org>
+
+support/shobj-conf
+ - darwin: combine the stanzas into one that will not require them to
+ be updated on each Mac OS X release. Report and fix from Max Horn
+ <max@quendi.de>
+
+ 1/27
+ ----
+support/shobj-conf
+ - darwin: changed the install_name embedded into the shared library
+ to contain only the major version number, not the minor one. The
+ idea is that the minor versions should all be API/ABI compatible,
+ and it is better to link automatically with the latest one. Idea
+ from Max Horn <max@quendi.de>
+
+ 1/29
+ ----
+[bash-4.3-rc2 released]
+
+ 1/30
+ ----
+lib/readline/readline.h
+ - rl_clear_history, rl_free_keymap: add extern declarations. Report
+ from Hiroo Hayashi <hiroo.hayashi@computer.org>
+
+general.c
+ - include trap.h for any_signals_trapped() prototype
+
+lib/sh/unicode.c
+ - include <stdio.h> for sprintf prototype
+
+ 1/31
+ ----
+execute_cmd.c
+ - execute_simple_command: only posix-mode shells should exit on an
+ assignment failure in the temporary environment preceding a special
+ builtin. This is what the documentation and code comments have
+ always said
+ - execute_simple_command: make sure redirection errors, word expansion
+ errors, and assignment errors to Posix special builtins cause a
+ non-interactive posix mode shell to exit. Previously the shell
+ would not exit if the failed special builtin was on the LHS of ||
+ or &&
+
+pathexp.c
+ - quote_string_for_globbing: when quoting a regular expression
+ (QGLOB_REGEXP), allow an unquoted backslash to pass through
+ unaltered. Don't use it as a quote character or quote it. More
+ investigation from 1/24 and report by Mike Frysinger
+ <vapier@gentoo.org>
+ - quote_string_for_globbing: when quoting a regular expression
+ (QGLOB_REGEXP), turn CTLESC CTLESC into CTLESC without adding a
+ backslash to quote it. We should not have to quote it because it is
+ not a character special to EREs. More investigation from 1/24
+
+lib/glob/glob.c
+ - glob_testdir: now takes a second flags argument (currently unused);
+ changed prototype and callers
+
+ 2/1
+ ---
+lib/glob/glob.c
+ - glob_testdir: if flags argument includes GX_ALLDIRS (globstar), use
+ lstat so we skip symlinks when traversing the directory tree.
+ Originally reported by Chris Down <chris@chrisdown.name>
+
+ 2/2
+ ---
+lib/readline/undo.c
+ - rl_do_undo: make sure CUR is non-zero before dereferencing it to
+ check cur->data against rl_undo_list. Report and fix from
+ Andreas Schwab <schwab@linux-m68k.org>
+
+doc/{bash.1,bashref.texi}
+ - added slight clarifying language to the description of $*,
+ describing what happens when the expansion is not within double
+ quotes
+
+ 2/4
+ ---
+test.c
+ - unary_test: add code to -v case so that it interprets `bare' array
+ references (foo[1]) and returns true if that index has a value
+
+ 2/5
+ ---
+trap.c
+ - restore_default_signal: fix SIGCHLD special case for SIG_TRAPPED flag
+ off but SIG_INPROGRESS mode set and handler IMPOSSIBLE_TRAP_HANDLER;
+ continue with resetting handler in this case. maybe_set_sigchld_trap
+ will check these things before resetting sigchld trap from
+ run_sigchld_trap. Fixes (apparently long-standing?) problem reported
+ by Alexandru Damian <alexandru.damian@intel.com>
+
+ 2/6
+ ---
+lib/sh/strtrans.c
+ - ansic_quote: fixed a bug when copying a printable character that
+ consumes more than one byte; byte counter was not being incremented.
+ Bug report from jidanni@jidanni.org
+
+ 2/7
+ ---
+input.c
+ - getc_with_restart: if read(2) returns -1/EINTR and interrupt_state or
+ terminating_signal is set (which means QUIT; will longjmp out of this
+ function), make sure the local buffer variables are zeroed out to
+ avoid reading past the end of the buffer on the next call. Bug report
+ from Dan Jacobson <jidanni@jidanni.org>
+
+ 2/9
+ ---
+bashline.c
+ - command_word_completion_function: if a directory in $PATH contains
+ quote characters, we need to quote them before passing the candidate
+ path to rl_filename_completion_function, which performs dequoting on
+ the pathname it's passed. Fixes bug reported by Ilyushkin Nikita
+ <ilyushkeane@gmail.com>
+
+ 2/11
+ ----
+parse.y
+ - xparse_dolparen: save and restore shell_eof_token around call to
+ parse_string, intead of just leaving it set to ')'
+ - shell_getc: when -v is set, only print the command line when
+ shell_eof_token is 0, so we don't print it multiple times when
+ recursively entering the parser to parse $(...) commands. Fixes
+ bug reported by Greg Wooledge <wooledg@eeg.ccf.org>
+
+[changed release status to 4.3-release]
+
+ 2/13
+ ----
+lib/sh/strtrans.c
+ - ansic_quote: handle case where mbrtowc reports that the multibyte
+ sequence is incomplete or invalid. Fixes bug reported by
+ Eduardo A. Bustamante López <dualbus@gmail.com>
+
+ 2/14
+ ----
+variables.c
+ - find_variable_nameref_context: fix a problem that caused the loop
+ to go one context too close to the global context. In some cases,
+ simple variable assignment would set a variable in the global
+ context instead of a local context. Bug report from
+ Geir Hauge <geir.hauge@gmail.com>
+
+ 2/26
+ ----
+[bash-4.3 released]
+
+ 2/27
+ ----
+aclocal.m4
+ - broken wcwidth check: fix typo reported by David Michael
+ <fedora.dm0@gmail.com>
+
+ 2/28
+ ----
+support/bashbug.sh
+ - add ${BUGADDR} to error message printed if sending mail fails
+
+trap.c
+ - _run_trap_internal: don't call {save,restore}_pipeline if running
+ DEBUG trap; run_debug_trap calls them itself. Fixes bug reported
+ by Moe Tunes <moetunes42@gmail.com>
+
+test.c
+ - unary_test: fix 'R' case by using find_variable_noref instead of
+ find_variable
+ - test_unop: add back missing 'R' case. Fixes bug reported by
+ NBaH <nbah@sfr.fr>
+
+ 3/2
+ ---
+jobs.c
+ - end_job_control: if job control is active, we changed the terminal's
+ process group, so make sure we restore it. Fixes bug reported by
+ Eduardo A. Bustamante López <dualbus@gmail.com>
+
+ 3/7
+ ---
+pcomplete.c
+ - pcomp_curtxt: new variable, holds the original text to be completed
+ as passed to the programmable completion code
+ - pcomp_filename_completion_function: if we are running compgen
+ (presumably in a shell function completion) and performing readline
+ completion, check the word being completed. If it's not empty, but
+ the original word passed to the programmable completion code is an
+ empty string (""), call a dequoting function if one is available.
+ This compensates for an assumption in bash-completion. Reported by
+ Albert Shih <Albert.Shih@obspm.fr>
+
+lib/readline/readline.c
+ - _rl_dispatch_subseq: when deciding whether or not to set vi mode's
+ idea of the last command, use whether or not the dispatching keymap
+ is vi_movement_keymap instead of the key sequence length. The `c',
+ `d', and `y' commands all take motion commands as `arguments' and
+ will produce key sequences longer than 1 character. The arrow keys
+ will end up dispatching out of a different keymap, so the test will
+ prevent arrow keys from setting the last command (the problem in
+ bash-4.2). Bug report from Daan van Rossum <daan@flash.uchicago.edu>
+
+lib/readline/vi_mode.c
+ - _rl_vi_motion_command: convenience function to test whether a key is
+ a vi-mode motion command
+
+lib/readline/rlprivate.h
+ - _rl_vi_motion_command: extern declaration
+
+parse.y
+ - parse_matched_pair: we should not skip processing single quotes in
+ posix mode if dolbrace_state == DOLBRACE_QUOTE2 (pattern
+ substitution). Fixes bug reported by David Sines
+ <dave.gma@googlemail.com>
+
+ 3/10
+ ----
+lib/readline/readline.c
+ - _rl_dispatch_callback: treat a return value of -1 as the end of
+ a command dispatch sequence if the current context doesn't
+ indicate that we're reading a multi-key sequence
+ ((cxt->flags & KSEQ_SUBSEQ) == 0). Turn off the multikey flag
+ and free the context chain in this case. Fixes one bug reported
+ by Felix Yan <felixonmars@gmail.com> to bug-readline list
+ - _rl_dispatch_callback: treat a return value of > 0 the same as 0
+ and return from the function, since only values < 0 cause us to
+ simulate recursion. Rest of fix for bug tracked down by
+ Anatol Pomozov <anatol.pomozov@gmail.com>
+
+ 3/11
+ ----
+
+execute_cmd.c
+ - execute_in_subshell: if a longjmp occurs, set result to
+ EXECUTION_FAILURE only if last_command_exit_value == EXECUTION_SUCCESS;
+ use value of last_command_exit_value otherwise. Fixes cosmetic
+ issue reported by Dennis Lambe Jr. <malsyned@malsyned.net>
+
+doc/bash.1
+ - shell-kill-word and shell-backward-kill-word should be documented
+ as unbound by default. Report from Oliver Hartley
+ <ohartley@talktalk.net>
+
+trap.c
+ - run_pending_traps: save value of $? before running trap commands in
+ trap_saved_exit_value, like run_exit_trap
+ - _run_trap_internal: save value of $? before running trap commands in
+ trap_saved_exit_value, like run_exit_trap
+
+builtins/common.c
+ - get_exitstat: when running `return' in a trap action, and it is not
+ supplied an argument, use the saved exit status in
+ trap_saved_exit_value. Fixes Posix problem reported by
+ Eduardo A. Bustamante López <dualbus@gmail.com>
+
+ 3/13
+ ----
+lib/sh/shquote.c
+ - sh_contains_quotes: new function, returns true if a given string
+ contains any of the shell quote characters (single quote, double
+ quote, or backslash)
+
+externs.h
+ - sh_contains_quotes: new extern declaration
+
+pcomplete.c
+ - pcomp_filename_completion_function: more changes for the benefit of
+ bash-completion: if the argument is not the same as the original
+ argument passed to the programmable completion code (pcomp_curtxt),
+ and we are being run by compgen as part of a completion, dequote the
+ argument as bash-completion expects. Fix for the complete-word-
+ with-quoted-special-chars problem with bash-completion
+
+ 3/17
+ ----
+execute_cmd.c
+ - execute_intern_function: when in posix mode, make defining a function
+ with the same name as a special builtin a fatal error only when the
+ shell is not interactive. Interactive shells display an error
+ message and go on. From a discussion with Doug McIlroy
+ <doug@cs.dartmouth.edu>
+
+ 3/18
+ ----
+arrayfunc.c
+ - assign_compound_array_list: when using expand_assignment_string_to_string
+ to expand the value in a ( [x]=y ) compound assignment, make sure
+ that we convert 0x0 to "" when expanding [x]= so it doesn't appear as
+ if the index is unset. Fixes bug reported by Geir Hauge
+ <geir.hauge@gmail.com>
+
+builtins/common.c
+ - get_exitstat: update fix of 3/11 to allow the DEBUG trap to use the
+ current value of $? instead of the value it had before the trap
+ action was run. This is one reason the DEBUG trap exists, and
+ extended debug mode uses it. Might want to do this only in Posix
+ mode
+
+doc/{bash.1,bashref.texi}
+ - return: add language cribbed from Posix saying what happens when
+ return is run without an argument from a trap, including the DEBUG
+ trap exception
+
+ 3/19
+ ----
+lib/glob/gmisc.c
+ - extglob_pattern_p: make sure ?(patlist) is flagged as an extglob
+ pattern
+
+lib/glob/glob.c
+ - extglob_skipname: rewrite to handle patterns that begin but do not
+ end with an extglob pattern; change test for easy case and loop
+ through patterns accordingly. Fixes problem with matching filenames
+ with a leading dot reported by Stephane Chazelas
+ <stephane.chazelas@gmail.com>
+ - wextglob_skipname: make analogous changes
+
+ 3/20
+ ----
+Makefile.in
+ - pass -DDEBUG down to builds in readline and history directories
+
+lib/readline/util.c
+ - _rl_trace and related functions are now only compiled in if DEBUG
+ is defined
+
+lib/readline/Makefile.in
+ - substitute @DEBUG@ and pass -DDEBUG, if necessary, to compilation
+ in LOCAL_CFLAGS
+
+ 3/21
+ ----
+parse.y
+ - shell_getc: when checking whether or not to reallocate
+ shell_input_line to add trailing newline, don't try to subtract from
+ shell_input_line_size. size_t is unsigned, so if its value is less
+ than 3 (like, say, 2), size-3 is a very large number and the string
+ will not be reallocated. Use len+3 > size instead of len > size-3.
+ Fixes bug reported in
+ https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1295467
+
+ 3/27
+ ----
+lib/readline/display.c
+ - _rl_clean_up_for_exit: don't bother to call _rl_move_vert to whatever
+ readline thinks the last displayed line is if it's 0. Two reasons: a
+ minor optimization, and it protects against unwanted moving if this
+ function is called twice, as it is when ^C is pressed. Fixes bug
+ reported by Egmont Koblinger <egmont@gmail.com>
+
+ 3/28
+ ----
+bashline.c
+ - invalid_completion: new function, used to identify attempts to
+ complete words that are syntax errors
+ - attempt_shell_completion: if invalid_completion returns true for a
+ word in a command position, punt on all completions. Fixes cosmetic
+ issue reported by Uwe Storbeck <uwe@ibr.ch>
+ - attempt_shell_completion: add clause so that in_command_position
+ remains set to 1 for an empty word following a command separator like
+ (, &, or |
+
+lib/readline/kill.c
+ - rl_yank, rl_yank_nth_arg_internal: don't return -1 from bindable
+ functions, return 1 instead
+
+lib/readline/text.c
+ - rl_rubout, _rl_rubout_char, rl_delete, rl_change_case,
+ rl_transpose_chars, rl_transpose_words, _rl_set_mark_at_pos,
+ rl_exchange_point_and_mark, _rl_insert_next, _rl_char_search,
+ _rl_char_search_internal:
+ don't return -1 from bindable functions, return 1 instead
+
+lib/readline/vi_mode.c
+ - rl_vi_end_word, rl_vi_rubout, rl_vi_delete, rl_vi_char_search,
+ rl_vi_match, _rl_vi_set_mark, _rl_vi_goto_mark:
+ don't return -1 from bindable functions, return 1 instead
+
+lib/readline/macro.c
+ - rl_start_kbd_macro, rl_end_kbd_macro:
+ don't return -1 from bindable functions, return 1 instead
+
+builtins/setattr.def
+ - set_var_attribute: honor setting of no_invisible_vars when setting
+ att_invisible on a variable
+ - include "../flags.h" for no_invisible_vars
+
+builtins/declare.def
+ - declare_internal: honor setting of no_invisible_vars when setting
+ att_invisible on a variable
+ - include "../flags.h" for no_invisible_vars
+
+Makefile.in,builtins/Makefile.in
+ - make sure declare.o and setattr.o depend on flags.h
+
+execute_cmd.c
+ - decpoint: new function, returns locale's decimal point or `.' default
+ - mkfmt: use decpoint() to get decimal point instead of unconditionally
+ using `.'. Fixes bug reported by Andrey Tataranovich
+ <tataranovich@gmail.com> in debian bug 741669
+
+ 4/10
+ ----
+lib/readline/rltypedefs.h
+ - add back old Function/VFunction/etc typedefs, since other packages
+ (python, samba) use them. Mark as deprecated using gcc and clang
+ attributes. Report and fix from Max Horn <max@quendi.de>
+
+ 4/14
+ ----
+jobs.c
+ - run_sigchld_trap: unwind-protect value of this_shell_builtin, since
+ it matters in some cases whether or not we are running `wait' or
+ `eval'. Fixes bug reported by Eduardo A. Bustamante López
+ <dualbus@gmail.com>
+
+ 4/18
+ ----
+shell.h
+ - sh_parser_state_t: add `need_here_doc' flags member, since
+ xparse_dolparen (via parse_command) sets it to 0
+
+parse.y
+ - gather_here_documents: make sure need_here_doc is > 0, since we
+ don't want to just decrement it forever if it ends up < 0. Partial
+ fix for bug reported by Jared Yanovich <slovichon@gmail.com>
+ - {save,restore}_parser_state: save and restore need_here_doc flag.
+ Rest of fix for bug reported by Jared Yanovich <slovichon@gmail.com>
+
+ 4/19
+ ----
+subst.c
+ - cond_expand_word: since we are not supposed to be performing word
+ splitting here, set expand_no_split_dollar_star to 1 in addition to
+ setting W_NOSPLIT2
+ - expand_word_internal: if we have a case where we have an unquoted
+ $@ but we are in a case where we don't want to split (W_NOSPLIT2),
+ make sure we return a list consisting of a single word with the
+ arguments separated by spaces and don't do word splitting. Fixes
+ bug reported by Greg Wooledge <wooledg@eeg.ccf.org> from an IRC
+ discussion
+
+builtins/hash.def
+ - print_portable_hash_info: single-quote pathnames and hashed filenames
+ that contain shell metacharacters. Fixes bug reported by
+ <g1pi@libero.it> in debian bash bug #739853
+
+ 4/20
+ ----
+lib/readline/display.c
+ - When using horizontal scrolling, the redisplay code erases too much
+ of the line containing successful results, so make sure we only
+ erase to the end of the line after making sure we move the cursor
+ to the end. Fixes bug reported by <Trond.Endrestol@ximalas.info>
+
+ 4/23
+ ----
+{bashhist,bashline}.c
+builtins{bind,help,type}.def
+lib/glob/glob.c, lib/intl/{loadmsgcat,localealias}.c,lib/sh/mktime.c
+ - fixes to memory leaks uncovered by coverity scan
+
+ 4/24
+ ----
+{bashhist,subst,redir,assoc,jobs,array,trap}.c
+lib/intl/l10flist.c
+builtins/complete.def
+ - fixes to memory leaks and other resource usage problems uncovered by
+ coverity scan
+
+redir.c
+ - do_redirection_internal: if dup2 fails (presumably because of a
+ resource limit), close the file descriptor we opened before returning
+ error
+
+ 4/25
+ ----
+config-top.h
+ - DEFAULT_BASHRC: new define with the name of the default shell
+ startup file
+
+bashline.c
+ - bash_directory_completion_matches: don't dequote the directory name.
+ If rl_completion_found_quote is non-zero, readline will dequote the
+ filename itself. Fixes bug reported by Clark Wang
+ <dearvoid@gmail.com>
+
+ 4/27
+ ----
+subst.c
+ - parameter_brace_expand_rhs: if parameter_brace_find_indir returns
+ NULL or "", or if it returns something that is not a valid identifier,
+ report an error and return &expand_wdesc_error so the error can
+ propagate up. Fixes bug reported by Andre Holzhey
+ <andre.holzhey@gmx.de>
+
+ 4/29
+ ----
+subst.c
+ - parameter_brace_substring: don't short-circuit right away if the
+ value is NULL but we are looking at the positional parameters. Part
+ of fix for bug reported by Pierre Gaston <pierre.gaston@gmail.com>
+ - pos_params: if there are no positional parameters, only short-circuit
+ if we are looking for $1 and above. Rest of fix for bug reported
+ by Pierre Gaston <pierre.gaston@gmail.com>
+
+subst.h
+ - SD_NOPROCSUB: new flag for skip_to_delim, means to not allow any
+ process subsitutions (should not have overloaded SD_NOSKIPCMD)
+
+subst.c
+ - skip_to_delim: honor SD_NOPROCSUB flag
+
+make_cmd.c
+ - make_arith_for_expr: set W_NOPROCSUB flag in the created word
+ - make_arith_for_command: set SD_NOPROCSUB in the flags argument to
+ skip_to_delim so we don't treat <( or >( as a process substitution
+ (we won't evaluate them in eval_arith_for_expr anyway). Fixes
+ bug reported by Pierre Gaston <pierre.gaston@gmail.com>
+
+ 5/1
+ ---
+lib/glob/gmisc.c
+ - glob_dirscan: new function, takes a pattern and a directory separator
+ argument and advances the pattern to the last occurrence of the
+ separator. Like strrchr, but understands extended glob patterns and
+ uses glob_patscan to skip over them
+
+lib/glob/glob.c
+ - extglob_skipname: if the extended globbing pattern is invalid, don't
+ skip the name
+ - glob_filename: if there is a slash in the pattern to be matched, and
+ extglob is enabled, use glob_dirscan to find the real last occurrence
+ of `/' to avoid being confused by slashes in extglob patterns. Fix
+ for bug reported by Pierre Gaston <pierre.gaston@gmail.com>
+
+ 5/6
+ ---
+variables.c
+ - make_local_variable: only set the att_invisible attribute if
+ no_invisible_vars isn't set
+ - find_variable_for_assignment: new function, intended to be called by
+ code that eventually wants to assign a value to the variable; will not
+ skip invisible variables; currently identical to find_variable
+ - find_variable_no_invisible: new function, finds the first visible
+ instance of variable with a given name in the variable context chain;
+ eventually will be used to replace find_variable; separate right now
+ for testing
+
+variables.h
+ - find_variable_for_assignment: extern declaration
+ - find_variable_no_invisible: extern declaration
+
+ 5/7
+ ---
+variables.c
+ - make_local_variable: don't clear `invisible' attribute if we are
+ returning an existing local variable at the right context. Let the
+ upper layers do that. Fixes bug reported by Dan Douglas
+ <ormaaj@gmail.com>
+
+ 5/8
+ ---
+lib/readline/input.c
+ - rl_getc: call RL_CHECK_SIGNALS if a read(2) is interrupted (-1/EINTR)
+ by SIGALRM or SIGVTALRM (placeholder for non-keyboard-generated
+ signals of interest)
+
+builtins/read.def
+ - edit_line: call bashline_set_event_hook and
+ bashline_reset_event_hook around call to readline(), so the right
+ signal handling happens
+ - read_builtin: make sure we add an unwind_protect call to
+ bashline_reset_event_hook. These changes fix bug reported in
+ https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1317476
+
+bashline.c
+ - bash_event_hook: make sure we clean up the readline state by calling
+ rl_cleanup_after_signal if sigalrm_seen is non-zero. The read builtin
+ sets this when it times out
+
+ 5/12
+ ----
+doc/{bash.1,bashref.texi}
+ - clarify language to make it clear that changing attributes of a
+ nameref variable (e.g., export), actually changes the attributes of
+ the referenced variable. Fixes omission noted by Jeff Haemer
+ <jeffrey.haemer@gmail.com>
+
+arrayfunc.c
+ - bind_array_var_internal: make sure ENTRY no longer has invisible
+ attribute before returning. Fixes bug reported by Geir Hauge
+ <geir.hauge@gmail.com>
+
+ 5/22
+ ----
+execute_cmd.c
+ - shell_execve: if execve fails and we return 127 or 126, make sure to
+ set last_command_exit_value if a call to file_error or report_error
+ causes the shell to exit. This ensures that the shell exits with
+ the right value.
+
+ 6/6
+ ---
+shell.c
+ - drop_priv_mode: print an error message on setuid() failure, optionally
+ exit if errno == EAGAIN, as it can be on Linux when RLIMIT_NPROC for
+ the target user is exceeded.
+
+config-top.h
+ - EXIT_ON_SETUID_FAILURE: new settable define, will cause the shell to
+ exit if setuid fails with errno == EAGAIN
+
+ 6/10
+ ----
+parse.y
+ - time_command_acceptable: fix so time is accepted everywhere the
+ grammar is looking for a `compound_list'. Fixes bug reported by
+ Dale Worley <worley@alum.mit.edu>
+
+ 6/12
+ ----
+subst.c
+ - clear_fifo_list: new function, clears FDs associated with open pipes
+ in current FIFO list without closing the file descriptors. Can
+ possibly be used when shell_execve fails and the shell jumps back
+ to top_level and we don't want the shell to close the open FIFOs
+ each time through the read-execute loop. Bug reported by Harald
+ Koenig <koenig@tat.physik.uni-tuebingen.de>
+
+
+ 6/16
+ ----
+builtins/shopt.def
+ - compat42: make sure the `compat42' option sets the correct variable
+ for compatibility level. Fixes bug reported by Ondrej Oprala
+ <ooprala@redhat.com>
+
+support/bashbug.sh
+ - fix typo when echoing $USAGE. Report from Shantanu Kulkarni
+ <djbware@shantanukulkarni.org>
+
+execute_cmd.c
+ - shell_execve: before longjmp back to subshell_top_level, clear out the
+ FIFO fd list by calling clear_fifo_list so the FDs (which we inherited
+ from our parent) aren't closed every time through the read-eval loop.
+ Fix for bug reported by Harald Koenig <koenig@tat.physik.uni-tuebingen.de>
+
+ 6/18
+ ----
+subst.c
+ - extract_process_subst: add additional argument: xflags, allow callers to
+ pass flags like extract_command_subst
+ - extract_process_subst: call xparse_dolparen like command substitution
+ to avoid problems when parsing commands constructs with embedded open
+ parens. Fixes bug reported by Tim Friske <me@timfriske.com>
+
+subst.h
+ - extract_process_subst: modified prototype for extern declaration
+
+ 6/19
+ ----
+execute_cmd.c
+ - execute_pipeline: if running with lastpipe enabled, make sure that we
+ check whether or not the job id is valid using INVALID_JOB before
+ calling job_exit_status. the jobs list can get frozen and unfrozen in
+ the presence of nested pipelines and loops and wait_for can clear a
+ job table entry. Fixes bug reported by <scorp.dev.null@gmail.com>
+
+jobs.c
+ - freeze_jobs_list: now returns old value of jobs_list_frozen; unused at
+ current time
+
+jobs.h
+ - freeze_jobs_list: change return value
+
+ 6/20
+ ----
+lib/glob/smatch.c
+ - MEMCHR: single-byte and wide character defines (memchr/wmemchr)
+
+lib/glob/sm_loop.c
+ - GMATCH: when the wildcards are the last element of the pattern, make
+ sure they do not match a string containing a `/' if FNM_PATHNAME is
+ set in FLAGS
+ - GMATCH: when recursively calling GMATCH after we see a `*', don't
+ try to consume the rest of the pattern with `*' if FNM_PATHNAME is
+ set in FLAGS, just consume up to the next slash and then see whether
+ or not the rest of the pattern matches. Fixes bug reported by Ian
+ Kelling <ian@iankelling.org>
+ - GMATCH: when processing `*' in the pattern, after skipping consecutive
+ wildcards, if we hit a literal `/' in the pattern and we're looking
+ for a pathname, skip characters in the string until we find a `/'
+ (no slash means the match fails), and try to match the rest of the
+ pattern against the portion of the string after the next `/'. Picked
+ up from gnulib/glibc
+
+pathexp.c
+ - split_ignorespec: since split_ignorespec gets globbing patterns,
+ make sure we call skip_to_delim with the SD_GLOB flag so delimiters
+ that occur within bracket expressions don't delimit the pattern.
+ Fixes problem with [[:digit:]] in GLOBIGNORE reported by Ian Kelling
+ <ian@iankelling.org>
+
+unwind_prot.c
+ - unwind_protect_tag_on_stack: new function, returns 1 if unwind-protect
+ frame corresponding to `tag' argument is on unwind-protect stack
+
+unwind_prot.h
+ - unwind_protect_tag_on_stack: extern declaration
+
+ 6/30
+ ----
+lib/readline/misc.c
+ - _rl_revert_all_lines: set entry->data to 0 after assigning it to
+ rl_undo_list to avoid pointer aliasing problems that would result
+ in entry->line being freed by an undo. The subsequent free would
+ be a double free. Report and fix from Jared Yanovich
+ <slovichon@gmail.com>
+
+subst.c
+ - command_substitute: other shells do not appear to inherit the -v
+ option when reading and executing command substitutions. Reported
+ by Ondrej Oprala <ooprala@redhat.com>
+
+ 7/1
+ ---
+config-top.h
+ - CHECKHASH_DEFAULT: new define that supplies the default value for
+ check_hashed_filenames (`checkhash' shopt option); still 0 by default
+
+findcmd.c
+ - check_hashed_filenames: initialize using CHECKHASH_DEFAULT
+
+lib/readline/histexpand.c
+ - history_expand: double quotes can inhibit recognition of the history
+ comment character if history_quotes_inhibit_expansion is non-zero
+
+lib/readline/doc/{history.3,hstech.texi}
+ - history_quotes_inhibit_expansion: expand definition to note that it
+ inhibits scanning for the history comment character as well; correct
+ typo to make it clear that it only works on double-quoted strings
+
+lib/sh/zgetline.c
+ - add new fourth argument: DELIM, allows delimiter to be something
+ other than newline (if DELIM != '\n', UNBUFFERED_READ should be
+ non-zero)
+ - UNBUFFERED_READ is now fifth argument
+ - check character against DELIM rather than strictly newline
+
+externs.h
+ - zgetline: change function prototype for extern declaration
+
+builtins/mapfile.def
+ - mapfile: change calling sequence for zgetline calls
+ - mapfile_builtin: new -d option: DELIM, like in read builtin
+ - mapfile_builtin: pass `delim' to mapfile() as new argument; default
+ to '\n' unless -d option supplied
+ - mapfile: take new DELIM argument, pass to zgetline
+ - mapfile: if DELIM != '\n', set unbuffered_read to 1
+
+doc/{bash.1,bashref.texi}
+ - mapfile: document new `-d DELIM' option
+
+ 7/5
+ ---
+lib/readline/histfile.c
+ - history_truncate_file: if there is an error writing the truncated
+ history list back to the history file, use the same strategy as
+ history_do_write: create a backup file, rename the history file to
+ the backup file, and restore the original history file from the
+ backup file name if the write or the close fails. Suggestion from
+ Chen Gang <gang.chen.5i5j@gmail.com> to bug-readline
+
+execute_cmd.c
+ - evalnest, evalnest_max: new variables establishing maximum number of
+ recursive `eval' calls; current max is 4096
+ - execute_builtin: unwind-protect value of evalnest around calls to
+ eval builtin. Suggested by Oliver Morais <oliver.morais@gmail.com>
+ - {initialize_subshell,execute_subshell_builtin_or_function}: reset
+ evalnest to 0 in a subshell
+
+builtins/setattr.def
+ - show_name_attributes: show a variable's attributes even if it's
+ invisible (don't show any value since it has none). This means that
+ declare -p var will display VAR's attributes even when var marked
+ as invisible. Feature request from Peggy Russell
+ <prusselltechgroup@gmail.com>
+ - show_var_attributes: don't print assignment if array or assoc
+ attribute is set but variable marked as invisible
+
+tests/array.right
+ - special note: changed all declare -a output tests because the shell
+ will no longer print out values for invisible array variables. This
+ is a change, but one for correctness:
+
+ declare -a foo='()'
+ and
+ declare -a foo
+ are not equivalent
+
+ 7/22
+ ----
+subst.c
+ - parameter_brace_expand: after calling parameter_brace_expand_indir,
+ turn off the W_ARRAYIND flag in the word it returns, because there
+ is no way for it to return the index that should be used, and the
+ rest of the function assumes that IND is valid if W_ARRAYIND is set.
+ Fixes bug reported by Corentin Peuvrel <cpeuvrel@pom-monitoring.com>
+
+ 8/2
+ ---
+parse.y
+ - read_token_word: if we read a character that will end a command
+ substitution, don't skip over quoted newlines when we read an
+ additional character to figure out whether it's a two-character
+ token. This lets the higher layers deal with quoted newlines after
+ the command substitution. Fixes bug reported by EmanueL Czirai
+ <amanual@riseup.net>
+
+ 8/11
+ ----
+execute_cmd.c
+ - execute_pipeline: check whether lastpipe_jid corresponds to a valid
+ job before calling append_process, for the same reason as fix from
+ 6/19. Fixes bug reported by <lolilolicon@gmail.com>
+
+ 8/12
+ ----
+lib/sh/unicode.c
+ - stub_charset: use strncpy instead of strcpy because we are copying
+ into a local fixed-length buffer. Fixes vulnerability reported by
+ <romerox.adrian@gmail.com>
+
+execute_cmd.c
+ - execute_pipeline: if we don't call append_process, call
+ wait_for_single_pid to get the status of `lastpid', since that will
+ check the status of already-reaped processes. Fixes spurious error
+ message about non-existent process from fix of 8/11
+
+ 8/15
+ ----
+jobs.c
+ - running_in_background: new variable, keeps track of whether or not we
+ are running in the background (not perfect yet)
+ - initialize_job_control: even if we are not turning on job control,
+ get the terminal pgrp so we can use it later
+ - {set_job_control,initialize_job_control}: set running_in_background
+ to 1 if terminal pgrp != shell pgrp
+ - {stop_pipeline,make_child,wait_for}: if we are running in the
+ background, don't mess with the terminal's process group; assume that
+ the parent shell will do that. Fixes bug reprted by Greg Wooledge
+ <wooledg@eeg.ccf.org>
+
+shell.c
+ - shell_reinitialize: reset running_in_background back to 0
+
+ 8/24
+ ----
+execute_cmd.c
+ - {execute_connection,execute_command_internal}: make sure that
+ asynchronous commands always set $? to 0 and are not affected by the
+ command's exit status being inverted using `!'. Fixes bug reported
+ by Vincent Lefevre <vincent@vinc17.net>
+
+lib/readline/display.c
+ - rl_message: call vsnprintf with full msg_bufsiz, since it counts
+ one fewer than the buffer length passed as an argument. Bug report
+ and fix from Dylan Cali <calid1984@gmail.com>
+
+ 8/26
+ ----
+builtins/evalstring.c
+ - evalstring: if CURRENT_TOKEN == yacc_EOF, reset it to newline. This is
+ instead of calling reset_parser(); that might still be needed. Fixes
+ bug with eval and a subsequent statement ending with EOF reported by
+ <jim.avera@gmail.org>
+
+pcomplete.c
+ - filter_stringlist: when extglob is on, a leading ! in the filter
+ pattern should be left alone when it introduces a !(pat) pattern;
+ otherwise it messes up the pattern. Fixes bug reported by David
+ Korn <dgkorn@gmail.com>
+
+ 8/27
+ ----
+doc/{bash.1,bashref.texi}
+ - clarify the behavior of bash when given the -c option, since $0 is
+ technically not a positional parameter. Bug reported by Stephane
+ Chazelas <stephane.chazelas@gmail.com>
+
+ 8/28
+ ----
+lib/readline/history.c
+ - add_history: use history_max_entries (if history is stifled) or
+ DEFAULT_HISTORY_INITIAL_SIZE if not (new define, defaults to 502)
+ to size the initial allocation of the history array. Assumption
+ is that this will reduce the number of allocations
+
+ 8/29
+ ----
+execute_command.c:
+ - sourcenest, sourcenest_max: new variables used to track level of
+ sourced files and (maybe) one day catch infinite source recursion
+ - execute_builtin: if current source level exceeds sourcenest_max,
+ trigger an error and jump back to the top level
+ - {initialize_subshell,execute_subshell_builtin_or_function}: reset
+ sourcenest to 0 in a subshell
+
+ 9/2
+ ---
+variables.c
+ - bind_variable: if a nameref expands to an array reference, make
+ sure that assign_array_element gets called (maybe even
+ recursively) instead of bind_variable_internal, so invalid variable
+ names (like arr[0]) don't get created. Fixes bug reported by
+ <lolilolicon@gmail.com>
+
+ 9/3
+ ---
+execute_cmd.c
+ - evalnest_max,sourcenest_max: initialize from EVALNEST_MAX and
+ SOURCENEST_MAX, respectively. Feature suggested by
+ <bogun.dmitriy@gmail.com>
+
+config-top.h
+ - define EVALNEST_MAX and SOURCENEST_MAX to 0
+
+ 9/6
+ ---
+bashline.c
+ - find_cmd_start: fix to (crudely) deal with >| token; even though
+ skip_to_delim finds `|' as a delimiter, we call it again and use
+ what the second call finds. Fixes bug reported by Dan Jacobson
+ <jidanni@jidanni.org>
+
+findcmd.c
+ - find_in_path_element: if in posix mode, do not expand a literal
+ tilde in a $PATH element
+
+doc/bashref.texi
+ - add change to tilde expansion in $PATH elements to posix mode
+ description
+
+builtins/common.h
+ - ISHELP: new define for builtins that do their own option parsing
+ and don't use internal_getopt(); checks whether argument is --help
+ - CHECK_HELPOPT: convenience define to help builtins that do their
+ own option parsing to check for --help with one line of code
+ - CASE_HELPOPT: convenience define to help builtins that use
+ internal_getopt() check for --help with one line of code
+
+builtins/help.def
+ - builtin_help: new function, prints out --help output for current
+ builtin
+
+builtins/{kill,let,pushd}.def
+ - add CHECK_HELPOPT to builtins that use ISOPTION; call builtin_help
+ and return EX_USAGE (kill/let/pushd/popd/dirs)
+
+builtins/{caller,fg_bg}.def
+ - use CHECK_HELPOPT to recognize --help, since these builtins perform
+ checks that can cause them to return before calling no_options
+ (caller/fg/bg)
+
+builtins/{exit,return}.def
+ - use CHECK_HELPOPT to recognize --help before calling get_exitstat()
+ (return/exit/logout)
+
+builtins/{break,shift}.def
+ - use CHECK_HELPOPT to recognize --help before any other checks
+ (break/continue/shift)
+
+builtins/bashgetopt.h
+ - GETOPT_EOF: convenience define
+ - GETOPT_HELP: new define, to indicate internal_getopt saw --help
+
+builtins/bashgetopt.c
+ - internal_getopt: return GETOPT_HELP for --help
+
+builtins/common.c
+ - no_options: recognize --help, call builtin_help and return 2
+ (builtin/eval/source/./times)
+
+builtins/command.def
+ - use CASE_HELPOPT() to handle --help after calling internal_getopt()
+ (command)
+
+builtins/{colon,echo,test}.def
+ - do not recognize --help (:/true/false/echo/test)
+
+ 9/8
+ ---
+sig.c
+ - termsig_sighandler: if readline is active now, set the bashline event
+ hook. Old code just set it for interactive shells. Part of fix for
+ bug reported by <mickael9@gmail.com>
+
+bashline.c
+ - bash_event_hook: call rl_cleanup_after_signal if terminating_signal
+ is non-zero, since check_signals_and_traps() will cause the shell to
+ exit if it is and we want to clean up the readline state first. Rest
+ of fix for bug reported by <mickael9@gmail.com>
+
+ 9/9
+ ---
+jobs.c
+ - waitchld: when running the wait builtin in posix mode, with a trap set
+ on SIGCHLD, use queue_sigchld_trap instead of trap_handler (SIGCHLD),
+ otherwise you will lose SIGCHLDs when children_exited > 1. Fixes bug
+ reported by <crispusfairbairn@gmail.com>
+
+builtins/read.def
+ - read_builtin: if we are changing the tty settings, call
+ initialize_terminating_signals so we have a chance to catch all
+ terminating signals and potentially clean up the terminal before
+ exiting
+ - read_builtin: tty_modified: new variable, set to 1 if we change the
+ terminal attributes and have to call ttyrestore() to restore them
+ - if one of the `reads' returns -1/EINTR due to a terminating signal,
+ and we have modified the terminal, call ttyrestore before calling
+ CHECK_TERMSIG
+ - ttyrestore: set tty_modified to 0 when called
+
+ 9/10
+ ----
+builtins/read.def
+ - termsave: now global to file so other functions can use it
+ - read_tty_cleanup: if tty_modified is non-zero, call ttycleanup to restore
+ old terminal settings and turn off tty_modified
+
+sig.c
+ - termsig_handler: call read_tty_cleanup if currently executing read
+ builtin; it does the right thing. Final piece of fix for bug reported
+ by Jan Rome <jan.rome@gmail.com>
+
+ 9/11
+ ----
+general.c
+ - printable_filename: general function to return a printable representation
+ of a string (presumed to be a filename)
+
+general.h
+ - extern declaration for printable_filename
+
+execute_cmd.c
+ - execute_disk_command: use printable_filename
+
+builtins/{bind,cd,enable,hash,source}.def
+ - use printable_filename as appropriate when printing error messages.
+ From a suggestion by Vincent Lefevre <vincent@vinc17.net>
+
+builtins/bind.def
+ - use CASE_HELPOPT() to handle --help after calling internal_getopt()
+ (bind)
+
+ 9/12
+ ----
+builtins/common.h
+ - SEVAL_FUNCDEF: new flag for parse_and_execute; it means that we only
+ accept a single function definition command, as when we are importing
+ functions from the environment
+ - SEVAL_ONECMD: new flag for parse_and_execute; for future use
+
+builtins/evalstring.c
+ - parse_and_execute: if the SEVAL_FUNCDEF flag is set, disallow anything
+ but a function definition command
+
+variables.c
+ - initialize_shell_variables: don't allow functions with invalid names
+ to be imported from the environment, even though we still allow them
+ to be defined
+ - initialize_shell_variables: when importing function definitions from
+ the environment, call parse_and_execute with the SEVAL_FUNCDEF flag
+ to force the command to be just a function definition
+
+subst.c
+ - param_expand: when expanding a $name variable expansion, make sure that
+ the variable is visible and set before following the nameref chain
+ - param_expand: when expanding a $name variable expansion and following the
+ nameref chain, make sure the resulting variable is visible and set
+ before using it
+
+ 9/13
+ ----
+variables.c
+ - initialize_shell_variables: when importing function definitions from
+ environment, use SEVAL_ONECMD flag for parse_and_execute. Part of
+ CVE-2014-6271
+
+builtins/evalstring.c
+ - parse_and_execute: if SEVAL_ONECMD flag set, return immediately after
+ calling execute_command_internal. Final piece for fix for bug
+ reported by Stephane Chazelas <stephane.chazelas@gmail.com>. Part of
+ CVE-2014-6271
+
+ 9/24
+ ----
+parse.y
+ - reset_parser: reset eol_ungetc_lookahead to 0 here, since we don't want
+ shell_getc returning it on the next call. Fixes problem reported by
+ Tavis Ormandy <taviso@cmpxchg8b.com> and Michal Zalewski
+ <lcamtuf@coredump.cx>. Potentially part of CVE-2014-6271; fix for
+ CVE-2014-7169
+
+ 9/25
+ ----
+parse.y
+ - push_heredoc: new function, pushes a here-doc redirection onto
+ redir_stack handling overflow of redir_stack. Exits on overflow.
+ Original fix from Florian Weimer <fweimer@redhat.com>. Fix for
+ CVE-2014-7186
+ - change straight assignments to redir_stack to call push_redir
+ - add one to size of word_lineno stack to avoid off-by-one error
+ below in read_token_word. Overflow just results in line numbers
+ being wrong. Fix for CVE-2014-7187
+
+ 9/27
+ ----
+{execute_cmd,trap}.c
+ - changes to make minimal-config builds work again, mostly missing
+ #ifdefs for optional features
+
+builtins/common.c
+ - builtin_help: dummy version to be included if HELP_BUILTIN not
+ defined, for minimal-config builds
+
+variables.c
+ - initialize_shell_variables: incorporated patches from Florian
+ Weimer <fweimer@redhat.com> to change the strings bash looks
+ for when importing shell functions from the environment. It
+ adds a prefix (BASH_FUNC_) and a suffix (%%) to the name to
+ mark it as having been created by bash as an exported function.
+ Fix for remote attacks part of CVE-2014-6271 and CVE-2014-7169
+ - mk_env_string: takes new argument, indicating whether we are
+ constructing a function
+ - mk_env_string: encodes function names as described above, so
+ initialize_shell_variables can find them
+
+ 9/28
+ ----
+copy_cmd.c
+ - copy_redirects: before calling savestring on here_doc_eof, make
+ sure it's not NULL (it could have been the result of a here
+ document delimited by EOF or EOS). Fixes bug reported by
+ Michal Zalewski <lcamtuf@coredump.cx>. Fix for CVE-2014-6277
+
+make_cmd.c
+ - make_redirection: initialize here_doc_eof member to NULL. Rest of
+ fix for CVE-2014-6277
+
+ 9/29
+ ----
+parse.y
+ - current_input_line_state: return a sh_input_line_state_t containing
+ the current shell_input_line and its index and size variables
+
+shell.h
+ - current_input_line_state: extern declaration
+
+builtins/evalstring.c
+ - parse_and_execute: call reset_parser() before returning if
+ SEVAL_ONECMD set. Fixes bug reported by Michal Zalewski
+ <lcamtuf@coredump.cx> and designated CVE-2014-6278
+ - parse_and_execute: if we parse a function definition when
+ SEVAL_FUNCDEF is set, but don't consume the entire passed string,
+ throw an error, reset the parser, and return. Part of fix for
+ CVE-2014-6278
+ - parse_and_execute: if parsing the shell function definition when
+ SEVAL_FUNCDEF is set transforms the function name (e.g., if it
+ begins with a newline or begins or ends with whitespace), throw
+ an error, reset the parser, and return. Fixes bug reported by
+ Eric Kobrin <ekobrin@akamai.com>
+
+ 10/2
+ ----
+jobs.c
+ - bgp_prune: don't do anything if bgpids.npid == 0 or bgpids.list == NULL.
+ This can happen if something gets run before the job control framework
+ is initialized. Bug report from <mancha1@zoho.com>
+
+ 10/3
+ ----
+parse.y
+ - xparse_dolparen: don't set token_to_read to newline after calling
+ parse_string() and cleaning up when the shell is not interactive. This
+ makes the parser thing it's ok to read new commands even if it's not in
+ a state where that should be possible. Underlying fix for bug reported
+ by Michal Zalewski <lcamtuf@coredump.cx> and designated CVE-6278
+ - parser_remaining_input: new function, returns the portion of
+ shell_input_line that hasn't yet been read
+ - current_input_line_state: removed
+
+shell.h
+ - parser_remaining_input: extern declaration
+ - current_input_line_state: removed
+
+builtins/evalstring.c
+ - parse_and_execute: change code that checks whether parse_command has
+ consumed the entire passed string when SEVAL_FUNCDEF is used to use
+ parser_remaining_input instead of messing around with (new)
+ current_input_line_state. Part of fix for CVE-2014-6278
+
+variables.c
+ - initialize_shell_variables: if we don't call parse_and_execute, free the
+ temporary string, since parse_and_execute won't. Report and fix from
+ Eric Kobrin <ekobrin@akamai.com>
+
+ 10/4
+ ----
+print_cmd.c
+ - print_function_def: when in posix mode, print shell function
+ definitions as posix specifies them, without the leading
+ `function' keyword
+
+general.c
+ - exportable_function_name: return 1 if the passed string can be
+ added to the environment as an exported function name. Currently
+ prohibits function names containing `/' and `=' from being
+ exported
+
+general.h
+ - exportable_function_name: extern declaration
+
+builtins/setattr.def
+ - set_or_show_attributes: if exporting a function with export -f,
+ call exportable_function_name to determine whether the function
+ should be exported; don't export function if it returns 0
+
+ 10/7
+ ----
+builtins/setattr.def
+ - set_or_show_attributes: don't show identifiers that are invisible
+ and imported from the environment, since that combination of
+ attributes means that the imported variable is not a valid shell
+ identifier. Report from Stephane Chazelas <stephane.chazelas@gmail.com>
+
+ 10/8
+ ----
+shell.c
+ - shell_initialize: set new variable should_be_restricted, which
+ says whether or not the shell will be a restricted one based on the
+ shell name; use in calls to initialize_shell_variables (to inhibit
+ importing shell functions) and initialize_shell_options (to inhibit
+ parsing $SHELLOPTS) and initialize_bashopts (to inhibit parsing
+ $BASHOPTS). Report from <paulfm@umn.edu>
--- /dev/null
+Starting bash with the `--posix' command-line option or executing
+`set -o posix' while bash is running will cause bash to conform more
+closely to the Posix.2 standard by changing the behavior to match that
+specified by Posix.2 in areas where the bash default differs.
+
+The following list is what's changed when `posix mode' is in effect:
+
+1. When a command in the hash table no longer exists, bash will re-search
+ $PATH to find the new location. This is also available with
+ `shopt -s checkhash'.
+
+2. The >& redirection does not redirect stdout and stderr.
+
+3. The message printed by the job control code and builtins when a job
+ exits with a non-zero status is `Done(status)'.
+
+4. Reserved words may not be aliased.
+
+5. The Posix.2 PS1 and PS2 expansions of `!' -> history number and
+ `!!' -> `!' are enabled, and parameter expansion is performed on
+ the value regardless of the setting of the `promptvars' option.
+
+6. Interactive comments are enabled by default. (Note that bash has
+ them on by default anyway.)
+
+7. The Posix.2 startup files are executed ($ENV) rather than the normal
+ bash files.
+
+8. Tilde expansion is only performed on assignments preceding a command
+ name, rather than on all assignment statements on the line.
+
+9. The default history file is ~/.sh_history (default value of $HISTFILE).
+
+10. The output of `kill -l' prints all the signal names on a single line,
+ separated by spaces.
+
+11. Non-interactive shells exit if `file' in `. file' is not found.
+
+12. Redirection operators do not perform pathname expansion on the word
+ in the redirection unless the shell is interactive
+
+13. Function names must be valid shell identifiers. That is, they may not
+ contain characters other than letters, digits, and underscores, and
+ may not start with a digit. Declaring a function with an illegal name
+ causes a fatal syntax error in non-interactive shells.
+
+14. Posix.2 `special' builtins are found before shell functions during command
+ lookup.
+
+15. If a Posix.2 special builtin returns an error status, a non-interactive
+ shell exits. The fatal errors are those listed in the POSIX.2 standard,
+ and include things like passing incorrect options, redirection errors,
+ variable assignment errors for assignments preceding the command name,
+ and so on.
+
+16. The environment passed to executed commands is not sorted. Neither is
+ the output of `set'. This is not strictly Posix.2 behavior, but sh
+ does it this way. Ksh does not. It's not necessary to sort the
+ environment; no program should rely on it being sorted.
+
+17. If the `cd' builtin finds a directory to change to using $CDPATH, the
+ value it assigns to $PWD does not contain any symbolic links, as if
+ `cd -P' had been executed.
+
+18. A non-interactive shell exits with an error status if a variable
+ assignment error occurs when no command name follows the assignment
+ statements. A variable assignment error occurs, for example, when
+ trying to assign a value to a read-only variable.
+
+19. A non-interactive shell exits with an error status if the iteration
+ variable in a for statement or the selection variable in a select
+ statement is a read-only variable.
+
+20. Process substitution is not available.
+
+21. Assignment statements preceding POSIX.2 `special' builtins persist in
+ the shell environment after the builtin completes.
+
+There is other Posix.2 behavior that bash does not implement. Specifically:
+
+1. Assignment statements affect the execution environment of all builtins,
+ not just special ones.
--- /dev/null
+This file is set.def, from which is created set.c.
+It implements the "set" and "unset" builtins in Bash.
+
+Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+
+This file is part of GNU Bash, the Bourne Again SHell.
+
+Bash is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with Bash; see the file COPYING. If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$PRODUCES set.c
+
+#include <stdio.h>
+#include "../shell.h"
+#include "../flags.h"
+
+#include "bashgetopt.h"
+
+extern int interactive;
+extern int noclobber, posixly_correct;
+#if defined (READLINE)
+extern int rl_editing_mode, no_line_editing;
+#endif /* READLINE */
+
+$BUILTIN set
+$FUNCTION set_builtin
+$SHORT_DOC set [--abefhkmnptuvxldBCHP] [-o option] [arg ...]
+ -a Mark variables which are modified or created for export.
+ -b Notify of job termination immediately.
+ -e Exit immediately if a command exits with a non-zero status.
+ -f Disable file name generation (globbing).
+ -h Locate and remember function commands as functions are
+ defined. Function commands are normally looked up when
+ the function is executed.
+ -i Force the shell to be an "interactive" one. Interactive shells
+ always read `~/.bashrc' on startup.
+ -k All keyword arguments are placed in the environment for a
+ command, not just those that precede the command name.
+ -m Job control is enabled.
+ -n Read commands but do not execute them.
+ -o option-name
+ Set the variable corresponding to option-name:
+ allexport same as -a
+ braceexpand same as -B
+#if defined (READLINE)
+ emacs use an emacs-style line editing interface
+#endif /* READLINE */
+ errexit same as -e
+ histexpand same as -H
+ ignoreeof the shell will not exit upon reading EOF
+ interactive-comments
+ allow comments to appear in interactive commands
+ monitor same as -m
+ noclobber disallow redirection to existing files
+ noexec same as -n
+ noglob same as -f
+ nohash same as -d
+ notify save as -b
+ nounset same as -u
+ physical same as -P
+ posix change the behavior of bash where the default
+ operation differs from the 1003.2 standard to
+ match the standard
+ privileged same as -p
+ verbose same as -v
+#if defined (READLINE)
+ vi use a vi-style line editing interface
+#endif /* READLINE */
+ xtrace same as -x
+ -p Turned on whenever the real and effective user ids do not match.
+ Disables processing of the $ENV file and importing of shell
+ functions. Turning this option off causes the effective uid and
+ gid to be set to the real uid and gid.
+ -t Exit after reading and executing one command.
+ -u Treat unset variables as an error when substituting.
+ -v Print shell input lines as they are read.
+ -x Print commands and their arguments as they are executed.
+ -l Save and restore the binding of the NAME in a FOR command.
+ -d Disable the hashing of commands that are looked up for execution.
+ Normally, commands are remembered in a hash table, and once
+ found, do not have to be looked up again.
+#if defined (BRACE_EXPANSION)
+ -B the shell will perform brace expansion
+#endif /* BRACE_EXPANSION */
+#if defined (BANG_HISTORY)
+ -H Enable ! style history substitution. This flag is on
+ by default.
+#endif /* BANG_HISTORY */
+ -C If set, disallow existing regular files to be overwritten
+ by redirection of output.
+ -P If set, do not follow symbolic links when executing commands
+ such as cd which change the current directory.
+
+Using + rather than - causes these flags to be turned off. The
+flags can also be used upon invocation of the shell. The current
+set of flags may be found in $-. The remaining n ARGs are positional
+parameters and are assigned, in order, to $1, $2, .. $n. If no
+ARGs are given, all shell variables are printed.
+$END
+
+/* An a-list used to match long options for set -o to the corresponding
+ option letter. */
+struct {
+ char *name;
+ int letter;
+} o_options[] = {
+ { "allexport", 'a' },
+#if defined (BRACE_EXPANSION)
+ { "braceexpand",'B' },
+#endif
+ { "errexit", 'e' },
+ { "histexpand", 'H' },
+ { "monitor", 'm' },
+ { "noexec", 'n' },
+ { "noglob", 'f' },
+ { "nohash", 'd' },
+#if defined (JOB_CONTROL)
+ { "notify", 'b' },
+#endif /* JOB_CONTROL */
+ {"nounset", 'u' },
+ {"physical", 'P' },
+ {"privileged", 'p' },
+ {"verbose", 'v' },
+ {"xtrace", 'x' },
+ {(char *)NULL, 0},
+};
+
+#define MINUS_O_FORMAT "%-15s\t%s\n"
+
+void
+list_minus_o_opts ()
+{
+ register int i;
+ char *on = "on", *off = "off";
+
+ printf (MINUS_O_FORMAT, "noclobber", (noclobber == 1) ? on : off);
+
+ if (find_variable ("ignoreeof") || find_variable ("IGNOREEOF"))
+ printf (MINUS_O_FORMAT, "ignoreeof", on);
+ else
+ printf (MINUS_O_FORMAT, "ignoreeof", off);
+
+ printf (MINUS_O_FORMAT, "interactive-comments",
+ interactive_comments ? on : off);
+
+ printf (MINUS_O_FORMAT, "posix", posixly_correct ? on : off);
+
+#if defined (READLINE)
+ if (no_line_editing)
+ {
+ printf (MINUS_O_FORMAT, "emacs", off);
+ printf (MINUS_O_FORMAT, "vi", off);
+ }
+ else
+ {
+ /* Magic. This code `knows' how readline handles rl_editing_mode. */
+ printf (MINUS_O_FORMAT, "emacs", (rl_editing_mode == 1) ? on : off);
+ printf (MINUS_O_FORMAT, "vi", (rl_editing_mode == 0) ? on : off);
+ }
+#endif /* READLINE */
+
+ for (i = 0; o_options[i].name; i++)
+ {
+ int *on_or_off, zero = 0;
+
+ on_or_off = find_flag (o_options[i].letter);
+ if (on_or_off == FLAG_UNKNOWN)
+ on_or_off = &zero;
+ printf (MINUS_O_FORMAT, o_options[i].name, (*on_or_off == 1) ? on : off);
+ }
+}
+
+set_minus_o_option (on_or_off, option_name)
+ int on_or_off;
+ char *option_name;
+{
+ int option_char = -1;
+
+ if (STREQ (option_name, "noclobber"))
+ {
+ if (on_or_off == FLAG_ON)
+ bind_variable ("noclobber", "");
+ else
+ unbind_variable ("noclobber");
+ stupidly_hack_special_variables ("noclobber");
+ }
+ else if (STREQ (option_name, "ignoreeof"))
+ {
+ unbind_variable ("ignoreeof");
+ unbind_variable ("IGNOREEOF");
+ if (on_or_off == FLAG_ON)
+ bind_variable ("IGNOREEOF", "10");
+ stupidly_hack_special_variables ("IGNOREEOF");
+ }
+
+#if defined (READLINE)
+ else if ((STREQ (option_name, "emacs")) || (STREQ (option_name, "vi")))
+ {
+ if (on_or_off == FLAG_ON)
+ {
+ rl_variable_bind ("editing-mode", option_name);
+
+ if (interactive)
+ with_input_from_stdin ();
+ no_line_editing = 0;
+ }
+ else
+ {
+ int isemacs = (rl_editing_mode == 1);
+ if ((isemacs && STREQ (option_name, "emacs")) ||
+ (!isemacs && STREQ (option_name, "vi")))
+ {
+ if (interactive)
+ with_input_from_stream (stdin, "stdin");
+ no_line_editing = 1;
+ }
+ else
+ builtin_error ("not in %s editing mode", option_name);
+ }
+ }
+#endif /* READLINE */
+ else if (STREQ (option_name, "interactive-comments"))
+ interactive_comments = (on_or_off == FLAG_ON);
+ else if (STREQ (option_name, "posix"))
+ {
+ posixly_correct = (on_or_off == FLAG_ON);
+ unbind_variable ("POSIXLY_CORRECT");
+ unbind_variable ("POSIX_PEDANTIC");
+ if (on_or_off == FLAG_ON)
+ {
+ bind_variable ("POSIXLY_CORRECT", "");
+ stupidly_hack_special_variables ("POSIXLY_CORRECT");
+ }
+ }
+ else
+ {
+ register int i;
+ for (i = 0; o_options[i].name; i++)
+ {
+ if (STREQ (option_name, o_options[i].name))
+ {
+ option_char = o_options[i].letter;
+ break;
+ }
+ }
+ if (option_char == -1)
+ {
+ builtin_error ("%s: unknown option name", option_name);
+ return (EXECUTION_FAILURE);
+ }
+ if (change_flag (option_char, on_or_off) == FLAG_ERROR)
+ {
+ bad_option (option_name);
+ return (EXECUTION_FAILURE);
+ }
+ }
+ return (EXECUTION_SUCCESS);
+}
+
+/* Set some flags from the word values in the input list. If LIST is empty,
+ then print out the values of the variables instead. If LIST contains
+ non-flags, then set $1 - $9 to the successive words of LIST. */
+set_builtin (list)
+ WORD_LIST *list;
+{
+ int on_or_off, flag_name, force_assignment = 0;
+
+ if (!list)
+ {
+ SHELL_VAR **vars;
+
+ vars = all_shell_variables ();
+ if (vars)
+ {
+ print_var_list (vars);
+ free (vars);
+ }
+
+ vars = all_shell_functions ();
+ if (vars)
+ {
+ print_var_list (vars);
+ free (vars);
+ }
+
+ return (EXECUTION_SUCCESS);
+ }
+
+ /* Check validity of flag arguments. */
+ if (*list->word->word == '-' || *list->word->word == '+')
+ {
+ register char *arg;
+ WORD_LIST *save_list = list;
+
+ while (list && (arg = list->word->word))
+ {
+ char c;
+
+ if (arg[0] != '-' && arg[0] != '+')
+ break;
+
+ /* `-' or `--' signifies end of flag arguments. */
+ if (arg[0] == '-' &&
+ (!arg[1] || (arg[1] == '-' && !arg[2])))
+ break;
+
+ while (c = *++arg)
+ {
+ if (find_flag (c) == FLAG_UNKNOWN && c != 'o')
+ {
+ char s[2];
+ s[0] = c; s[1] = '\0';
+ bad_option (s);
+ if (c == '?')
+ builtin_usage ();
+ return (c == '?' ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
+ }
+ }
+ list = list->next;
+ }
+ list = save_list;
+ }
+
+ /* Do the set command. While the list consists of words starting with
+ '-' or '+' treat them as flags, otherwise, start assigning them to
+ $1 ... $n. */
+ while (list)
+ {
+ char *string = list->word->word;
+
+ /* If the argument is `--' or `-' then signal the end of the list
+ and remember the remaining arguments. */
+ if (string[0] == '-' && (!string[1] || (string[1] == '-' && !string[2])))
+ {
+ list = list->next;
+
+ /* `set --' unsets the positional parameters. */
+ if (string[1] == '-')
+ force_assignment = 1;
+
+ /* Until told differently, the old shell behaviour of
+ `set - [arg ...]' being equivalent to `set +xv [arg ...]'
+ stands. Posix.2 says the behaviour is marked as obsolescent. */
+ else
+ {
+ change_flag ('x', '+');
+ change_flag ('v', '+');
+ }
+
+ break;
+ }
+
+ if ((on_or_off = *string) &&
+ (on_or_off == '-' || on_or_off == '+'))
+ {
+ int i = 1;
+ while (flag_name = string[i++])
+ {
+ if (flag_name == '?')
+ {
+ builtin_usage ();
+ return (EXECUTION_SUCCESS);
+ }
+ else if (flag_name == 'o') /* -+o option-name */
+ {
+ char *option_name;
+ WORD_LIST *opt;
+
+ opt = list->next;
+
+ if (!opt)
+ {
+ list_minus_o_opts ();
+ continue;
+ }
+
+ option_name = opt->word->word;
+
+ if (!option_name || !*option_name || (*option_name == '-'))
+ {
+ list_minus_o_opts ();
+ continue;
+ }
+ list = list->next; /* Skip over option name. */
+
+ if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
+ return (EXECUTION_FAILURE);
+ }
+ else
+ {
+ if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
+ {
+ char opt[3];
+ opt[0] = on_or_off;
+ opt[1] = flag_name;
+ opt[2] = '\0';
+ bad_option (opt);
+ builtin_usage ();
+ return (EXECUTION_FAILURE);
+ }
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ list = list->next;
+ }
+
+ /* Assigning $1 ... $n */
+ if (list || force_assignment)
+ remember_args (list, 1);
+ return (EXECUTION_SUCCESS);
+}
+
+$BUILTIN unset
+$FUNCTION unset_builtin
+$SHORT_DOC unset [-f] [-v] [name ...]
+For each NAME, remove the corresponding variable or function. Given
+the `-v', unset will only act on variables. Given the `-f' flag,
+unset will only act on functions. With neither flag, unset first
+tries to unset a variable, and if that fails, then tries to unset a
+function. Some variables (such as PATH and IFS) cannot be unset; also
+see readonly.
+$END
+
+#define NEXT_VARIABLE() any_failed++; list = list->next; continue;
+
+unset_builtin (list)
+ WORD_LIST *list;
+{
+ int unset_function, unset_variable, unset_array, opt, any_failed;
+ char *name;
+
+ unset_function = unset_variable = unset_array = any_failed = 0;
+
+ reset_internal_getopt ();
+ while ((opt = internal_getopt (list, "fv")) != -1)
+ {
+ switch (opt)
+ {
+ case 'f':
+ unset_function = 1;
+ break;
+ case 'v':
+ unset_variable = 1;
+ break;
+ default:
+ builtin_usage ();
+ return (EXECUTION_FAILURE);
+ }
+ }
+
+ list = loptend;
+
+ if (unset_function && unset_variable)
+ {
+ builtin_error ("cannot simultaneously unset a function and a variable");
+ return (EXECUTION_FAILURE);
+ }
+
+ while (list)
+ {
+ SHELL_VAR *var;
+ int tem;
+#if defined (ARRAY_VARS)
+ char *t;
+#endif
+
+ name = list->word->word;
+
+#if defined (ARRAY_VARS)
+ if (!unset_function && valid_array_reference (name))
+ {
+ t = strchr (name, '[');
+ *t++ = '\0';
+ unset_array++;
+ }
+#endif
+
+ var = unset_function ? find_function (name) : find_variable (name);
+
+ if (var && !unset_function && non_unsettable_p (var))
+ {
+ builtin_error ("%s: cannot unset", name);
+ NEXT_VARIABLE ();
+ }
+
+ /* Posix.2 says that unsetting readonly variables is an error. */
+ if (var && readonly_p (var))
+ {
+ builtin_error ("%s: cannot unset: readonly %s",
+ name, unset_function ? "function" : "variable");
+ NEXT_VARIABLE ();
+ }
+
+ /* Unless the -f option is supplied, the name refers to a variable. */
+#if defined (ARRAY_VARS)
+ if (var && unset_array)
+ {
+ if (array_p (var) == 0)
+ {
+ builtin_error ("%s: not an array variable", name);
+ NEXT_VARIABLE ();
+ }
+ else
+ tem = unbind_array_element (var, t);
+ }
+ else
+#endif /* ARRAY_VARS */
+ tem = makunbound (name, unset_function ? shell_functions : shell_variables);
+
+ /* This is what Posix.2 draft 11+ says. ``If neither -f nor -v
+ is specified, the name refers to a variable; if a variable by
+ that name does not exist, a function by that name, if any,
+ shall be unset.'' */
+ if ((tem == -1) && !unset_function && !unset_variable)
+ tem = makunbound (name, shell_functions);
+
+ if (tem == -1)
+ any_failed++;
+ else if (!unset_function)
+ stupidly_hack_special_variables (name);
+
+ list = list->next;
+ }
+
+ if (any_failed)
+ return (EXECUTION_FAILURE);
+ else
+ return (EXECUTION_SUCCESS);
+}
--- /dev/null
+/* unwind_prot.h - Macros and functions for hacking unwind protection. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with Bash; see the file COPYING. If not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_UNWIND_PROT_H)
+#define _UNWIND_PROT_H
+
+/* Run a function without interrupts. */
+extern void begin_unwind_frame ();
+extern void discard_unwind_frame ();
+extern void run_unwind_frame ();
+extern void add_unwind_protect ();
+extern void remove_unwind_protect ();
+extern void run_unwind_protects ();
+extern void unwind_protect_var ();
+
+/* Define for people who like their code to look a certain way. */
+#define end_unwind_frame()
+
+/* How to protect an integer. */
+#define unwind_protect_int(X) unwind_protect_var (&(X), (char *)(X), sizeof (int))
+
+/* How to protect a pointer to a string. */
+#define unwind_protect_string(X) \
+ unwind_protect_var ((int *)&(X), (X), sizeof (char *))
+
+/* How to protect any old pointer. */
+#define unwind_protect_pointer(X) unwind_protect_string (X)
+
+/* How to protect the contents of a jmp_buf. */
+#define unwind_protect_jmp_buf(X) \
+ unwind_protect_var ((int *)(X), (char *)(X), sizeof (procenv_t))
+
+#endif /* _UNWIND_PROT_H */
else if (assoc_only && assoc_p (var) == 0)
continue;
#endif
+
+ /* If we imported a variable that's not a valid identifier, don't
+ show it in any lists. */
+ if ((var->attributes & (att_invisible|att_imported)) == (att_invisible|att_imported))
+ continue;
+
if ((var->attributes & attribute))
{
show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
--- /dev/null
+# This file is a shell script that caches the results of configure
+# tests for CYGWIN32 so they don't need to be done when cross-compiling.
+
+# AC_FUNC_GETPGRP should also define GETPGRP_VOID
+ac_cv_func_getpgrp_void=${ac_cv_func_getpgrp_void='yes'}
+# AC_FUNC_SETVBUF_REVERSED should not define anything else
+ac_cv_func_setvbuf_reversed=${ac_cv_func_setvbuf_reversed='no'}
+# on CYGWIN32, system calls do not restart
+ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
+bash_cv_sys_restartable_syscalls=${bash_cv_sys_restartable_syscalls='no'}
+
+# these may be necessary, but they are currently commented out
+#ac_cv_c_bigendian=${ac_cv_c_bigendian='no'}
+ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p='4'}
+ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
+ac_cv_sizeof_long=${ac_cv_sizeof_long='4'}
+ac_cv_sizeof_double=${ac_cv_sizeof_double='8'}
+
+bash_cv_dup2_broken=${bash_cv_dup2_broken='no'}
+bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='no'}
+bash_cv_type_rlimit=${bash_cv_type_rlimit='long'}
+bash_cv_decl_under_sys_siglist=${bash_cv_decl_under_sys_siglist='no'}
+bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist='no'}
+bash_cv_sys_siglist=${bash_cv_sys_siglist='no'}
+bash_cv_opendir_not_robust=${bash_cv_opendir_not_robust='no'}
+bash_cv_getenv_redef=${bash_cv_getenv_redef='yes'}
+bash_cv_printf_declared=${bash_cv_printf_declared='yes'}
+bash_cv_ulimit_maxfds=${bash_cv_ulimit_maxfds='no'}
+bash_cv_getcwd_calls_popen=${bash_cv_getcwd_calls_popen='no'}
+bash_cv_must_reinstall_sighandlers=${bash_cv_must_reinstall_sighandlers='no'}
+bash_cv_job_control_missing=${bash_cv_job_control_missing='present'}
+bash_cv_sys_named_pipes=${bash_cv_sys_named_pipes='missing'}
+bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp='missing'}
+bash_cv_mail_dir=${bash_cv_mail_dir='unknown'}
+bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken='no'}
+
+bash_cv_type_int32_t=${bash_cv_type_int32_t='int'}
+bash_cv_type_u_int32_t=${bash_cv_type_u_int32_t='int'}
+
+ac_cv_type_bits64_t=${ac_cv_type_bits64_t='no'}
+
+# end of cross-build/cygwin32.cache
--- /dev/null
+This is the Bash FAQ, version 3.24, for Bash version 2.05b.
+
+This document contains a set of frequently-asked questions concerning
+Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
+interpreter with advanced features for both interactive use and shell
+programming.
+
+Another good source of basic information about shells is the collection
+of FAQ articles periodically posted to comp.unix.shell.
+
+Questions and comments concerning this document should be sent to
+chet@po.cwru.edu.
+
+This document is available for anonymous FTP with the URL
+
+ftp://ftp.cwru.edu/pub/bash/FAQ
+
+The Bash home page is http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html
+
+----------
+Contents:
+
+Section A: The Basics
+
+A1) What is it?
+A2) What's the latest version?
+A3) Where can I get it?
+A4) On what machines will bash run?
+A5) Will bash run on operating systems other than Unix?
+A6) How can I build bash with gcc?
+A7) How can I make bash my login shell?
+A8) I just changed my login shell to bash, and now I can't FTP into my
+ machine. Why not?
+A9) What's the `POSIX 1003.2 standard'?
+A10) What is the bash `posix mode'?
+
+Section B: The latest version
+
+B1) What's new in version 2.05b?
+B2) Are there any user-visible incompatibilities between bash-2.05b and
+ bash-1.14.7?
+
+Section C: Differences from other Unix shells
+
+C1) How does bash differ from sh, the Bourne shell?
+C2) How does bash differ from the Korn shell, version ksh88?
+C3) Which new features in ksh-93 are not in bash, and which are?
+
+Section D: Why does bash do some things differently than other Unix shells?
+
+D1) Why does bash run a different version of `command' than
+ `which command' says it will?
+D2) Why doesn't bash treat brace expansions exactly like csh?
+D3) Why doesn't bash have csh variable modifiers?
+D4) How can I make my csh aliases work when I convert to bash?
+D5) How can I pipe standard output and standard error from one command to
+ another, like csh does with `|&'?
+D6) Now that I've converted from ksh to bash, are there equivalents to
+ ksh features like autoloaded functions and the `whence' command?
+
+Section E: Why does bash do certain things the way it does?
+
+E1) Why is the bash builtin `test' slightly different from /bin/test?
+E2) Why does bash sometimes say `Broken pipe'?
+E3) When I have terminal escape sequences in my prompt, why does bash
+ wrap lines at the wrong column?
+E4) If I pipe the output of a command into `read variable', why doesn't
+ the output show up in $variable when the read command finishes?
+E5) I have a bunch of shell scripts that use backslash-escaped characters
+ in arguments to `echo'. Bash doesn't interpret these characters. Why
+ not, and how can I make it understand them?
+E6) Why doesn't a while or for loop get suspended when I type ^Z?
+E7) What about empty for loops in Makefiles?
+E8) Why does the arithmetic evaluation code complain about `08'?
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+ with every letter except `z'?
+E10) Why does `cd //' leave $PWD as `//'?
+E11) If I resize my xterm while another program is running, why doesn't bash
+ notice the change?
+
+Section F: Things to watch out for on certain Unix versions
+
+F1) Why can't I use command line editing in my `cmdtool'?
+F2) I built bash on Solaris 2. Why do globbing expansions and filename
+ completion chop off the first few characters of each filename?
+F3) Why does bash dump core after I interrupt username completion or
+ `~user' tilde expansion on a machine running NIS?
+F4) I'm running SVR4.2. Why is the line erased every time I type `@'?
+F5) Why does bash report syntax errors when my C News scripts use a
+ redirection before a subshell command?
+F6) Why can't I use vi-mode editing on Red Hat Linux 6.1?
+F7) Why do bash-2.05a and bash-2.05b fail to compile `printf.def' on
+ HP/UX 11.x?
+
+Section G: How can I get bash to do certain common things?
+
+G1) How can I get bash to read and display eight-bit characters?
+G2) How do I write a function `x' to replace builtin command `x', but
+ still invoke the command from within the function?
+G3) How can I find the value of a shell variable whose name is the value
+ of another shell variable?
+G4) How can I make the bash `time' reserved word print timing output that
+ looks like the output from my system's /usr/bin/time?
+G5) How do I get the current directory into my prompt?
+G6) How can I rename "*.foo" to "*.bar"?
+G7) How can I translate a filename from uppercase to lowercase?
+G8) How can I write a filename expansion (globbing) pattern that will match
+ all files in the current directory except "." and ".."?
+
+Section H: Where do I go from here?
+
+H1) How do I report bugs in bash, and where should I look for fixes and
+ advice?
+H2) What kind of bash documentation is there?
+H3) What's coming in future versions?
+H4) What's on the bash `wish list'?
+H5) When will the next release appear?
+
+----------
+Section A: The Basics
+
+A1) What is it?
+
+Bash is a Unix command interpreter (shell). It is an implementation of
+the Posix 1003.2 shell standard, and resembles the Korn and System V
+shells.
+
+Bash contains a number of enhancements over those shells, both
+for interactive use and shell programming. Features geared
+toward interactive use include command line editing, command
+history, job control, aliases, and prompt expansion. Programming
+features include additional variable expansions, shell
+arithmetic, and a number of variables and options to control
+shell behavior.
+
+Bash was originally written by Brian Fox of the Free Software
+Foundation. The current developer and maintainer is Chet Ramey
+of Case Western Reserve University.
+
+A2) What's the latest version?
+
+The latest version is 2.05b, first made available on Wednesday, 17
+July, 2002.
+
+A3) Where can I get it?
+
+Bash is the GNU project's shell, and so is available from the
+master GNU archive site, ftp.gnu.org, and its mirrors. The
+latest version is also available for FTP from ftp.cwru.edu.
+The following URLs tell how to get version 2.05b:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-2.05b.tar.gz
+
+Formatted versions of the documentation are available with the URLs:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-2.05b.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-doc-2.05b.tar.gz
+
+A4) On what machines will bash run?
+
+Bash has been ported to nearly every version of UNIX. All you
+should have to do to build it on a machine for which a port
+exists is to type `configure' and then `make'. The build process
+will attempt to discover the version of UNIX you have and tailor
+itself accordingly, using a script created by GNU autoconf.
+
+More information appears in the file `INSTALL' in the distribution.
+
+The Bash web page (http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html)
+explains how to obtain binary versions of bash for most of the major
+commercial Unix systems.
+
+A5) Will bash run on operating systems other than Unix?
+
+Configuration specifics for Unix-like systems such as QNX and
+LynxOS are included in the distribution. Bash-2.05 and later
+versions should compile and run on Minix 2.0 (patches were
+contributed), but I don't believe anyone has built bash-2.x on
+earlier Minix versions yet.
+
+Bash has been ported to versions of Windows implementing the Win32
+programming interface. This includes Windows 95 and Windows NT.
+The port was done by Cygnus Solutions as part of their CYGWIN
+project. For more information about the project, look at the URLs
+
+http://www.cygwin.com/
+http://sourceware.cygnus.com/cygwin
+
+Cygnus originally ported bash-1.14.7, and that port was part of their
+early GNU-Win32 (the original name) releases. Cygnus has also done a
+port of bash-2.05 to the CYGWIN environment, and it is available as
+part of their current release.
+
+Bash-2.05b should require no local Cygnus changes to build and run under
+CYGWIN.
+
+The Cygnus port works only on Intel machines. There is a port of bash
+(I don't know which version) to the alpha/NT environment available from
+
+ftp://ftp.gnustep.org//pub/win32/bash-alpha-nt-1.01.tar.gz
+
+DJ Delorie has a port of bash-2.x which runs under MS-DOS, as part
+of the DJGPP project. For more information on the project, see
+
+http://www.delorie.com/djgpp/
+
+I have been told that the original DJGPP port was done by Daisuke Aoyama.
+
+Mark Elbrecht <snowball3@bigfoot.com> has sent me notice that bash-2.04
+is available for DJGPP V2. The files are available as:
+
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204b.zip binary
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204d.zip documentation
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204s.zip source
+
+Mark has begun to work with bash-2.05, but I don't know the status.
+
+Ports of bash-1.12 and bash-2.0 are available for OS/2 from
+
+ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash_112.zip
+ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash-2.0(253).zip
+
+I haven't looked at either, but the second appears to be a binary-only
+distribution. Beware.
+
+I have received word that Bash (I'm not sure which version, but I
+believe that it's at least bash-2.02.1) is the standard shell on
+BeOS.
+
+A6) How can I build bash with gcc?
+
+Bash configures to use gcc by default if it is available. Read the
+file INSTALL in the distribution for more information.
+
+A7) How can I make bash my login shell?
+
+Some machines let you use `chsh' to change your login shell. Other
+systems use `passwd -s' or `passwd -e'. If one of these works for
+you, that's all you need. Note that many systems require the full
+pathname to a shell to appear in /etc/shells before you can make it
+your login shell. For this, you may need the assistance of your
+friendly local system administrator.
+
+If you cannot do this, you can still use bash as your login shell, but
+you need to perform some tricks. The basic idea is to add a command
+to your login shell's startup file to replace your login shell with
+bash.
+
+For example, if your login shell is csh or tcsh, and you have installed
+bash in /usr/gnu/bin/bash, add the following line to ~/.login:
+
+ if ( -f /usr/gnu/bin/bash ) exec /usr/gnu/bin/bash --login
+
+(the `--login' tells bash that it is a login shell).
+
+It's not a good idea to put this command into ~/.cshrc, because every
+csh you run without the `-f' option, even ones started to run csh scripts,
+reads that file. If you must put the command in ~/.cshrc, use something
+like
+
+ if ( $?prompt ) exec /usr/gnu/bin/bash --login
+
+to ensure that bash is exec'd only when the csh is interactive.
+
+If your login shell is sh or ksh, you have to do two things.
+
+First, create an empty file in your home directory named `.bash_profile'.
+The existence of this file will prevent the exec'd bash from trying to
+read ~/.profile, and re-execing itself over and over again. ~/.bash_profile
+is the first file bash tries to read initialization commands from when
+it is invoked as a login shell.
+
+Next, add a line similar to the above to ~/.profile:
+
+ [ -f /usr/gnu/bin/bash ] && [ -x /usr/gnu/bin/bash ] && \
+ exec /usr/gnu/bin/bash --login
+
+This will cause login shells to replace themselves with bash running as
+a login shell. Once you have this working, you can copy your initialization
+code from ~/.profile to ~/.bash_profile.
+
+I have received word that the recipe supplied above is insufficient for
+machines running CDE. CDE has a maze of twisty little startup files, all
+slightly different.
+
+If you cannot change your login shell in the password file to bash, you
+will have to (apparently) live with CDE using the shell in the password
+file to run its startup scripts. If you have changed your shell to bash,
+there is code in the CDE startup files (on Solaris, at least) that attempts
+to do the right thing. It is, however, often broken, and may require that
+you use the $BASH_ENV trick described below.
+
+`dtterm' claims to use $SHELL as the default program to start, so if you
+can change $SHELL in the CDE startup files, you should be able to use bash
+in your terminal windows.
+
+Setting DTSOURCEPROFILE in ~/.dtprofile will cause the `Xsession' program
+to read your login shell's startup files. You may be able to use bash for
+the rest of the CDE programs by setting SHELL to bash in ~/.dtprofile as
+well, but I have not tried this.
+
+You can use the above `exec' recipe to start bash when not logging in with
+CDE by testing the value of the DT variable:
+
+ if [ -n "$DT" ]; then
+ [ -f /usr/gnu/bin/bash ] && exec /usr/gnu/bin/bash --login
+ fi
+
+If CDE starts its shells non-interactively during login, the login shell
+startup files (~/.profile, ~/.bash_profile) will not be sourced at login.
+To get around this problem, append a line similar to the following to your
+~/.dtprofile:
+
+ BASH_ENV=${HOME}/.bash_profile ; export BASH_ENV
+
+and add the following line to the beginning of ~/.bash_profile:
+
+ unset BASH_ENV
+
+A8) I just changed my login shell to bash, and now I can't FTP into my
+ machine. Why not?
+
+You must add the full pathname to bash to the file /etc/shells. As
+noted in the answer to the previous question, many systems require
+this before you can make bash your login shell.
+
+Most versions of ftpd use this file to prohibit `special' users
+such as `uucp' and `news' from using FTP.
+
+A9) What's the `POSIX 1003.2 standard'?
+
+POSIX is a name originally coined by Richard Stallman for a
+family of open system standards based on UNIX. There are a
+number of aspects of UNIX under consideration for
+standardization, from the basic system services at the system
+call and C library level to applications and tools to system
+administration and management. Each area of standardization is
+assigned to a working group in the 1003 series.
+
+The POSIX Shell and Utilities standard has been developed by IEEE
+Working Group 1003.2 (POSIX.2). It concentrates on the command
+interpreter interface and utility programs commonly executed from
+the command line or by other programs. An initial version of the
+standard has been approved and published by the IEEE, and work is
+currently underway to update it.
+
+Bash is concerned with the aspects of the shell's behavior
+defined by POSIX.2. The shell command language has of course
+been standardized, including the basic flow control and program
+execution constructs, I/O redirection and pipelining, argument
+handling, variable expansion, and quoting.
+
+The `special' builtins, which must be implemented as part of the
+shell to provide the desired functionality, are specified as
+being part of the shell; examples of these are `eval' and
+`export'. Other utilities appear in the sections of POSIX.2 not
+devoted to the shell which are commonly (and in some cases must
+be) implemented as builtin commands, such as `read' and `test'.
+POSIX.2 also specifies aspects of the shell's interactive
+behavior as part of the UPE, including job control and command
+line editing. Only vi-style line editing commands have been
+standardized; emacs editing commands were left out due to
+objections.
+
+The Open Group has made an older version of its Single Unix
+Specification (version 2), which is very similar to POSIX.2,
+available on the web at
+
+http://www.opengroup.org/onlinepubs/007908799/
+
+The Single Unix Specification, version 3, is available on the web at
+
+http://www.opengroup.org/onlinepubs/007904975/
+
+A10) What is the bash `posix mode'?
+
+Although bash is an implementation of the POSIX.2 shell
+specification, there are areas where the bash default behavior
+differs from that spec. The bash `posix mode' changes the bash
+behavior in these areas so that it obeys the spec more closely.
+
+Posix mode is entered by starting bash with the --posix or
+'-o posix' option or executing `set -o posix' after bash is running.
+
+The specific aspects of bash which change when posix mode is
+active are listed in the file POSIX in the bash distribution.
+They are also listed in a section in the Bash Reference Manual
+(from which that file is generated).
+
+Section B: The latest version
+
+B1) What's new in version 2.05b?
+
+The raison d'etre for bash-2.05b is to make a second intermediate
+release containing the first of the new features to be available
+in bash-3.0 and get feedback on those features before proceeding.
+The major new feature is multibyte character support in both Bash
+and Readline.
+
+Bash-2.05b contains the following new features (see the manual page for
+complete descriptions and the CHANGES and NEWS files in the bash-2.05b
+distribution):
+
+o support for multibyte characters has been added to both bash and readline
+
+o the DEBUG trap is now run *before* simple commands, ((...)) commands,
+ [[...]] conditional commands, and for ((...)) loops
+
+o the shell now performs arithmetic in the largest integer size the machine
+ supports (intmax_t)
+
+o there is a new \D{...} prompt expansion; passes the `...' to strftime(3)
+ and inserts the result into the expanded prompt
+
+o there is a new `here-string' redirection operator: <<< word
+
+o when displaying variables, function attributes and definitions are shown
+ separately, allowing them to be re-used as input (attempting to re-use
+ the old output would result in syntax errors).
+
+o `read' has a new `-u fd' option to read from a specified file descriptor
+
+o the bash debugger in examples/bashdb has been modified to work with the
+ new DEBUG trap semantics, the command set has been made more gdb-like,
+ and the changes to $LINENO make debugging functions work better
+
+o the expansion of $LINENO inside a shell function is only relative to the
+ function start if the shell is interactive -- if the shell is running a
+ script, $LINENO expands to the line number in the script. This is as
+ POSIX-2001 requires
+
+
+A short feature history dating from Bash-2.0:
+
+Bash-2.05a introduced the following new features:
+
+o The `printf' builtin has undergone major work
+
+o There is a new read-only `shopt' option: login_shell, which is set by
+ login shells and unset otherwise
+
+o New `\A' prompt string escape sequence; expanding to time in 24-hour
+ HH:MM format
+
+o New `-A group/-g' option to complete and compgen; goes group name
+ completion
+
+o New [+-]O invocation option to set and unset `shopt' options at startup
+
+o ksh-like `ERR' trap
+
+o `for' loops now allow empty word lists after the `in' reserved word
+
+o new `hard' and `soft' arguments for the `ulimit' builtin
+
+o Readline can be configured to place the user at the same point on the line
+ when retrieving commands from the history list
+
+o Readline can be configured to skip `hidden' files (filenames with a leading
+ `.' on Unix) when performing completion
+
+Bash-2.05 introduced the following new features:
+
+o This version has once again reverted to using locales and strcoll(3) when
+ processing pattern matching bracket expressions, as POSIX requires.
+o Added a new `--init-file' invocation argument as a synonym for `--rcfile',
+ per the new GNU coding standards.
+o The /dev/tcp and /dev/udp redirections now accept service names as well as
+ port numbers.
+o `complete' and `compgen' now take a `-o value' option, which controls some
+ of the aspects of that compspec. Valid values are:
+
+ default - perform bash default completion if programmable
+ completion produces no matches
+ dirnames - perform directory name completion if programmable
+ completion produces no matches
+ filenames - tell readline that the compspec produces filenames,
+ so it can do things like append slashes to
+ directory names and suppress trailing spaces
+o A new loadable builtin, realpath, which canonicalizes and expands symlinks
+ in pathname arguments.
+o When `set' is called without options, it prints function defintions in a
+ way that allows them to be reused as input. This affects `declare' and
+ `declare -p' as well. This only happens when the shell is not in POSIX
+ mode, since POSIX.2 forbids this behavior.
+
+Bash-2.04 introduced the following new features:
+
+o Programmable word completion with the new `complete' and `compgen' builtins;
+ examples are provided in examples/complete/complete-examples
+o `history' has a new `-d' option to delete a history entry
+o `bind' has a new `-x' option to bind key sequences to shell commands
+o The prompt expansion code has new `\j' and `\l' escape sequences
+o The `no_empty_cmd_completion' shell option, if enabled, inhibits
+ command completion when TAB is typed on an empty line
+o `help' has a new `-s' option to print a usage synopsis
+o New arithmetic operators: var++, var--, ++var, --var, expr1,expr2 (comma)
+o New ksh93-style arithmetic for command:
+ for ((expr1 ; expr2; expr3 )); do list; done
+o `read' has new options: `-t', `-n', `-d', `-s'
+o The redirection code handles several filenames specially: /dev/fd/N,
+ /dev/stdin, /dev/stdout, /dev/stderr
+o The redirection code now recognizes /dev/tcp/HOST/PORT and
+ /dev/udp/HOST/PORT and tries to open a TCP or UDP socket, respectively,
+ to the specified port on the specified host
+o The ${!prefix*} expansion has been implemented
+o A new FUNCNAME variable, which expands to the name of a currently-executing
+ function
+o The GROUPS variable is no longer readonly
+o A new shopt `xpg_echo' variable, to control the behavior of echo with
+ respect to backslash-escape sequences at runtime
+o The NON_INTERACTIVE_LOGIN_SHELLS #define has returned
+
+The version of Readline released with Bash-2.04, Readline-4.1, had several
+new features as well:
+
+o Parentheses matching is always compiled into readline, and controllable
+ with the new `blink-matching-paren' variable
+o The history-search-forward and history-search-backward functions now leave
+ point at the end of the line when the search string is empty, like
+ reverse-search-history, and forward-search-history
+o A new function for applications: rl_on_new_line_with_prompt()
+o New variables for applications: rl_already_prompted, and rl_gnu_readline_p
+
+
+Bash-2.03 had very few new features, in keeping with the convention
+that odd-numbered releases provide mainly bug fixes. A number of new
+features were added to Readline, mostly at the request of the Cygnus
+folks.
+
+A new shopt option, `restricted_shell', so that startup files can test
+ whether or not the shell was started in restricted mode
+Filename generation is now performed on the words between ( and ) in
+ compound array assignments (this is really a bug fix)
+OLDPWD is now auto-exported, as POSIX.2 requires
+ENV and BASH_ENV are read-only variables in a restricted shell
+Bash may now be linked against an already-installed Readline library,
+ as long as the Readline library is version 4 or newer
+All shells begun with the `--login' option will source the login shell
+ startup files, even if the shell is not interactive
+
+There were lots of changes to the version of the Readline library released
+along with Bash-2.03. For a complete list of the changes, read the file
+CHANGES in the Bash-2.03 distribution.
+
+Bash-2.02 contained the following new features:
+
+a new version of malloc (based on the old GNU malloc code in previous
+ bash versions) that is more page-oriented, more conservative
+ with memory usage, does not `orphan' large blocks when they
+ are freed, is usable on 64-bit machines, and has allocation
+ checking turned on unconditionally
+POSIX.2-style globbing character classes ([:alpha:], [:alnum:], etc.)
+POSIX.2-style globbing equivalence classes
+POSIX.2-style globbing collating symbols
+the ksh [[...]] extended conditional command
+the ksh egrep-style extended pattern matching operators
+a new `printf' builtin
+the ksh-like $(<filename) command substitution, which is equivalent to
+ $(cat filename)
+new tilde prefixes that expand to directories from the directory stack
+new `**' arithmetic operator to do exponentiation
+case-insensitive globbing (filename expansion)
+menu completion a la tcsh
+`magic-space' history expansion function like tcsh
+the readline inputrc `language' has a new file inclusion directive ($include)
+
+Bash-2.01 contained only a few new features:
+
+new `GROUPS' builtin array variable containing the user's group list
+new bindable readline commands: history-and-alias-expand-line and
+ alias-expand-line
+
+Bash-2.0 contained extensive changes and new features from bash-1.14.7.
+Here's a short list:
+
+new `time' reserved word to time pipelines, shell builtins, and
+ shell functions
+one-dimensional arrays with a new compound assignment statement,
+ appropriate expansion constructs and modifications to some
+ of the builtins (read, declare, etc.) to use them
+new quoting syntaxes for ANSI-C string expansion and locale-specific
+ string translation
+new expansions to do substring extraction, pattern replacement, and
+ indirect variable expansion
+new builtins: `disown' and `shopt'
+new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK, GLOBIGNORE,
+ MACHTYPE, BASH_VERSINFO
+special handling of many unused or redundant variables removed
+ (e.g., $notify, $glob_dot_filenames, $no_exit_on_failed_exec)
+dynamic loading of new builtin commands; many loadable examples provided
+new prompt expansions: \a, \e, \n, \H, \T, \@, \v, \V
+history and aliases available in shell scripts
+new readline variables: enable-keypad, mark-directories, input-meta,
+ visible-stats, disable-completion, comment-begin
+new readline commands to manipulate the mark and operate on the region
+new readline emacs mode commands and bindings for ksh-88 compatibility
+updated and extended builtins
+new DEBUG trap
+expanded (and now documented) restricted shell mode
+
+implementation stuff:
+autoconf-based configuration
+nearly all of the bugs reported since version 1.14 have been fixed
+most builtins converted to use builtin `getopt' for consistency
+most builtins use -p option to display output in a reusable form
+ (for consistency)
+grammar tighter and smaller (66 reduce-reduce conflicts gone)
+lots of code now smaller and faster
+test suite greatly expanded
+
+B2) Are there any user-visible incompatibilities between bash-2.05b and
+ bash-1.14.7?
+
+There are a few incompatibilities between version 1.14.7 and version 2.05b.
+They are detailed in the file COMPAT in the bash distribution. That file
+is not meant to be all-encompassing; send mail to bash-maintainers@gnu.org
+if if you find something that's not mentioned there.
+
+Section C: Differences from other Unix shells
+
+C1) How does bash differ from sh, the Bourne shell?
+
+This is a non-comprehensive list of features that differentiate bash
+from the SVR4.2 shell. The bash manual page explains these more
+completely.
+
+Things bash has that sh does not:
+ long invocation options
+ [+-]O invocation option
+ -l invocation option
+ `!' reserved word to invert pipeline return value
+ `time' reserved word to time pipelines and shell builtins
+ the `function' reserved word
+ the `select' compound command and reserved word
+ arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
+ new $'...' and $"..." quoting
+ the $(...) form of command substitution
+ the $(<filename) form of command substitution, equivalent to
+ $(cat filename)
+ the ${#param} parameter value length operator
+ the ${!param} indirect parameter expansion operator
+ the ${!param*} prefix expansion operator
+ the ${param:offset[:length]} parameter substring operator
+ the ${param/pat[/string]} parameter pattern substitution operator
+ expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
+ expansion of positional parameters beyond $9 with ${num}
+ variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, REPLY,
+ TIMEFORMAT, PPID, PWD, OLDPWD, SHLVL, RANDOM, SECONDS,
+ LINENO, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE, HOSTNAME,
+ ENV, PS3, PS4, DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE,
+ HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS,
+ PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC,
+ SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars,
+ auto_resume
+ DEBUG trap
+ ERR trap
+ variable arrays with new compound assignment syntax
+ redirections: <>, &>, >|, <<<, [n]<&word-, [n]>&word-
+ prompt string special char translation and variable expansion
+ auto-export of variables in initial environment
+ command search finds functions before builtins
+ bash return builtin will exit a file sourced with `.'
+ builtins: cd -/-L/-P, exec -l/-c/-a, echo -e/-E, hash -d/-l/-p/-t.
+ export -n/-f/-p/name=value, pwd -L/-P,
+ read -e/-p/-a/-t/-n/-d/-s/-u,
+ readonly -a/-f/name=value, trap -l, set +o,
+ set -b/-m/-o option/-h/-p/-B/-C/-H/-P,
+ unset -f/-v, ulimit -m/-p/-u,
+ type -a/-p/-t/-f/-P, suspend -f, kill -n,
+ test -o optname/s1 == s2/s1 < s2/s1 > s2/-nt/-ot/-ef/-O/-G/-S
+ bash reads ~/.bashrc for interactive shells, $ENV for non-interactive
+ bash restricted shell mode is more extensive
+ bash allows functions and variables with the same name
+ brace expansion
+ tilde expansion
+ arithmetic expansion with $((...)) and `let' builtin
+ the `[[...]]' extended conditional command
+ process substitution
+ aliases and alias/unalias builtins
+ local variables in functions and `local' builtin
+ readline and command-line editing with programmable completion
+ command history and history/fc builtins
+ csh-like history expansion
+ other new bash builtins: bind, command, compgen, complete, builtin,
+ declare/typeset, dirs, enable, fc, help,
+ history, logout, popd, pushd, disown, shopt,
+ printf
+ exported functions
+ filename generation when using output redirection (command >a*)
+ POSIX.2-style globbing character classes
+ POSIX.2-style globbing equivalence classes
+ POSIX.2-style globbing collating symbols
+ egrep-like extended pattern matching operators
+ case-insensitive pattern matching and globbing
+ variable assignments preceding commands affect only that command,
+ even for builtins and functions
+ posix mode
+ redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr,
+ /dev/tcp/host/port, /dev/udp/host/port
+
+Things sh has that bash does not:
+ uses variable SHACCT to do shell accounting
+ includes `stop' builtin (bash can use alias stop='kill -s STOP')
+ `newgrp' builtin
+ turns on job control if called as `jsh'
+ $TIMEOUT (like bash $TMOUT)
+ `^' is a synonym for `|'
+ new SVR4.2 sh builtins: mldmode, priv
+
+Implementation differences:
+ redirection to/from compound commands causes sh to create a subshell
+ bash does not allow unbalanced quotes; sh silently inserts them at EOF
+ bash does not mess with signal 11
+ sh sets (euid, egid) to (uid, gid) if -p not supplied and uid < 100
+ bash splits only the results of expansions on IFS, using POSIX.2
+ field splitting rules; sh splits all words on IFS
+ sh does not allow MAILCHECK to be unset (?)
+ sh does not allow traps on SIGALRM or SIGCHLD
+ bash allows multiple option arguments when invoked (e.g. -x -v);
+ sh allows only a single option argument (`sh -x -v' attempts
+ to open a file named `-v', and, on SunOS 4.1.4, dumps core.
+ On Solaris 2.4 and earlier versions, sh goes into an infinite
+ loop.)
+ sh exits a script if any builtin fails; bash exits only if one of
+ the POSIX.2 `special' builtins fails
+
+C2) How does bash differ from the Korn shell, version ksh88?
+
+Things bash has or uses that ksh88 does not:
+ long invocation options
+ [-+]O invocation option
+ -l invocation option
+ `!' reserved word
+ arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
+ arithmetic in largest machine-supported size (intmax_t)
+ posix mode and posix conformance
+ command hashing
+ tilde expansion for assignment statements that look like $PATH
+ process substitution with named pipes if /dev/fd is not available
+ the ${!param} indirect parameter expansion operator
+ the ${!param*} prefix expansion operator
+ the ${param:offset[:length]} parameter substring operator
+ the ${param/pat[/string]} parameter pattern substitution operator
+ variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, SHLVL,
+ TIMEFORMAT, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE,
+ HISTFILESIZE, HISTIGNORE, HISTCONTROL, PROMPT_COMMAND,
+ IGNOREEOF, FIGNORE, INPUTRC, HOSTFILE, DIRSTACK,
+ PIPESTATUS, HOSTNAME, OPTERR, SHELLOPTS, GLOBIGNORE,
+ GROUPS, FUNCNAME, histchars, auto_resume
+ prompt expansion with backslash escapes and command substitution
+ redirection: &> (stdout and stderr), <<<, [n]<&word-, [n]>&word-
+ more extensive and extensible editing and programmable completion
+ builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
+ exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history,
+ jobs -x/-r/-s, kill -s/-n/-l, local, logout, popd, pushd,
+ read -e/-p/-a/-t/-n/-d/-s, readonly -a/-n/-f/-p,
+ set -o braceexpand/-o histexpand/-o interactive-comments/
+ -o notify/-o physical/-o posix/-o hashall/-o onecmd/
+ -h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type,
+ typeset -a/-F/-p, ulimit -u, umask -S, alias -p, shopt,
+ disown, printf, complete, compgen
+ `!' csh-style history expansion
+ POSIX.2-style globbing character classes
+ POSIX.2-style globbing equivalence classes
+ POSIX.2-style globbing collating symbols
+ egrep-like extended pattern matching operators
+ case-insensitive pattern matching and globbing
+ `**' arithmetic operator to do exponentiation
+ redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr
+ arrays of unlimited size
+ TMOUT is default timeout for `read' and `select'
+
+Things ksh88 has or uses that bash does not:
+ tracked aliases (alias -t)
+ variables: ERRNO, FPATH, EDITOR, VISUAL
+ co-processes (|&, >&p, <&p)
+ weirdly-scoped functions
+ typeset +f to list all function names without definitions
+ text of command history kept in a file, not memory
+ builtins: alias -x, cd old new, fc -e -, newgrp, print,
+ read -p/-s/var?prompt, set -A/-o gmacs/
+ -o bgnice/-o markdirs/-o nolog/-o trackall/-o viraw/-s,
+ typeset -H/-L/-R/-Z/-A/-ft/-fu/-fx/-l/-u/-t, whence
+ using environment to pass attributes of exported variables
+ arithmetic evaluation done on arguments to some builtins
+ reads .profile from $PWD when invoked as login shell
+
+Implementation differences:
+ ksh runs last command of a pipeline in parent shell context
+ bash has brace expansion by default (ksh88 compile-time option)
+ bash has fixed startup file for all interactive shells; ksh reads $ENV
+ bash has exported functions
+ bash command search finds functions before builtins
+ bash waits for all commands in pipeline to exit before returning status
+ emacs-mode editing has some slightly different key bindings
+
+C3) Which new features in ksh-93 are not in bash, and which are?
+
+New things in ksh-93 not in bash-2.05b:
+ associative arrays
+ floating point arithmetic and variables
+ math library functions
+ ${!name[sub]} name of subscript for associative array
+ `.' is allowed in variable names to create a hierarchical namespace
+ more extensive compound assignment syntax
+ discipline functions
+ `sleep' and `getconf' builtins (bash has loadable versions)
+ typeset -n and `nameref' variables
+ KEYBD trap
+ variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, .sh.version,
+ .sh.name, .sh.subscript, .sh.value, .sh.match, HISTEDIT
+ backreferences in pattern matching (\N)
+ `&' operator in pattern lists for matching
+ print -f (bash uses printf)
+ `fc' has been renamed to `hist'
+ `.' can execute shell functions
+ exit statuses between 0 and 255
+ set -o pipefail
+ `+=' variable assignment operator
+ FPATH and PATH mixing
+ getopts -a
+ -I invocation option
+ DEBUG trap now executed before each simple command, instead of after
+ printf %H, %P, %T, %Z modifiers, output base for %d
+ lexical scoping for local variables in `ksh' functions
+ no scoping for local variables in `POSIX' functions
+
+New things in ksh-93 present in bash-2.05b:
+ [n]<&word- and [n]>&word- redirections (combination dup and close)
+ for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command
+ ?:, ++, --, `expr1 , expr2' arithmetic operators
+ expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]},
+ ${!param*}
+ compound array assignment
+ the `!' reserved word
+ loadable builtins -- but ksh uses `builtin' while bash uses `enable'
+ `command', `builtin', `disown' builtins
+ new $'...' and $"..." quoting
+ FIGNORE (but bash uses GLOBIGNORE), HISTCMD
+ set -o notify/-C
+ changes to kill builtin
+ read -A (bash uses read -a)
+ read -t/-d
+ trap -p
+ exec -c/-a
+ `.' restores the positional parameters when it completes
+ POSIX.2 `test'
+ umask -S
+ unalias -a
+ command and arithmetic substitution performed on PS1, PS4, and ENV
+ command name completion
+ ENV processed only for interactive shells
+
+Section D: Why does bash do some things differently than other Unix shells?
+
+D1) Why does bash run a different version of `command' than
+ `which command' says it will?
+
+On many systems, `which' is actually a csh script that assumes
+you're running csh. In tcsh, `which' and its cousin `where'
+are builtins. On other Unix systems, `which' is a perl script
+that uses the PATH environment variable.
+
+The csh script version reads the csh startup files from your
+home directory and uses those to determine which `command' will
+be invoked. Since bash doesn't use any of those startup files,
+there's a good chance that your bash environment differs from
+your csh environment. The bash `type' builtin does everything
+`which' does, and will report correct results for the running
+shell. If you're really wedded to the name `which', try adding
+the following function definition to your .bashrc:
+
+ which()
+ {
+ builtin type "$@"
+ }
+
+If you're moving from tcsh and would like to bring `where' along
+as well, use this function:
+
+ where()
+ {
+ builtin type -a "$@"
+ }
+
+D2) Why doesn't bash treat brace expansions exactly like csh?
+
+The only difference between bash and csh brace expansion is that
+bash requires a brace expression to contain at least one unquoted
+comma if it is to be expanded. Any brace-surrounded word not
+containing an unquoted comma is left unchanged by the brace
+expansion code. This affords the greatest degree of sh
+compatibility.
+
+Bash, ksh, zsh, and pd-ksh all implement brace expansion this way.
+
+D3) Why doesn't bash have csh variable modifiers?
+
+Posix has specified a more powerful, albeit somewhat more cryptic,
+mechanism cribbed from ksh, and bash implements it.
+
+${parameter%word}
+ Remove smallest suffix pattern. The WORD is expanded to produce
+ a pattern. It then expands to the value of PARAMETER, with the
+ smallest portion of the suffix matched by the pattern deleted.
+
+ x=file.c
+ echo ${x%.c}.o
+ -->file.o
+
+${parameter%%word}
+
+ Remove largest suffix pattern. The WORD is expanded to produce
+ a pattern. It then expands to the value of PARAMETER, with the
+ largest portion of the suffix matched by the pattern deleted.
+
+ x=posix/src/std
+ echo ${x%%/*}
+ -->posix
+
+${parameter#word}
+ Remove smallest prefix pattern. The WORD is expanded to produce
+ a pattern. It then expands to the value of PARAMETER, with the
+ smallest portion of the prefix matched by the pattern deleted.
+
+ x=$HOME/src/cmd
+ echo ${x#$HOME}
+ -->/src/cmd
+
+${parameter##word}
+ Remove largest prefix pattern. The WORD is expanded to produce
+ a pattern. It then expands to the value of PARAMETER, with the
+ largest portion of the prefix matched by the pattern deleted.
+
+ x=/one/two/three
+ echo ${x##*/}
+ -->three
+
+
+Given
+ a=/a/b/c/d
+ b=b.xxx
+
+ csh bash result
+ --- ---- ------
+ $a:h ${a%/*} /a/b/c
+ $a:t ${a##*/} d
+ $b:r ${b%.*} b
+ $b:e ${b##*.} xxx
+
+
+D4) How can I make my csh aliases work when I convert to bash?
+
+Bash uses a different syntax to support aliases than csh does.
+The details can be found in the documentation. We have provided
+a shell script which does most of the work of conversion for you;
+this script can be found in ./examples/misc/aliasconv.sh. Here is
+how you use it:
+
+Start csh in the normal way for you. (e.g., `csh')
+
+Pipe the output of `alias' through `aliasconv.sh', saving the
+results into `bash_aliases':
+
+ alias | bash aliasconv.sh >bash_aliases
+
+Edit `bash_aliases', carefully reading through any created
+functions. You will need to change the names of some csh specific
+variables to the bash equivalents. The script converts $cwd to
+$PWD, $term to $TERM, $home to $HOME, $user to $USER, and $prompt
+to $PS1. You may also have to add quotes to avoid unwanted
+expansion.
+
+For example, the csh alias:
+
+ alias cd 'cd \!*; echo $cwd'
+
+is converted to the bash function:
+
+ cd () { command cd "$@"; echo $PWD ; }
+
+The only thing that needs to be done is to quote $PWD:
+
+ cd () { command cd "$@"; echo "$PWD" ; }
+
+Merge the edited file into your ~/.bashrc.
+
+There is an additional, more ambitious, script in
+examples/misc/cshtobash that attempts to convert your entire csh
+environment to its bash equivalent. This script can be run as
+simply `cshtobash' to convert your normal interactive
+environment, or as `cshtobash ~/.login' to convert your login
+environment.
+
+D5) How can I pipe standard output and standard error from one command to
+ another, like csh does with `|&'?
+
+Use
+ command 2>&1 | command2
+
+The key is to remember that piping is performed before redirection, so
+file descriptor 1 points to the pipe when it is duplicated onto file
+descriptor 2.
+
+D6) Now that I've converted from ksh to bash, are there equivalents to
+ ksh features like autoloaded functions and the `whence' command?
+
+There are features in ksh-88 and ksh-93 that do not have direct bash
+equivalents. Most, however, can be emulated with very little trouble.
+
+ksh-88 feature Bash equivalent
+-------------- ---------------
+compiled-in aliases set up aliases in .bashrc; some ksh aliases are
+ bash builtins (hash, history, type)
+coprocesses named pipe pairs (one for read, one for write)
+typeset +f declare -F
+cd, print, whence function substitutes in examples/functions/kshenv
+autoloaded functions examples/functions/autoload is the same as typeset -fu
+read var?prompt read -p prompt var
+
+ksh-93 feature Bash equivalent
+-------------- ---------------
+sleep, getconf Bash has loadable versions in examples/loadables
+${.sh.version} $BASH_VERSION
+print -f printf
+hist alias hist=fc
+$HISTEDIT $FCEDIT
+
+Section E: How can I get bash to do certain things, and why does bash do
+ things the way it does?
+
+E1) Why is the bash builtin `test' slightly different from /bin/test?
+
+The specific example used here is [ ! x -o x ], which is false.
+
+Bash's builtin `test' implements the Posix.2 spec, which can be
+summarized as follows (the wording is due to David Korn):
+
+Here is the set of rules for processing test arguments.
+
+ 0 Args: False
+ 1 Arg: True iff argument is not null.
+ 2 Args: If first arg is !, True iff second argument is null.
+ If first argument is unary, then true if unary test is true
+ Otherwise error.
+ 3 Args: If second argument is a binary operator, do binary test of $1 $3
+ If first argument is !, negate two argument test of $2 $3
+ If first argument is `(' and third argument is `)', do the
+ one-argument test of the second argument.
+ Otherwise error.
+ 4 Args: If first argument is !, negate three argument test of $2 $3 $4.
+ Otherwise unspecified
+ 5 or more Args: unspecified. (Historical shells would use their
+ current algorithm).
+
+The operators -a and -o are considered binary operators for the purpose
+of the 3 Arg case.
+
+As you can see, the test becomes (not (x or x)), which is false.
+
+E2) Why does bash sometimes say `Broken pipe'?
+
+If a sequence of commands appears in a pipeline, and one of the
+reading commands finishes before the writer has finished, the
+writer receives a SIGPIPE signal. Many other shells special-case
+SIGPIPE as an exit status in the pipeline and do not report it.
+For example, in:
+
+ ps -aux | head
+
+`head' can finish before `ps' writes all of its output, and ps
+will try to write on a pipe without a reader. In that case, bash
+will print `Broken pipe' to stderr when ps is killed by a
+SIGPIPE.
+
+You can build a version of bash that will not report SIGPIPE errors
+by uncommenting the definition of DONT_REPORT_SIGPIPE in the file
+config-top.h.
+
+E3) When I have terminal escape sequences in my prompt, why does bash
+ wrap lines at the wrong column?
+
+Readline, the line editing library that bash uses, does not know
+that the terminal escape sequences do not take up space on the
+screen. The redisplay code assumes, unless told otherwise, that
+each character in the prompt is a `printable' character that
+takes up one character position on the screen.
+
+You can use the bash prompt expansion facility (see the PROMPTING
+section in the manual page) to tell readline that sequences of
+characters in the prompt strings take up no screen space.
+
+Use the \[ escape to begin a sequence of non-printing characters,
+and the \] escape to signal the end of such a sequence.
+
+E4) If I pipe the output of a command into `read variable', why doesn't
+ the output show up in $variable when the read command finishes?
+
+This has to do with the parent-child relationship between Unix
+processes. It affects all commands run in pipelines, not just
+simple calls to `read'. For example, piping a command's output
+into a `while' loop that repeatedly calls `read' will result in
+the same behavior.
+
+Each element of a pipeline runs in a separate process, a child of
+the shell running the pipeline. A subprocess cannot affect its
+parent's environment. When the `read' command sets the variable
+to the input, that variable is set only in the subshell, not the
+parent shell. When the subshell exits, the value of the variable
+is lost.
+
+Many pipelines that end with `read variable' can be converted
+into command substitutions, which will capture the output of
+a specified command. The output can then be assigned to a
+variable:
+
+ grep ^gnu /usr/lib/news/active | wc -l | read ngroup
+
+can be converted into
+
+ ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
+
+This does not, unfortunately, work to split the text among
+multiple variables, as read does when given multiple variable
+arguments. If you need to do this, you can either use the
+command substitution above to read the output into a variable
+and chop up the variable using the bash pattern removal
+expansion operators or use some variant of the following
+approach.
+
+Say /usr/local/bin/ipaddr is the following shell script:
+
+#! /bin/sh
+host `hostname` | awk '/address/ {print $NF}'
+
+Instead of using
+
+ /usr/local/bin/ipaddr | read A B C D
+
+to break the local machine's IP address into separate octets, use
+
+ OIFS="$IFS"
+ IFS=.
+ set -- $(/usr/local/bin/ipaddr)
+ IFS="$OIFS"
+ A="$1" B="$2" C="$3" D="$4"
+
+Beware, however, that this will change the shell's positional
+parameters. If you need them, you should save them before doing
+this.
+
+This is the general approach -- in most cases you will not need to
+set $IFS to a different value.
+
+Some other user-supplied alternatives include:
+
+read A B C D << HERE
+ $(IFS=.; echo $(/usr/local/bin/ipaddr))
+HERE
+
+and, where process substitution is available,
+
+read A B C D < <(IFS=.; echo $(/usr/local/bin/ipaddr))
+
+E5) I have a bunch of shell scripts that use backslash-escaped characters
+ in arguments to `echo'. Bash doesn't interpret these characters. Why
+ not, and how can I make it understand them?
+
+This is the behavior of echo on most Unix System V machines.
+
+The bash builtin `echo' is modeled after the 9th Edition
+Research Unix version of `echo'. It does not interpret
+backslash-escaped characters in its argument strings by default;
+it requires the use of the -e option to enable the
+interpretation. The System V echo provides no way to disable the
+special characters; the bash echo has a -E option to disable
+them.
+
+There is a configuration option that will make bash behave like
+the System V echo and interpret things like `\t' by default. Run
+configure with the --enable-xpg-echo-default option to turn this
+on. Be aware that this will cause some of the tests run when you
+type `make tests' to fail.
+
+There is a shell option, `xpg_echo', settable with `shopt', that will
+change the behavior of echo at runtime. Enabling this option turns
+on expansion of backslash-escape sequences.
+
+E6) Why doesn't a while or for loop get suspended when I type ^Z?
+
+This is a consequence of how job control works on Unix. The only
+thing that can be suspended is the process group. This is a single
+command or pipeline of commands that the shell forks and executes.
+
+When you run a while or for loop, the only thing that the shell forks
+and executes are any commands in the while loop test and commands in
+the loop bodies. These, therefore, are the only things that can be
+suspended when you type ^Z.
+
+If you want to be able to stop the entire loop, you need to put it
+within parentheses, which will force the loop into a subshell that
+may be stopped (and subsequently restarted) as a single unit.
+
+E7) What about empty for loops in Makefiles?
+
+It's fairly common to see constructs like this in automatically-generated
+Makefiles:
+
+SUBDIRS = @SUBDIRS@
+
+ ...
+
+subdirs-clean:
+ for d in ${SUBDIRS}; do \
+ ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+ done
+
+When SUBDIRS is empty, this results in a command like this being passed to
+bash:
+
+ for d in ; do
+ ( cd $d && ${MAKE} ${MFLAGS} clean )
+ done
+
+In versions of bash before bash-2.05a, this was a syntax error. If the
+reserved word `in' was present, a word must follow it before the semicolon
+or newline. The language in the manual page referring to the list of words
+being empty referred to the list after it is expanded. These versions of
+bash required that there be at least one word following the `in' when the
+construct was parsed.
+
+The idiomatic Makefile solution is something like:
+
+SUBDIRS = @SUBDIRS@
+
+subdirs-clean:
+ subdirs=$SUBDIRS ; for d in $$subdirs; do \
+ ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+ done
+
+The latest drafts of the updated POSIX standard have changed this: the
+word list is no longer required. Bash versions 2.05a and later accept
+the new syntax.
+
+E8) Why does the arithmetic evaluation code complain about `08'?
+
+The bash arithmetic evaluation code (used for `let', $(()), (()), and in
+other places), interprets a leading `0' in numeric constants as denoting
+an octal number, and a leading `0x' as denoting hexadecimal. This is
+in accordance with the POSIX.2 spec, section 2.9.2.1, which states that
+arithmetic constants should be handled as signed long integers as defined
+by the ANSI/ISO C standard.
+
+The POSIX.2 interpretation committee has confirmed this:
+
+http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-173.html
+
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+ with every letter except `z'?
+
+Bash-2.03, Bash-2.05 and later versions honor the current locale setting
+when processing ranges within pattern matching bracket expressions ([A-Z]).
+This is what POSIX.2 and SUSv3/XPG6 specify.
+
+The behavior of the matcher in bash-2.05 and later versions depends on the
+current LC_COLLATE setting. Setting this variable to `C' or `POSIX' will
+result in the traditional behavior ([A-Z] matches all uppercase ASCII
+characters). Many other locales, including the en_US locale (the default
+on many US versions of Linux) collate the upper and lower case letters like
+this:
+
+ AaBb...Zz
+
+which means that [A-Z] matches every letter except `z'. Others collate like
+
+ aAbBcC...zZ
+
+which means that [A-Z] matches every letter except `a'.
+
+The portable way to specify upper case letters is [:upper:] instead of
+A-Z; lower case may be specified as [:lower:] instead of a-z.
+
+Look at the manual pages for setlocale(3), strcoll(3), and, if it is
+present, locale(1). If you have locale(1), you can use it to find
+your current locale information even if you do not have any of the
+LC_ variables set.
+
+My advice is to put
+
+ export LC_COLLATE=C
+
+into /etc/profile and inspect any shell scripts run from cron for
+constructs like [A-Z]. This will prevent things like
+
+ rm [A-Z]*
+
+from removing every file in the current directory except those beginning
+with `z' and still allow individual users to change the collation order.
+Users may put the above command into their own profiles as well, of course.
+
+E10) Why does `cd //' leave $PWD as `//'?
+
+POSIX.2, in its description of `cd', says that *three* or more leading
+slashes may be replaced with a single slash when canonicalizing the
+current working directory.
+
+This is, I presume, for historical compatibility. Certain versions of
+Unix, and early network file systems, used paths of the form
+//hostname/path to access `path' on server `hostname'.
+
+E11) If I resize my xterm while another program is running, why doesn't bash
+ notice the change?
+
+This is another issue that deals with job control.
+
+The kernel maintains a notion of a current terminal process group. Members
+of this process group (processes whose process group ID is equal to the
+current terminal process group ID) receive terminal-generated signals like
+SIGWINCH. (For more details, see the JOB CONTROL section of the bash
+man page.)
+
+If a terminal is resized, the kernel sends SIGWINCH to each member of
+the terminal's current process group (the `foreground' process group).
+
+When bash is running with job control enabled, each pipeline (which may be
+a single command) is run in its own process group, different from bash's
+process group. This foreground process group receives the SIGWINCH; bash
+does not. Bash has no way of knowing that the terminal has been resized.
+
+There is a `checkwinsize' option, settable with the `shopt' builtin, that
+will cause bash to check the window size and adjust its idea of the
+terminal's dimensions each time a process stops or exits and returns control
+of the terminal to bash. Enable it with `shopt -s checkwinsize'.
+
+Section F: Things to watch out for on certain Unix versions
+
+F1) Why can't I use command line editing in my `cmdtool'?
+
+The problem is `cmdtool' and bash fighting over the input. When
+scrolling is enabled in a cmdtool window, cmdtool puts the tty in
+`raw mode' to permit command-line editing using the mouse for
+applications that cannot do it themselves. As a result, bash and
+cmdtool each try to read keyboard input immediately, with neither
+getting enough of it to be useful.
+
+This mode also causes cmdtool to not implement many of the
+terminal functions and control sequences appearing in the
+`sun-cmd' termcap entry. For a more complete explanation, see
+that file examples/suncmd.termcap in the bash distribution.
+
+`xterm' is a better choice, and gets along with bash much more
+smoothly.
+
+If you must use cmdtool, you can use the termcap description in
+examples/suncmd.termcap. Set the TERMCAP variable to the terminal
+description contained in that file, i.e.
+
+TERMCAP='Mu|sun-cmd:am:bs:km:pt:li#34:co#80:cl=^L:ce=\E[K:cd=\E[J:rs=\E[s:'
+
+Then export TERMCAP and start a new cmdtool window from that shell.
+The bash command-line editing should behave better in the new
+cmdtool. If this works, you can put the assignment to TERMCAP
+in your bashrc file.
+
+F2) I built bash on Solaris 2. Why do globbing expansions and filename
+ completion chop off the first few characters of each filename?
+
+This is the consequence of building bash on SunOS 5 and linking
+with the libraries in /usr/ucblib, but using the definitions
+and structures from files in /usr/include.
+
+The actual conflict is between the dirent structure in
+/usr/include/dirent.h and the struct returned by the version of
+`readdir' in libucb.a (a 4.3-BSD style `struct direct').
+
+Make sure you've got /usr/ccs/bin ahead of /usr/ucb in your $PATH
+when configuring and building bash. This will ensure that you
+use /usr/ccs/bin/cc or acc instead of /usr/ucb/cc and that you
+link with libc before libucb.
+
+If you have installed the Sun C compiler, you may also need to
+put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
+/usr/ucb.
+
+F3) Why does bash dump core after I interrupt username completion or
+ `~user' tilde expansion on a machine running NIS?
+
+This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
+client library, which is part of libc.
+
+The YP library code keeps static state -- a pointer into the data
+returned from the server. When YP initializes itself (setpwent),
+it looks at this pointer and calls free on it if it's non-null.
+So far, so good.
+
+If one of the YP functions is interrupted during getpwent (the
+exact function is interpretwithsave()), and returns NULL, the
+pointer is freed without being reset to NULL, and the function
+returns. The next time getpwent is called, it sees that this
+pointer is non-null, calls free, and the bash free() blows up
+because it's being asked to free freed memory.
+
+The traditional Unix mallocs allow memory to be freed multiple
+times; that's probably why this has never been fixed. You can
+run configure with the `--without-gnu-malloc' option to use
+the C library malloc and avoid the problem.
+
+F4) I'm running SVR4.2. Why is the line erased every time I type `@'?
+
+The `@' character is the default `line kill' character in most
+versions of System V, including SVR4.2. You can change this
+character to whatever you want using `stty'. For example, to
+change the line kill character to control-u, type
+
+ stty kill ^U
+
+where the `^' and `U' can be two separate characters.
+
+F5) Why does bash report syntax errors when my C News scripts use a
+ redirection before a subshell command?
+
+The actual command in question is something like
+
+ < file ( command )
+
+According to the grammar given in the POSIX.2 standard, this construct
+is, in fact, a syntax error. Redirections may only precede `simple
+commands'. A subshell construct such as the above is one of the shell's
+`compound commands'. A redirection may only follow a compound command.
+
+This affects the mechanical transformation of commands that use `cat'
+to pipe a file into a command (a favorite Useless-Use-Of-Cat topic on
+comp.unix.shell). While most commands of the form
+
+ cat file | command
+
+can be converted to `< file command', shell control structures such as
+loops and subshells require `command < file'.
+
+The file CWRU/sh-redir-hack in the bash-2.05a distribution is an
+(unofficial) patch to parse.y that will modify the grammar to
+support this construct. It will not apply with `patch'; you must
+modify parse.y by hand. Note that if you apply this, you must
+recompile with -DREDIRECTION_HACK. This introduces a large
+number of reduce/reduce conflicts into the shell grammar.
+
+F6) Why can't I use vi-mode editing on Red Hat Linux 6.1?
+
+The short answer is that Red Hat screwed up.
+
+The long answer is that they shipped an /etc/inputrc that only works
+for emacs mode editing, and then screwed all the vi users by setting
+INPUTRC to /etc/inputrc in /etc/profile.
+
+The short fix is to do one of the following: remove or rename
+/etc/inputrc, set INPUTRC=~/.inputrc in ~/.bashrc (or .bash_profile,
+but make sure you export it if you do), remove the assignment to
+INPUTRC from /etc/profile, add
+
+ set keymap emacs
+
+to the beginning of /etc/inputrc, or bracket the key bindings in
+/etc/inputrc with these lines
+
+ $if mode=emacs
+ [...]
+ $endif
+
+F7) Why do bash-2.05a and bash-2.05b fail to compile `printf.def' on
+ HP/UX 11.x?
+
+HP/UX's support for long double is imperfect at best.
+
+GCC will support it without problems, but the HP C library functions
+like strtold(3) and printf(3) don't actually work with long doubles.
+HP implemented a `long_double' type as a 4-element array of 32-bit
+ints, and that is what the library functions use. The ANSI C
+`long double' type is a 128-bit floating point scalar.
+
+The easiest fix, until HP fixes things up, is to edit the generated
+config.h and #undef the HAVE_LONG_DOUBLE line. After doing that,
+the compilation should complete successfully.
+
+Section G: How can I get bash to do certain common things?
+
+G1) How can I get bash to read and display eight-bit characters?
+
+This is a process requiring several steps.
+
+First, you must ensure that the `physical' data path is a full eight
+bits. For xterms, for example, the `vt100' resources `eightBitInput'
+and `eightBitOutput' should be set to `true'.
+
+Once you have set up an eight-bit path, you must tell the kernel and
+tty driver to leave the eighth bit of characters alone when processing
+keyboard input. Use `stty' to do this:
+
+ stty cs8 -istrip -parenb
+
+For old BSD-style systems, you can use
+
+ stty pass8
+
+You may also need
+
+ stty even odd
+
+Finally, you need to tell readline that you will be inputting and
+displaying eight-bit characters. You use readline variables to do
+this. These variables can be set in your .inputrc or using the bash
+`bind' builtin. Here's an example using `bind':
+
+ bash$ bind 'set convert-meta off'
+ bash$ bind 'set meta-flag on'
+ bash$ bind 'set output-meta on'
+
+The `set' commands between the single quotes may also be placed
+in ~/.inputrc.
+
+G2) How do I write a function `x' to replace builtin command `x', but
+ still invoke the command from within the function?
+
+This is why the `command' and `builtin' builtins exist. The
+`command' builtin executes the command supplied as its first
+argument, skipping over any function defined with that name. The
+`builtin' builtin executes the builtin command given as its first
+argument directly.
+
+For example, to write a function to replace `cd' that writes the
+hostname and current directory to an xterm title bar, use
+something like the following:
+
+ cd()
+ {
+ builtin cd "$@" && xtitle "$HOST: $PWD"
+ }
+
+This could also be written using `command' instead of `builtin';
+the version above is marginally more efficient.
+
+G3) How can I find the value of a shell variable whose name is the value
+ of another shell variable?
+
+Versions of Bash newer than Bash-2.0 support this directly. You can use
+
+ ${!var}
+
+For example, the following sequence of commands will echo `z':
+
+ var1=var2
+ var2=z
+ echo ${!var1}
+
+For sh compatibility, use the `eval' builtin. The important
+thing to remember is that `eval' expands the arguments you give
+it again, so you need to quote the parts of the arguments that
+you want `eval' to act on.
+
+For example, this expression prints the value of the last positional
+parameter:
+
+ eval echo \"\$\{$#\}\"
+
+The expansion of the quoted portions of this expression will be
+deferred until `eval' runs, while the `$#' will be expanded
+before `eval' is executed. In versions of bash later than bash-2.0,
+
+ echo ${!#}
+
+does the same thing.
+
+This is not the same thing as ksh93 `nameref' variables, though the syntax
+is similar. I may add namerefs in a future bash version.
+
+G4) How can I make the bash `time' reserved word print timing output that
+ looks like the output from my system's /usr/bin/time?
+
+The bash command timing code looks for a variable `TIMEFORMAT' and
+uses its value as a format string to decide how to display the
+timing statistics.
+
+The value of TIMEFORMAT is a string with `%' escapes expanded in a
+fashion similar in spirit to printf(3). The manual page explains
+the meanings of the escape sequences in the format string.
+
+If TIMEFORMAT is not set, bash acts as if the following assignment had
+been performed:
+
+ TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
+
+The POSIX.2 default time format (used by `time -p command') is
+
+ TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
+
+The BSD /usr/bin/time format can be emulated with:
+
+ TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys'
+
+The System V /usr/bin/time format can be emulated with:
+
+ TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S'
+
+The ksh format can be emulated with:
+
+ TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS'
+
+G5) How do I get the current directory into my prompt?
+
+Bash provides a number of backslash-escape sequences which are expanded
+when the prompt string (PS1 or PS2) is displayed. The full list is in
+the manual page.
+
+The \w expansion gives the full pathname of the current directory, with
+a tilde (`~') substituted for the current value of $HOME. The \W
+expansion gives the basename of the current directory. To put the full
+pathname of the current directory into the path without any tilde
+subsitution, use $PWD. Here are some examples:
+
+ PS1='\w$ ' # current directory with tilde
+ PS1='\W$ ' # basename of current directory
+ PS1='$PWD$ ' # full pathname of current directory
+
+The single quotes are important in the final example to prevent $PWD from
+being expanded when the assignment to PS1 is performed.
+
+G6) How can I rename "*.foo" to "*.bar"?
+
+Use the pattern removal functionality described in D3. The following `for'
+loop will do the trick:
+
+ for f in *.foo; do
+ mv $f ${f%foo}bar
+ done
+
+G7) How can I translate a filename from uppercase to lowercase?
+
+The script examples/functions/lowercase, originally written by John DuBois,
+will do the trick. The converse is left as an exercise.
+
+G8) How can I write a filename expansion (globbing) pattern that will match
+ all files in the current directory except "." and ".."?
+
+You must have set the `extglob' shell option using `shopt -s extglob' to use
+this:
+
+ echo .!(.|) *
+
+A solution that works without extended globbing is given in the Unix Shell
+FAQ, posted periodically to comp.unix.shell.
+
+Section H: Where do I go from here?
+
+H1) How do I report bugs in bash, and where should I look for fixes and
+ advice?
+
+Use the `bashbug' script to report bugs. It is built and
+installed at the same time as bash. It provides a standard
+template for reporting a problem and automatically includes
+information about your configuration and build environment.
+
+`bashbug' sends its reports to bug-bash@gnu.org, which
+is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
+
+Bug fixes, answers to questions, and announcements of new releases
+are all posted to gnu.bash.bug. Discussions concerning bash features
+and problems also take place there.
+
+To reach the bash maintainers directly, send mail to
+bash-maintainers@gnu.org.
+
+H2) What kind of bash documentation is there?
+
+First, look in the doc directory in the bash distribution. It should
+contain at least the following files:
+
+bash.1 an extensive, thorough Unix-style manual page
+builtins.1 a manual page covering just bash builtin commands
+bashref.texi a reference manual in GNU tex`info format
+bashref.info an info version of the reference manual
+FAQ this file
+article.ms text of an article written for The Linux Journal
+readline.3 a man page describing readline
+
+Postscript, HTML, and ASCII files created from the above source are
+available in the documentation distribution.
+
+There is additional documentation available for anonymous FTP from host
+ftp.cwru.edu in the `pub/bash' directory.
+
+Cameron Newham and Bill Rosenblatt have written a book on bash, published
+by O'Reilly and Associates. The book is based on Bill Rosenblatt's Korn
+Shell book. The title is ``Learning the Bash Shell'', and the ISBN number
+is 1-56592-147-X. Look for it in fine bookstores near you. This book
+covers bash-1.14, but has an appendix describing some of the new features
+in bash-2.0.
+
+A second edition of this book is available, published in January, 1998.
+The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores
+or on the web.
+
+The GNU Bash Reference Manual has been published as a printed book by
+Network Theory Ltd (Paperback, ISBN: 0-9541617-7-7, Feb 2003). It covers
+bash-2.0 and is available from most online bookstores (see
+http://www.network-theory.co.uk/bash/manual/ for details). The publisher
+will donate $1 to the Free Software Foundation for each copy sold.
+
+H3) What's coming in future versions?
+
+These are features I hope to include in a future version of bash.
+
+a better bash debugger (a minimally-tested version is included with bash-2.05b)
+associative arrays
+co-processes, but with a new-style syntax that looks like function declaration
+
+H4) What's on the bash `wish list' for future versions?
+
+These are features that may or may not appear in a future version of bash.
+
+breaking some of the shell functionality into embeddable libraries
+a module system like zsh's, using dynamic loading like builtins
+better internationalization using GNU `gettext'
+date-stamped command history
+a bash programmer's guide with a chapter on creating loadable builtins
+a better loadable interface to perl with access to the shell builtins and
+ variables (contributions gratefully accepted)
+ksh93-like `nameref' variables
+ksh93-like `+=' variable assignment operator
+ksh93-like `xx.yy' variables (including some of the .sh.* variables) and
+ associated disipline functions
+Some of the new ksh93 pattern matching operators, like backreferencing
+
+H5) When will the next release appear?
+
+The next version will appear sometime in 2002. Never make predictions.
+
+
+This document is Copyright 1995-2003 by Chester Ramey.
+
+Permission is hereby granted, without written agreement and
+without license or royalty fees, to use, copy, and distribute
+this document for any purpose, provided that the above copyright
+notice appears in all copies of this document and that the
+contents of this document remain unaltered.
.\" Case Western Reserve University
.\" chet.ramey@case.edu
.\"
-.\" Last Change: Wed Aug 27 08:43:44 EDT 2014
+.\" Last Change: Tue Oct 7 11:42:56 EDT 2014
.\"
.\" bash_builtins, strip all but Built-Ins section
.if \n(zZ=1 .ig zZ
.if \n(zY=1 .ig zY
-.TH BASH 1 "2014 August 27" "GNU Bash 4.3"
+.TH BASH 1 "2014 October 7" "GNU Bash 4.3"
.\"
.\" There's some problem with having a `@'
.\" in a tagged paragraph with the BSD man macros.
(with no trailing blanks)
is seen. All of
the lines read up to that point are then used as the standard
-input for a command.
+input (or file descriptor \fIn\fP if \fIn\fP is specified) for a command.
.PP
The format of here-documents is:
.RS
.PP
.nf
-\fB<<\fP[\fB\-\fP]\fIword\fP
+[\fIn\fP]\fB<<\fP[\fB\-\fP]\fIword\fP
\fIhere-document\fP
\fIdelimiter\fP
.fi
.RS
.PP
.nf
-\fB<<<\fP\fIword\fP
+[\fIn\fP]\fB<<<\fP\fIword\fP
.fi
.RE
.PP
command substitution, arithmetic expansion, and quote removal.
Pathname expansion and word splitting are not performed.
The result is supplied as a single string to the command on its
-standard input.
+standard input (or file descriptor \fIn\fP if \fIn\fP is specified).
.SS "Duplicating File Descriptors"
+
.PP
The redirection operator
.RS
current source until a line containing only @var{word}
(with no trailing blanks) is seen. All of
the lines read up to that point are then used as the standard
-input for a command.
+input (or file descriptor @var{n} if @var{n} is specified) for a command.
The format of here-documents is:
@example
-<<[@minus{}]@var{word}
+[@var{n}]<<[@minus{}]@var{word}
@var{here-document}
@var{delimiter}
@end example
@subsection Here Strings
A variant of here documents, the format is:
@example
-<<< @var{word}
+[@var{n}]<<< @var{word}
@end example
The @var{word} undergoes
command substitution, arithmetic expansion, and quote removal.
Pathname expansion and word splitting are not performed.
The result is supplied as a single string to the command on its
-standard input.
+standard input (or file descriptor @var{n} if @var{n} is specified).
@subsection Duplicating File Descriptors
The redirection operator
Copyright (C) 1988-2014 Free Software Foundation, Inc.
@end ignore
-@set LASTCHANGE Wed Aug 27 08:43:08 EDT 2014
+@set LASTCHANGE Tue Oct 7 11:45:14 EDT 2014
@set EDITION 4.3
@set VERSION 4.3
-@set UPDATED 6 September 2014
-@set UPDATED-MONTH September 2014
+@set UPDATED 7 October 2014
+@set UPDATED-MONTH October 2014
--- /dev/null
+#
+# Simple makefile for the sample loadable builtins
+#
+# Copyright (C) 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+# Include some boilerplate Gnu makefile definitions.
+prefix = @prefix@
+
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+infodir = @infodir@
+includedir = @includedir@
+
+topdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+
+@SET_MAKE@
+CC = @CC@
+RM = rm -f
+
+SHELL = @MAKE_SHELL@
+
+host_os = @host_os@
+host_cpu = @host_cpu@
+host_vendor = @host_vendor@
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@
+DEFS = @DEFS@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+CPPFLAGS = @CPPFLAGS@
+
+BASHINCDIR = ${topdir}/include
+
+LIBBUILD = ${BUILD_DIR}/lib
+
+INTL_LIBSRC = ${topdir}/lib/intl
+INTL_BUILDDIR = ${LIBBUILD}/intl
+INTL_INC = @INTL_INC@
+LIBINTL_H = @LIBINTL_H@
+
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(LOCAL_CFLAGS) $(CFLAGS)
+
+#
+# These values are generated for configure by ${topdir}/support/shobj-conf.
+# If your system is not supported by that script, but includes facilities for
+# dynamic loading of shared objects, please update the script and send the
+# changes to bash-maintainers@gnu.org.
+#
+SHOBJ_CC = @SHOBJ_CC@
+SHOBJ_CFLAGS = @SHOBJ_CFLAGS@
+SHOBJ_LD = @SHOBJ_LD@
+SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@
+SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@
+SHOBJ_LIBS = @SHOBJ_LIBS@
+SHOBJ_STATUS = @SHOBJ_STATUS@
+
+INC = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(topdir)/builtins \
+ -I$(BASHINCDIR) -I$(BUILD_DIR) -I$(LIBBUILD) \
+ -I$(BUILD_DIR)/builtins $(INTL_INC)
+
+.c.o:
+ $(SHOBJ_CC) $(SHOBJ_CFLAGS) $(CCFLAGS) $(INC) -c -o $@ $<
+
+
+ALLPROG = print truefalse sleep pushd finfo logname basename dirname \
+ tty pathchk tee head mkdir rmdir printenv id whoami \
+ uname sync push ln unlink cut realpath getconf strftime
+OTHERPROG = necho hello cat
+
+all: $(SHOBJ_STATUS)
+
+supported: $(ALLPROG)
+others: $(OTHERPROG)
+
+unsupported:
+ @echo "Your system (${host_os}) is not supported by the"
+ @echo "${topdir}/support/shobj-conf script."
+ @echo "If your operating system provides facilities for dynamic"
+ @echo "loading of shared objects using the dlopen(3) interface,"
+ @echo "please update the script and re-run configure.
+ @echo "Please send the changes you made to bash-maintainers@gnu.org"
+ @echo "for inclusion in future bash releases."
+
+everything: supported others
+
+print: print.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ print.o $(SHOBJ_LIBS)
+
+necho: necho.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ necho.o $(SHOBJ_LIBS)
+
+getconf: getconf.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ getconf.o $(SHOBJ_LIBS)
+
+hello: hello.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ hello.o $(SHOBJ_LIBS)
+
+truefalse: truefalse.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ truefalse.o $(SHOBJ_LIBS)
+
+sleep: sleep.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sleep.o $(SHOBJ_LIBS)
+
+finfo: finfo.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ finfo.o $(SHOBJ_LIBS)
+
+cat: cat.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cat.o $(SHOBJ_LIBS)
+
+logname: logname.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ logname.o $(SHOBJ_LIBS)
+
+basename: basename.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ basename.o $(SHOBJ_LIBS)
+
+dirname: dirname.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ dirname.o $(SHOBJ_LIBS)
+
+tty: tty.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tty.o $(SHOBJ_LIBS)
+
+pathchk: pathchk.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pathchk.o $(SHOBJ_LIBS)
+
+tee: tee.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tee.o $(SHOBJ_LIBS)
+
+mkdir: mkdir.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ mkdir.o $(SHOBJ_LIBS)
+
+rmdir: rmdir.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ rmdir.o $(SHOBJ_LIBS)
+
+head: head.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ head.o $(SHOBJ_LIBS)
+
+printenv: printenv.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ printenv.o $(SHOBJ_LIBS)
+
+id: id.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ id.o $(SHOBJ_LIBS)
+
+whoami: whoami.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ whoami.o $(SHOBJ_LIBS)
+
+uname: uname.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ uname.o $(SHOBJ_LIBS)
+
+sync: sync.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sync.o $(SHOBJ_LIBS)
+
+push: push.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ push.o $(SHOBJ_LIBS)
+
+ln: ln.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ ln.o $(SHOBJ_LIBS)
+
+unlink: unlink.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ unlink.o $(SHOBJ_LIBS)
+
+cut: cut.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cut.o $(SHOBJ_LIBS)
+
+realpath: realpath.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ realpath.o $(SHOBJ_LIBS)
+
+strftime: strftime.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ strftime.o $(SHOBJ_LIBS)
+
+# pushd is a special case. We use the same source that the builtin version
+# uses, with special compilation options.
+#
+pushd.c: ${topdir}/builtins/pushd.def
+ $(RM) $@
+ ${BUILD_DIR}/builtins/mkbuiltins -D ${topdir}/builtins ${topdir}/builtins/pushd.def
+
+pushd.o: pushd.c
+ $(RM) $@
+ $(SHOBJ_CC) -DHAVE_CONFIG_H -DPUSHD_AND_POPD -DLOADABLE_BUILTIN $(SHOBJ_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(INC) -c -o $@ $<
+
+pushd: pushd.o
+ $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pushd.o $(SHOBJ_LIBS)
+
+clean:
+ $(RM) $(ALLPROG) $(OTHERPROG) *.o
+ -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+mostlyclean: clean
+ -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+distclean maintainer-clean: clean
+ $(RM) Makefile pushd.c
+ -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+print.o: print.c
+truefalse.o: truefalse.c
+sleep.o: sleep.c
+finfo.o: finfo.c
+logname.o: logname.c
+basename.o: basename.c
+dirname.o: dirname.c
+tty.o: tty.c
+pathchk.o: pathchk.c
+tee.o: tee.c
+head.o: head.c
+rmdir.o: rmdir.c
+necho.o: necho.c
+getconf.o: getconf.c
+hello.o: hello.c
+cat.o: cat.c
+printenv.o: printenv.c
+id.o: id.c
+whoami.o: whoami.c
+uname.o: uname.c
+sync.o: sync.c
+push.o: push.c
+mkdir.o: mkdir.c
+realpath.o: realpath.c
+strftime.o: strftime.c
unwind_protect_pointer (this_shell_function);
unwind_protect_int (loop_level);
unwind_protect_int (funcnest);
+ unwind_protect_int (loop_level);
}
else
push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */
stop_pipeline (async, (COMMAND *)NULL);
#endif
+ loop_level = 0;
+
fc = tc;
from_return_trap = 0;
--- /dev/null
+/* execute_cmd.c -- Execute a COMMAND structure. */
+
+/* Copyright (C) 1987-2013 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bash is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bash. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
+ #pragma alloca
+#endif /* _AIX && RISC6000 && !__GNUC__ */
+
+#include <stdio.h>
+#include "chartypes.h"
+#include "bashtypes.h"
+#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif
+#include "filecntl.h"
+#include "posixstat.h"
+#include <signal.h>
+#if defined (HAVE_SYS_PARAM_H)
+# include <sys/param.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#include "posixtime.h"
+
+#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
+# include <sys/resource.h>
+#endif
+
+#if defined (HAVE_SYS_TIMES_H) && defined (HAVE_TIMES)
+# include <sys/times.h>
+#endif
+
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+#define NEED_FPURGE_DECL
+
+#include "bashansi.h"
+#include "bashintl.h"
+
+#include "memalloc.h"
+#include "shell.h"
+#include <y.tab.h> /* use <...> so we pick it up from the build directory */
+#include "flags.h"
+#include "builtins.h"
+#include "hashlib.h"
+#include "jobs.h"
+#include "execute_cmd.h"
+#include "findcmd.h"
+#include "redir.h"
+#include "trap.h"
+#include "pathexp.h"
+#include "hashcmd.h"
+
+#if defined (COND_COMMAND)
+# include "test.h"
+#endif
+
+#include "builtins/common.h"
+#include "builtins/builtext.h" /* list of builtins */
+
+#include <glob/strmatch.h>
+#include <tilde/tilde.h>
+
+#if defined (BUFFERED_INPUT)
+# include "input.h"
+#endif
+
+#if defined (ALIAS)
+# include "alias.h"
+#endif
+
+#if defined (HISTORY)
+# include "bashhist.h"
+#endif
+
+extern int dollar_dollar_pid;
+extern int posixly_correct;
+extern int expand_aliases;
+extern int autocd;
+extern int breaking, continuing, loop_level;
+extern int parse_and_execute_level, running_trap, sourcelevel;
+extern int command_string_index, line_number;
+extern int dot_found_in_search;
+extern int already_making_children;
+extern int tempenv_assign_error;
+extern char *the_printed_command, *shell_name;
+extern pid_t last_command_subst_pid;
+extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
+extern char **subshell_argv, **subshell_envp;
+extern int subshell_argc;
+extern time_t shell_start_time;
+#if 0
+extern char *glob_argv_flags;
+#endif
+
+extern int job_control; /* XXX */
+
+extern int close __P((int));
+
+/* Static functions defined and used in this file. */
+static void close_pipes __P((int, int));
+static void do_piping __P((int, int));
+static void bind_lastarg __P((char *));
+static int shell_control_structure __P((enum command_type));
+static void cleanup_redirects __P((REDIRECT *));
+
+#if defined (JOB_CONTROL)
+static int restore_signal_mask __P((sigset_t *));
+#endif
+
+static void async_redirect_stdin __P((void));
+
+static int builtin_status __P((int));
+
+static int execute_for_command __P((FOR_COM *));
+#if defined (SELECT_COMMAND)
+static int displen __P((const char *));
+static int print_index_and_element __P((int, int, WORD_LIST *));
+static void indent __P((int, int));
+static void print_select_list __P((WORD_LIST *, int, int, int));
+static char *select_query __P((WORD_LIST *, int, char *, int));
+static int execute_select_command __P((SELECT_COM *));
+#endif
+#if defined (DPAREN_ARITHMETIC)
+static int execute_arith_command __P((ARITH_COM *));
+#endif
+#if defined (COND_COMMAND)
+static int execute_cond_node __P((COND_COM *));
+static int execute_cond_command __P((COND_COM *));
+#endif
+#if defined (COMMAND_TIMING)
+static int mkfmt __P((char *, int, int, time_t, int));
+static void print_formatted_time __P((FILE *, char *,
+ time_t, int, time_t, int,
+ time_t, int, int));
+static int time_command __P((COMMAND *, int, int, int, struct fd_bitmap *));
+#endif
+#if defined (ARITH_FOR_COMMAND)
+static intmax_t eval_arith_for_expr __P((WORD_LIST *, int *));
+static int execute_arith_for_command __P((ARITH_FOR_COM *));
+#endif
+static int execute_case_command __P((CASE_COM *));
+static int execute_while_command __P((WHILE_COM *));
+static int execute_until_command __P((WHILE_COM *));
+static int execute_while_or_until __P((WHILE_COM *, int));
+static int execute_if_command __P((IF_COM *));
+static int execute_null_command __P((REDIRECT *, int, int, int));
+static void fix_assignment_words __P((WORD_LIST *));
+static int execute_simple_command __P((SIMPLE_COM *, int, int, int, struct fd_bitmap *));
+static int execute_builtin __P((sh_builtin_func_t *, WORD_LIST *, int, int));
+static int execute_function __P((SHELL_VAR *, WORD_LIST *, int, struct fd_bitmap *, int, int));
+static int execute_builtin_or_function __P((WORD_LIST *, sh_builtin_func_t *,
+ SHELL_VAR *,
+ REDIRECT *, struct fd_bitmap *, int));
+static void execute_subshell_builtin_or_function __P((WORD_LIST *, REDIRECT *,
+ sh_builtin_func_t *,
+ SHELL_VAR *,
+ int, int, int,
+ struct fd_bitmap *,
+ int));
+static int execute_disk_command __P((WORD_LIST *, REDIRECT *, char *,
+ int, int, int, struct fd_bitmap *, int));
+
+static char *getinterp __P((char *, int, int *));
+static void initialize_subshell __P((void));
+static int execute_in_subshell __P((COMMAND *, int, int, int, struct fd_bitmap *));
+#if defined (COPROCESS_SUPPORT)
+static int execute_coproc __P((COMMAND *, int, int, struct fd_bitmap *));
+#endif
+
+static int execute_pipeline __P((COMMAND *, int, int, int, struct fd_bitmap *));
+
+static int execute_connection __P((COMMAND *, int, int, int, struct fd_bitmap *));
+
+static int execute_intern_function __P((WORD_DESC *, FUNCTION_DEF *));
+
+/* Set to 1 if fd 0 was the subject of redirection to a subshell. Global
+ so that reader_loop can set it to zero before executing a command. */
+int stdin_redir;
+
+/* The name of the command that is currently being executed.
+ `test' needs this, for example. */
+char *this_command_name;
+
+/* The printed representation of the currently-executing command (same as
+ the_printed_command), except when a trap is being executed. Useful for
+ a debugger to know where exactly the program is currently executing. */
+char *the_printed_command_except_trap;
+
+/* For catching RETURN in a function. */
+int return_catch_flag;
+int return_catch_value;
+procenv_t return_catch;
+
+/* The value returned by the last synchronous command. */
+volatile int last_command_exit_value;
+
+/* Whether or not the last command (corresponding to last_command_exit_value)
+ was terminated by a signal, and, if so, which one. */
+int last_command_exit_signal;
+
+/* Are we currently ignoring the -e option for the duration of a builtin's
+ execution? */
+int builtin_ignoring_errexit = 0;
+
+/* The list of redirections to perform which will undo the redirections
+ that I made in the shell. */
+REDIRECT *redirection_undo_list = (REDIRECT *)NULL;
+
+/* The list of redirections to perform which will undo the internal
+ redirections performed by the `exec' builtin. These are redirections
+ that must be undone even when exec discards redirection_undo_list. */
+REDIRECT *exec_redirection_undo_list = (REDIRECT *)NULL;
+
+/* When greater than zero, value is the `level' of builtins we are
+ currently executing (e.g. `eval echo a' would have it set to 2). */
+int executing_builtin = 0;
+
+/* Non-zero if we are executing a command list (a;b;c, etc.) */
+int executing_list = 0;
+
+/* Non-zero if failing commands in a command substitution should not exit the
+ shell even if -e is set. Used to pass the CMD_IGNORE_RETURN flag down to
+ commands run in command substitutions by parse_and_execute. */
+int comsub_ignore_return = 0;
+
+/* Non-zero if we have just forked and are currently running in a subshell
+ environment. */
+int subshell_environment;
+
+/* Count of nested subshells, like SHLVL. Available via $BASH_SUBSHELL */
+int subshell_level = 0;
+
+/* Currently-executing shell function. */
+SHELL_VAR *this_shell_function;
+
+/* If non-zero, matches in case and [[ ... ]] are case-insensitive */
+int match_ignore_case = 0;
+
+int executing_command_builtin = 0;
+
+struct stat SB; /* used for debugging */
+
+static int special_builtin_failed;
+
+static COMMAND *currently_executing_command;
+
+/* The line number that the currently executing function starts on. */
+static int function_line_number;
+
+/* XXX - set to 1 if we're running the DEBUG trap and we want to show the line
+ number containing the function name. Used by executing_line_number to
+ report the correct line number. Kind of a hack. */
+static int showing_function_line;
+
+/* $LINENO ($BASH_LINENO) for use by an ERR trap. Global so parse_and_execute
+ can save and restore it. */
+int line_number_for_err_trap;
+
+/* A sort of function nesting level counter */
+int funcnest = 0;
+int funcnest_max = 0;
+
+int evalnest = 0; /* bash-4.4/bash-5.0 */
+int evalnest_max = EVALNEST_MAX;
+
+int sourcenest = 0;
+int sourcenest_max = SOURCENEST_MAX;
+
+volatile int from_return_trap = 0;
+
+int lastpipe_opt = 0;
+
+struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL;
+
+#define FD_BITMAP_DEFAULT_SIZE 32
+
+/* Functions to allocate and deallocate the structures used to pass
+ information from the shell to its children about file descriptors
+ to close. */
+struct fd_bitmap *
+new_fd_bitmap (size)
+ int size;
+{
+ struct fd_bitmap *ret;
+
+ ret = (struct fd_bitmap *)xmalloc (sizeof (struct fd_bitmap));
+
+ ret->size = size;
+
+ if (size)
+ {
+ ret->bitmap = (char *)xmalloc (size);
+ memset (ret->bitmap, '\0', size);
+ }
+ else
+ ret->bitmap = (char *)NULL;
+ return (ret);
+}
+
+void
+dispose_fd_bitmap (fdbp)
+ struct fd_bitmap *fdbp;
+{
+ FREE (fdbp->bitmap);
+ free (fdbp);
+}
+
+void
+close_fd_bitmap (fdbp)
+ struct fd_bitmap *fdbp;
+{
+ register int i;
+
+ if (fdbp)
+ {
+ for (i = 0; i < fdbp->size; i++)
+ if (fdbp->bitmap[i])
+ {
+ close (i);
+ fdbp->bitmap[i] = 0;
+ }
+ }
+}
+
+/* Return the line number of the currently executing command. */
+int
+executing_line_number ()
+{
+ if (executing && showing_function_line == 0 &&
+ (variable_context == 0 || interactive_shell == 0) &&
+ currently_executing_command)
+ {
+#if defined (COND_COMMAND)
+ if (currently_executing_command->type == cm_cond)
+ return currently_executing_command->value.Cond->line;
+#endif
+#if defined (DPAREN_ARITHMETIC)
+ if (currently_executing_command->type == cm_arith)
+ return currently_executing_command->value.Arith->line;
+#endif
+#if defined (ARITH_FOR_COMMAND)
+ if (currently_executing_command->type == cm_arith_for)
+ return currently_executing_command->value.ArithFor->line;
+#endif
+
+ return line_number;
+ }
+ else
+ return line_number;
+}
+
+/* Execute the command passed in COMMAND. COMMAND is exactly what
+ read_command () places into GLOBAL_COMMAND. See "command.h" for the
+ details of the command structure.
+
+ EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
+ return values. Executing a command with nothing in it returns
+ EXECUTION_SUCCESS. */
+int
+execute_command (command)
+ COMMAND *command;
+{
+ struct fd_bitmap *bitmap;
+ int result;
+
+ current_fds_to_close = (struct fd_bitmap *)NULL;
+ bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
+ begin_unwind_frame ("execute-command");
+ add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
+
+ /* Just do the command, but not asynchronously. */
+ result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap);
+
+ dispose_fd_bitmap (bitmap);
+ discard_unwind_frame ("execute-command");
+
+#if defined (PROCESS_SUBSTITUTION)
+ /* don't unlink fifos if we're in a shell function; wait until the function
+ returns. */
+ if (variable_context == 0)
+ unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+
+ QUIT;
+ return (result);
+}
+
+/* Return 1 if TYPE is a shell control structure type. */
+static int
+shell_control_structure (type)
+ enum command_type type;
+{
+ switch (type)
+ {
+#if defined (ARITH_FOR_COMMAND)
+ case cm_arith_for:
+#endif
+#if defined (SELECT_COMMAND)
+ case cm_select:
+#endif
+#if defined (DPAREN_ARITHMETIC)
+ case cm_arith:
+#endif
+#if defined (COND_COMMAND)
+ case cm_cond:
+#endif
+ case cm_case:
+ case cm_while:
+ case cm_until:
+ case cm_if:
+ case cm_for:
+ case cm_group:
+ case cm_function_def:
+ return (1);
+
+ default:
+ return (0);
+ }
+}
+
+/* A function to use to unwind_protect the redirection undo list
+ for loops. */
+static void
+cleanup_redirects (list)
+ REDIRECT *list;
+{
+ do_redirections (list, RX_ACTIVE);
+ dispose_redirects (list);
+}
+
+#if 0
+/* Function to unwind_protect the redirections for functions and builtins. */
+static void
+cleanup_func_redirects (list)
+ REDIRECT *list;
+{
+ do_redirections (list, RX_ACTIVE);
+}
+#endif
+
+void
+dispose_exec_redirects ()
+{
+ if (exec_redirection_undo_list)
+ {
+ dispose_redirects (exec_redirection_undo_list);
+ exec_redirection_undo_list = (REDIRECT *)NULL;
+ }
+}
+
+#if defined (JOB_CONTROL)
+/* A function to restore the signal mask to its proper value when the shell
+ is interrupted or errors occur while creating a pipeline. */
+static int
+restore_signal_mask (set)
+ sigset_t *set;
+{
+ return (sigprocmask (SIG_SETMASK, set, (sigset_t *)NULL));
+}
+#endif /* JOB_CONTROL */
+
+#ifdef DEBUG
+/* A debugging function that can be called from gdb, for instance. */
+void
+open_files ()
+{
+ register int i;
+ int f, fd_table_size;
+
+ fd_table_size = getdtablesize ();
+
+ fprintf (stderr, "pid %ld open files:", (long)getpid ());
+ for (i = 3; i < fd_table_size; i++)
+ {
+ if ((f = fcntl (i, F_GETFD, 0)) != -1)
+ fprintf (stderr, " %d (%s)", i, f ? "close" : "open");
+ }
+ fprintf (stderr, "\n");
+}
+#endif
+
+static void
+async_redirect_stdin ()
+{
+ int fd;
+
+ fd = open ("/dev/null", O_RDONLY);
+ if (fd > 0)
+ {
+ dup2 (fd, 0);
+ close (fd);
+ }
+ else if (fd < 0)
+ internal_error (_("cannot redirect standard input from /dev/null: %s"), strerror (errno));
+}
+
+#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
+
+/* Execute the command passed in COMMAND, perhaps doing it asynchronously.
+ COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
+ ASYNCHROUNOUS, if non-zero, says to do this command in the background.
+ PIPE_IN and PIPE_OUT are file descriptors saying where input comes
+ from and where it goes. They can have the value of NO_PIPE, which means
+ I/O is stdin/stdout.
+ FDS_TO_CLOSE is a list of file descriptors to close once the child has
+ been forked. This list often contains the unusable sides of pipes, etc.
+
+ EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
+ return values. Executing a command with nothing in it returns
+ EXECUTION_SUCCESS. */
+int
+execute_command_internal (command, asynchronous, pipe_in, pipe_out,
+ fds_to_close)
+ COMMAND *command;
+ int asynchronous;
+ int pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ int exec_result, user_subshell, invert, ignore_return, was_error_trap;
+ REDIRECT *my_undo_list, *exec_undo_list;
+ char *tcmd;
+ volatile int last_pid;
+ volatile int save_line_number;
+#if defined (PROCESS_SUBSTITUTION)
+ volatile int ofifo, nfifo, osize, saved_fifo;
+ volatile char *ofifo_list;
+#endif
+
+ if (breaking || continuing)
+ return (last_command_exit_value);
+ if (command == 0 || read_but_dont_execute)
+ return (EXECUTION_SUCCESS);
+
+ QUIT;
+ run_pending_traps ();
+
+#if 0
+ if (running_trap == 0)
+#endif
+ currently_executing_command = command;
+
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+
+ /* If we're inverting the return value and `set -e' has been executed,
+ we don't want a failing command to inadvertently cause the shell
+ to exit. */
+ if (exit_immediately_on_error && invert) /* XXX */
+ command->flags |= CMD_IGNORE_RETURN; /* XXX */
+
+ exec_result = EXECUTION_SUCCESS;
+
+ /* If a command was being explicitly run in a subshell, or if it is
+ a shell control-structure, and it has a pipe, then we do the command
+ in a subshell. */
+ if (command->type == cm_subshell && (command->flags & CMD_NO_FORK))
+ return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
+
+#if defined (COPROCESS_SUPPORT)
+ if (command->type == cm_coproc)
+ return (execute_coproc (command, pipe_in, pipe_out, fds_to_close));
+#endif
+
+ user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
+
+ if (command->type == cm_subshell ||
+ (command->flags & (CMD_WANT_SUBSHELL|CMD_FORCE_SUBSHELL)) ||
+ (shell_control_structure (command->type) &&
+ (pipe_out != NO_PIPE || pipe_in != NO_PIPE || asynchronous)))
+ {
+ pid_t paren_pid;
+ int s;
+
+ /* Fork a subshell, turn off the subshell bit, turn off job
+ control and call execute_command () on the command again. */
+ line_number_for_err_trap = line_number;
+ tcmd = make_command_string (command);
+ paren_pid = make_child (savestring (tcmd), asynchronous);
+
+ if (user_subshell && signal_is_trapped (ERROR_TRAP) &&
+ signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ if (paren_pid == 0)
+ {
+ /* We want to run the exit trap for forced {} subshells, and we
+ want to note this before execute_in_subshell modifies the
+ COMMAND struct. Need to keep in mind that execute_in_subshell
+ runs the exit trap for () subshells itself. */
+ /* This handles { command; } & */
+ s = user_subshell == 0 && command->type == cm_group && pipe_in == NO_PIPE && pipe_out == NO_PIPE && asynchronous;
+ /* run exit trap for : | { ...; } and { ...; } | : */
+ /* run exit trap for : | ( ...; ) and ( ...; ) | : */
+ s += user_subshell == 0 && command->type == cm_group && (pipe_in != NO_PIPE || pipe_out != NO_PIPE) && asynchronous == 0;
+
+ last_command_exit_value = execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+ if (s)
+ subshell_exit (last_command_exit_value);
+ else
+ exit (last_command_exit_value);
+ /* NOTREACHED */
+ }
+ else
+ {
+ close_pipes (pipe_in, pipe_out);
+
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+ if (variable_context == 0) /* wait until shell function completes */
+ unlink_fifo_list ();
+#endif
+ /* If we are part of a pipeline, and not the end of the pipeline,
+ then we should simply return and let the last command in the
+ pipe be waited for. If we are not in a pipeline, or are the
+ last command in the pipeline, then we wait for the subshell
+ and return its exit status as usual. */
+ if (pipe_out != NO_PIPE)
+ return (EXECUTION_SUCCESS);
+
+ stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+ if (asynchronous == 0)
+ {
+ was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+ exec_result = wait_for (paren_pid);
+
+ /* If we have to, invert the return value. */
+ if (invert)
+ exec_result = ((exec_result == EXECUTION_SUCCESS)
+ ? EXECUTION_FAILURE
+ : EXECUTION_SUCCESS);
+
+ last_command_exit_value = exec_result;
+ if (user_subshell && was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+ {
+ save_line_number = line_number;
+ line_number = line_number_for_err_trap;
+ run_error_trap ();
+ line_number = save_line_number;
+ }
+
+ if (user_subshell && ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+ {
+ run_pending_traps ();
+ jump_to_top_level (ERREXIT);
+ }
+
+ return (last_command_exit_value);
+ }
+ else
+ {
+ DESCRIBE_PID (paren_pid);
+
+ run_pending_traps ();
+
+ /* Posix 2013 2.9.3.1: "the exit status of an asynchronous list
+ shall be zero." */
+ last_command_exit_value = 0;
+ return (EXECUTION_SUCCESS);
+ }
+ }
+ }
+
+#if defined (COMMAND_TIMING)
+ if (command->flags & CMD_TIME_PIPELINE)
+ {
+ if (asynchronous)
+ {
+ command->flags |= CMD_FORCE_SUBSHELL;
+ exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
+ }
+ else
+ {
+ exec_result = time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+#if 0
+ if (running_trap == 0)
+#endif
+ currently_executing_command = (COMMAND *)NULL;
+ }
+ return (exec_result);
+ }
+#endif /* COMMAND_TIMING */
+
+ if (shell_control_structure (command->type) && command->redirects)
+ stdin_redir = stdin_redirects (command->redirects);
+
+#if defined (PROCESS_SUBSTITUTION)
+ if (variable_context != 0)
+ {
+ ofifo = num_fifos ();
+ ofifo_list = copy_fifo_list ((int *)&osize);
+ saved_fifo = 1;
+ }
+ else
+ saved_fifo = 0;
+#endif
+
+ /* Handle WHILE FOR CASE etc. with redirections. (Also '&' input
+ redirection.) */
+ if (do_redirections (command->redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
+ {
+ cleanup_redirects (redirection_undo_list);
+ redirection_undo_list = (REDIRECT *)NULL;
+ dispose_exec_redirects ();
+#if defined (PROCESS_SUBSTITUTION)
+ if (saved_fifo)
+ free ((void *)ofifo_list);
+#endif
+ return (last_command_exit_value = EXECUTION_FAILURE);
+ }
+
+ if (redirection_undo_list)
+ {
+ /* XXX - why copy here? */
+ my_undo_list = (REDIRECT *)copy_redirects (redirection_undo_list);
+ dispose_redirects (redirection_undo_list);
+ redirection_undo_list = (REDIRECT *)NULL;
+ }
+ else
+ my_undo_list = (REDIRECT *)NULL;
+
+ if (exec_redirection_undo_list)
+ {
+ /* XXX - why copy here? */
+ exec_undo_list = (REDIRECT *)copy_redirects (exec_redirection_undo_list);
+ dispose_redirects (exec_redirection_undo_list);
+ exec_redirection_undo_list = (REDIRECT *)NULL;
+ }
+ else
+ exec_undo_list = (REDIRECT *)NULL;
+
+ if (my_undo_list || exec_undo_list)
+ begin_unwind_frame ("loop_redirections");
+
+ if (my_undo_list)
+ add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
+
+ if (exec_undo_list)
+ add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
+
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+ QUIT;
+
+ switch (command->type)
+ {
+ case cm_simple:
+ {
+ save_line_number = line_number;
+ /* We can't rely on variables retaining their values across a
+ call to execute_simple_command if a longjmp occurs as the
+ result of a `return' builtin. This is true for sure with gcc. */
+#if defined (RECYCLES_PIDS)
+ last_made_pid = NO_PID;
+#endif
+ last_pid = last_made_pid;
+ was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+
+ if (ignore_return && command->value.Simple)
+ command->value.Simple->flags |= CMD_IGNORE_RETURN;
+ if (command->flags & CMD_STDIN_REDIR)
+ command->value.Simple->flags |= CMD_STDIN_REDIR;
+
+ line_number_for_err_trap = line_number = command->value.Simple->line;
+ exec_result =
+ execute_simple_command (command->value.Simple, pipe_in, pipe_out,
+ asynchronous, fds_to_close);
+ line_number = save_line_number;
+
+ /* The temporary environment should be used for only the simple
+ command immediately following its definition. */
+ dispose_used_env_vars ();
+
+#if (defined (ultrix) && defined (mips)) || defined (C_ALLOCA)
+ /* Reclaim memory allocated with alloca () on machines which
+ may be using the alloca emulation code. */
+ (void) alloca (0);
+#endif /* (ultrix && mips) || C_ALLOCA */
+
+ /* If we forked to do the command, then we must wait_for ()
+ the child. */
+
+ /* XXX - this is something to watch out for if there are problems
+ when the shell is compiled without job control. Don't worry about
+ whether or not last_made_pid == last_pid; already_making_children
+ tells us whether or not there are unwaited-for children to wait
+ for and reap. */
+ if (already_making_children && pipe_out == NO_PIPE)
+ {
+ stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+ if (asynchronous)
+ {
+ DESCRIBE_PID (last_made_pid);
+ exec_result = EXECUTION_SUCCESS;
+ invert = 0; /* async commands always succeed */
+ }
+ else
+#if !defined (JOB_CONTROL)
+ /* Do not wait for asynchronous processes started from
+ startup files. */
+ if (last_made_pid != last_asynchronous_pid)
+#endif
+ /* When executing a shell function that executes other
+ commands, this causes the last simple command in
+ the function to be waited for twice. This also causes
+ subshells forked to execute builtin commands (e.g., in
+ pipelines) to be waited for twice. */
+ exec_result = wait_for (last_made_pid);
+ }
+ }
+
+ /* 2009/02/13 -- pipeline failure is processed elsewhere. This handles
+ only the failure of a simple command. */
+ if (was_error_trap && ignore_return == 0 && invert == 0 && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ line_number = line_number_for_err_trap;
+ run_error_trap ();
+ line_number = save_line_number;
+ }
+
+ if (ignore_return == 0 && invert == 0 &&
+ ((posixly_correct && interactive == 0 && special_builtin_failed) ||
+ (exit_immediately_on_error && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)))
+ {
+ last_command_exit_value = exec_result;
+ run_pending_traps ();
+
+#if 0 /* XXX - bash-4.4 or bash-5.0 */
+ /* Undo redirections before running exit trap on the way out of
+ set -e. Report by Mark Farrell 5/19/2014 */
+ if (exit_immediately_on_error && signal_is_trapped (0) &&
+ unwind_protect_tag_on_stack ("saved-redirects"))
+ run_unwind_frame ("saved-redirects");
+#endif
+
+ jump_to_top_level (ERREXIT);
+ }
+
+ break;
+
+ case cm_for:
+ if (ignore_return)
+ command->value.For->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_for_command (command->value.For);
+ break;
+
+#if defined (ARITH_FOR_COMMAND)
+ case cm_arith_for:
+ if (ignore_return)
+ command->value.ArithFor->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_arith_for_command (command->value.ArithFor);
+ break;
+#endif
+
+#if defined (SELECT_COMMAND)
+ case cm_select:
+ if (ignore_return)
+ command->value.Select->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_select_command (command->value.Select);
+ break;
+#endif
+
+ case cm_case:
+ if (ignore_return)
+ command->value.Case->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_case_command (command->value.Case);
+ break;
+
+ case cm_while:
+ if (ignore_return)
+ command->value.While->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_while_command (command->value.While);
+ break;
+
+ case cm_until:
+ if (ignore_return)
+ command->value.While->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_until_command (command->value.While);
+ break;
+
+ case cm_if:
+ if (ignore_return)
+ command->value.If->flags |= CMD_IGNORE_RETURN;
+ exec_result = execute_if_command (command->value.If);
+ break;
+
+ case cm_group:
+
+ /* This code can be executed from either of two paths: an explicit
+ '{}' command, or via a function call. If we are executed via a
+ function call, we have already taken care of the function being
+ executed in the background (down there in execute_simple_command ()),
+ and this command should *not* be marked as asynchronous. If we
+ are executing a regular '{}' group command, and asynchronous == 1,
+ we must want to execute the whole command in the background, so we
+ need a subshell, and we want the stuff executed in that subshell
+ (this group command) to be executed in the foreground of that
+ subshell (i.e. there will not be *another* subshell forked).
+
+ What we do is to force a subshell if asynchronous, and then call
+ execute_command_internal again with asynchronous still set to 1,
+ but with the original group command, so the printed command will
+ look right.
+
+ The code above that handles forking off subshells will note that
+ both subshell and async are on, and turn off async in the child
+ after forking the subshell (but leave async set in the parent, so
+ the normal call to describe_pid is made). This turning off
+ async is *crucial*; if it is not done, this will fall into an
+ infinite loop of executions through this spot in subshell after
+ subshell until the process limit is exhausted. */
+
+ if (asynchronous)
+ {
+ command->flags |= CMD_FORCE_SUBSHELL;
+ exec_result =
+ execute_command_internal (command, 1, pipe_in, pipe_out,
+ fds_to_close);
+ }
+ else
+ {
+ if (ignore_return && command->value.Group->command)
+ command->value.Group->command->flags |= CMD_IGNORE_RETURN;
+ exec_result =
+ execute_command_internal (command->value.Group->command,
+ asynchronous, pipe_in, pipe_out,
+ fds_to_close);
+ }
+ break;
+
+ case cm_connection:
+ exec_result = execute_connection (command, asynchronous,
+ pipe_in, pipe_out, fds_to_close);
+ if (asynchronous)
+ invert = 0; /* XXX */
+
+ break;
+
+#if defined (DPAREN_ARITHMETIC)
+ case cm_arith:
+ was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+ if (ignore_return)
+ command->value.Arith->flags |= CMD_IGNORE_RETURN;
+ line_number_for_err_trap = save_line_number = line_number;
+ exec_result = execute_arith_command (command->value.Arith);
+ line_number = save_line_number;
+
+ if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ save_line_number = line_number;
+ line_number = line_number_for_err_trap;
+ run_error_trap ();
+ line_number = save_line_number;
+ }
+
+ if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ run_pending_traps ();
+ jump_to_top_level (ERREXIT);
+ }
+
+ break;
+#endif
+
+#if defined (COND_COMMAND)
+ case cm_cond:
+ was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+ if (ignore_return)
+ command->value.Cond->flags |= CMD_IGNORE_RETURN;
+
+ line_number_for_err_trap = save_line_number = line_number;
+ exec_result = execute_cond_command (command->value.Cond);
+ line_number = save_line_number;
+
+ if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ save_line_number = line_number;
+ line_number = line_number_for_err_trap;
+ run_error_trap ();
+ line_number = save_line_number;
+ }
+
+ if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ run_pending_traps ();
+ jump_to_top_level (ERREXIT);
+ }
+
+ break;
+#endif
+
+ case cm_function_def:
+ exec_result = execute_intern_function (command->value.Function_def->name,
+ command->value.Function_def);
+ break;
+
+ default:
+ command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);
+ }
+
+ if (my_undo_list)
+ {
+ do_redirections (my_undo_list, RX_ACTIVE);
+ dispose_redirects (my_undo_list);
+ }
+
+ if (exec_undo_list)
+ dispose_redirects (exec_undo_list);
+
+ if (my_undo_list || exec_undo_list)
+ discard_unwind_frame ("loop_redirections");
+
+#if defined (PROCESS_SUBSTITUTION)
+ if (saved_fifo)
+ {
+ nfifo = num_fifos ();
+ if (nfifo > ofifo)
+ close_new_fifos ((char *)ofifo_list, osize);
+ free ((void *)ofifo_list);
+ }
+#endif
+
+ /* Invert the return value if we have to */
+ if (invert)
+ exec_result = (exec_result == EXECUTION_SUCCESS)
+ ? EXECUTION_FAILURE
+ : EXECUTION_SUCCESS;
+
+#if defined (DPAREN_ARITHMETIC) || defined (COND_COMMAND)
+ /* This is where we set PIPESTATUS from the exit status of the appropriate
+ compound commands (the ones that look enough like simple commands to
+ cause confusion). We might be able to optimize by not doing this if
+ subshell_environment != 0. */
+ switch (command->type)
+ {
+# if defined (DPAREN_ARITHMETIC)
+ case cm_arith:
+# endif
+# if defined (COND_COMMAND)
+ case cm_cond:
+# endif
+ set_pipestatus_from_exit (exec_result);
+ break;
+ }
+#endif
+
+ last_command_exit_value = exec_result;
+ run_pending_traps ();
+#if 0
+ if (running_trap == 0)
+#endif
+ currently_executing_command = (COMMAND *)NULL;
+
+ return (last_command_exit_value);
+}
+
+#if defined (COMMAND_TIMING)
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+extern struct timeval *difftimeval __P((struct timeval *, struct timeval *, struct timeval *));
+extern struct timeval *addtimeval __P((struct timeval *, struct timeval *, struct timeval *));
+extern int timeval_to_cpu __P((struct timeval *, struct timeval *, struct timeval *));
+#endif
+
+#define POSIX_TIMEFORMAT "real %2R\nuser %2U\nsys %2S"
+#define BASH_TIMEFORMAT "\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS"
+
+static const int precs[] = { 0, 100, 10, 1 };
+
+#if defined (HAVE_LOCALE_H) && defined (HAVE_LOCALECONV)
+static int
+decpoint ()
+{
+ struct lconv *lv;
+
+ lv = localeconv ();
+ return (lv && lv->decimal_point && lv->decimal_point[0]) ? lv->decimal_point[0] : '.';
+}
+#else
+# define decpoint() '.'
+#endif
+
+/* Expand one `%'-prefixed escape sequence from a time format string. */
+static int
+mkfmt (buf, prec, lng, sec, sec_fraction)
+ char *buf;
+ int prec, lng;
+ time_t sec;
+ int sec_fraction;
+{
+ time_t min;
+ char abuf[INT_STRLEN_BOUND(time_t) + 1];
+ int ind, aind;
+
+ ind = 0;
+ abuf[sizeof(abuf) - 1] = '\0';
+
+ /* If LNG is non-zero, we want to decompose SEC into minutes and seconds. */
+ if (lng)
+ {
+ min = sec / 60;
+ sec %= 60;
+ aind = sizeof(abuf) - 2;
+ do
+ abuf[aind--] = (min % 10) + '0';
+ while (min /= 10);
+ aind++;
+ while (abuf[aind])
+ buf[ind++] = abuf[aind++];
+ buf[ind++] = 'm';
+ }
+
+ /* Now add the seconds. */
+ aind = sizeof (abuf) - 2;
+ do
+ abuf[aind--] = (sec % 10) + '0';
+ while (sec /= 10);
+ aind++;
+ while (abuf[aind])
+ buf[ind++] = abuf[aind++];
+
+ /* We want to add a decimal point and PREC places after it if PREC is
+ nonzero. PREC is not greater than 3. SEC_FRACTION is between 0
+ and 999. */
+ if (prec != 0)
+ {
+ buf[ind++] = decpoint ();
+ for (aind = 1; aind <= prec; aind++)
+ {
+ buf[ind++] = (sec_fraction / precs[aind]) + '0';
+ sec_fraction %= precs[aind];
+ }
+ }
+
+ if (lng)
+ buf[ind++] = 's';
+ buf[ind] = '\0';
+
+ return (ind);
+}
+
+/* Interpret the format string FORMAT, interpolating the following escape
+ sequences:
+ %[prec][l][RUS]
+
+ where the optional `prec' is a precision, meaning the number of
+ characters after the decimal point, the optional `l' means to format
+ using minutes and seconds (MMmNN[.FF]s), like the `times' builtin',
+ and the last character is one of
+
+ R number of seconds of `real' time
+ U number of seconds of `user' time
+ S number of seconds of `system' time
+
+ An occurrence of `%%' in the format string is translated to a `%'. The
+ result is printed to FP, a pointer to a FILE. The other variables are
+ the seconds and thousandths of a second of real, user, and system time,
+ resectively. */
+static void
+print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
+ FILE *fp;
+ char *format;
+ time_t rs;
+ int rsf;
+ time_t us;
+ int usf;
+ time_t ss;
+ int ssf, cpu;
+{
+ int prec, lng, len;
+ char *str, *s, ts[INT_STRLEN_BOUND (time_t) + sizeof ("mSS.FFFF")];
+ time_t sum;
+ int sum_frac;
+ int sindex, ssize;
+
+ len = strlen (format);
+ ssize = (len + 64) - (len % 64);
+ str = (char *)xmalloc (ssize);
+ sindex = 0;
+
+ for (s = format; *s; s++)
+ {
+ if (*s != '%' || s[1] == '\0')
+ {
+ RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
+ str[sindex++] = *s;
+ }
+ else if (s[1] == '%')
+ {
+ s++;
+ RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
+ str[sindex++] = *s;
+ }
+ else if (s[1] == 'P')
+ {
+ s++;
+#if 0
+ /* clamp CPU usage at 100% */
+ if (cpu > 10000)
+ cpu = 10000;
+#endif
+ sum = cpu / 100;
+ sum_frac = (cpu % 100) * 10;
+ len = mkfmt (ts, 2, 0, sum, sum_frac);
+ RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
+ strcpy (str + sindex, ts);
+ sindex += len;
+ }
+ else
+ {
+ prec = 3; /* default is three places past the decimal point. */
+ lng = 0; /* default is to not use minutes or append `s' */
+ s++;
+ if (DIGIT (*s)) /* `precision' */
+ {
+ prec = *s++ - '0';
+ if (prec > 3) prec = 3;
+ }
+ if (*s == 'l') /* `length extender' */
+ {
+ lng = 1;
+ s++;
+ }
+ if (*s == 'R' || *s == 'E')
+ len = mkfmt (ts, prec, lng, rs, rsf);
+ else if (*s == 'U')
+ len = mkfmt (ts, prec, lng, us, usf);
+ else if (*s == 'S')
+ len = mkfmt (ts, prec, lng, ss, ssf);
+ else
+ {
+ internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);
+ free (str);
+ return;
+ }
+ RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
+ strcpy (str + sindex, ts);
+ sindex += len;
+ }
+ }
+
+ str[sindex] = '\0';
+ fprintf (fp, "%s\n", str);
+ fflush (fp);
+
+ free (str);
+}
+
+static int
+time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+ COMMAND *command;
+ int asynchronous, pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ int rv, posix_time, old_flags, nullcmd;
+ time_t rs, us, ss;
+ int rsf, usf, ssf;
+ int cpu;
+ char *time_format;
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+ struct timeval real, user, sys;
+ struct timeval before, after;
+# if defined (HAVE_STRUCT_TIMEZONE)
+ struct timezone dtz; /* posix doesn't define this */
+# endif
+ struct rusage selfb, selfa, kidsb, kidsa; /* a = after, b = before */
+#else
+# if defined (HAVE_TIMES)
+ clock_t tbefore, tafter, real, user, sys;
+ struct tms before, after;
+# endif
+#endif
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+# if defined (HAVE_STRUCT_TIMEZONE)
+ gettimeofday (&before, &dtz);
+# else
+ gettimeofday (&before, (void *)NULL);
+# endif /* !HAVE_STRUCT_TIMEZONE */
+ getrusage (RUSAGE_SELF, &selfb);
+ getrusage (RUSAGE_CHILDREN, &kidsb);
+#else
+# if defined (HAVE_TIMES)
+ tbefore = times (&before);
+# endif
+#endif
+
+ posix_time = command && (command->flags & CMD_TIME_POSIX);
+
+ nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);
+ if (posixly_correct && nullcmd)
+ {
+#if defined (HAVE_GETRUSAGE)
+ selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;
+ selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;
+ before.tv_sec = shell_start_time;
+ before.tv_usec = 0;
+#else
+ before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;
+ tbefore = shell_start_time;
+#endif
+ }
+
+ old_flags = command->flags;
+ command->flags &= ~(CMD_TIME_PIPELINE|CMD_TIME_POSIX);
+ rv = execute_command_internal (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+ command->flags = old_flags;
+
+ rs = us = ss = 0;
+ rsf = usf = ssf = cpu = 0;
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+# if defined (HAVE_STRUCT_TIMEZONE)
+ gettimeofday (&after, &dtz);
+# else
+ gettimeofday (&after, (void *)NULL);
+# endif /* !HAVE_STRUCT_TIMEZONE */
+ getrusage (RUSAGE_SELF, &selfa);
+ getrusage (RUSAGE_CHILDREN, &kidsa);
+
+ difftimeval (&real, &before, &after);
+ timeval_to_secs (&real, &rs, &rsf);
+
+ addtimeval (&user, difftimeval(&after, &selfb.ru_utime, &selfa.ru_utime),
+ difftimeval(&before, &kidsb.ru_utime, &kidsa.ru_utime));
+ timeval_to_secs (&user, &us, &usf);
+
+ addtimeval (&sys, difftimeval(&after, &selfb.ru_stime, &selfa.ru_stime),
+ difftimeval(&before, &kidsb.ru_stime, &kidsa.ru_stime));
+ timeval_to_secs (&sys, &ss, &ssf);
+
+ cpu = timeval_to_cpu (&real, &user, &sys);
+#else
+# if defined (HAVE_TIMES)
+ tafter = times (&after);
+
+ real = tafter - tbefore;
+ clock_t_to_secs (real, &rs, &rsf);
+
+ user = (after.tms_utime - before.tms_utime) + (after.tms_cutime - before.tms_cutime);
+ clock_t_to_secs (user, &us, &usf);
+
+ sys = (after.tms_stime - before.tms_stime) + (after.tms_cstime - before.tms_cstime);
+ clock_t_to_secs (sys, &ss, &ssf);
+
+ cpu = (real == 0) ? 0 : ((user + sys) * 10000) / real;
+
+# else
+ rs = us = ss = 0;
+ rsf = usf = ssf = cpu = 0;
+# endif
+#endif
+
+ if (posix_time)
+ time_format = POSIX_TIMEFORMAT;
+ else if ((time_format = get_string_value ("TIMEFORMAT")) == 0)
+ {
+ if (posixly_correct && nullcmd)
+ time_format = "user\t%2lU\nsys\t%2lS";
+ else
+ time_format = BASH_TIMEFORMAT;
+ }
+ if (time_format && *time_format)
+ print_formatted_time (stderr, time_format, rs, rsf, us, usf, ss, ssf, cpu);
+
+ return rv;
+}
+#endif /* COMMAND_TIMING */
+
+/* Execute a command that's supposed to be in a subshell. This must be
+ called after make_child and we must be running in the child process.
+ The caller will return or exit() immediately with the value this returns. */
+static int
+execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+ COMMAND *command;
+ int asynchronous;
+ int pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ int user_subshell, return_code, function_value, should_redir_stdin, invert;
+ int ois, user_coproc;
+ int result;
+ volatile COMMAND *tcom;
+
+ USE_VAR(user_subshell);
+ USE_VAR(user_coproc);
+ USE_VAR(invert);
+ USE_VAR(tcom);
+ USE_VAR(asynchronous);
+
+ subshell_level++;
+ should_redir_stdin = (asynchronous && (command->flags & CMD_STDIN_REDIR) &&
+ pipe_in == NO_PIPE &&
+ stdin_redirects (command->redirects) == 0);
+
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+ user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
+ user_coproc = command->type == cm_coproc;
+
+ command->flags &= ~(CMD_FORCE_SUBSHELL | CMD_WANT_SUBSHELL | CMD_INVERT_RETURN);
+
+ /* If a command is asynchronous in a subshell (like ( foo ) & or
+ the special case of an asynchronous GROUP command where the
+ the subshell bit is turned on down in case cm_group: below),
+ turn off `asynchronous', so that two subshells aren't spawned.
+ XXX - asynchronous used to be set to 0 in this block, but that
+ means that setup_async_signals was never run. Now it's set to
+ 0 after subshell_environment is set appropriately and setup_async_signals
+ is run.
+
+ This seems semantically correct to me. For example,
+ ( foo ) & seems to say ``do the command `foo' in a subshell
+ environment, but don't wait for that subshell to finish'',
+ and "{ foo ; bar ; } &" seems to me to be like functions or
+ builtins in the background, which executed in a subshell
+ environment. I just don't see the need to fork two subshells. */
+
+ /* Don't fork again, we are already in a subshell. A `doubly
+ async' shell is not interactive, however. */
+ if (asynchronous)
+ {
+#if defined (JOB_CONTROL)
+ /* If a construct like ( exec xxx yyy ) & is given while job
+ control is active, we want to prevent exec from putting the
+ subshell back into the original process group, carefully
+ undoing all the work we just did in make_child. */
+ original_pgrp = -1;
+#endif /* JOB_CONTROL */
+ ois = interactive_shell;
+ interactive_shell = 0;
+ /* This test is to prevent alias expansion by interactive shells that
+ run `(command) &' but to allow scripts that have enabled alias
+ expansion with `shopt -s expand_alias' to continue to expand
+ aliases. */
+ if (ois != interactive_shell)
+ expand_aliases = 0;
+ }
+
+ /* Subshells are neither login nor interactive. */
+ login_shell = interactive = 0;
+
+ if (user_subshell)
+ subshell_environment = SUBSHELL_PAREN; /* XXX */
+ else
+ {
+ subshell_environment = 0; /* XXX */
+ if (asynchronous)
+ subshell_environment |= SUBSHELL_ASYNC;
+ if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+ subshell_environment |= SUBSHELL_PIPE;
+ if (user_coproc)
+ subshell_environment |= SUBSHELL_COPROC;
+ }
+
+ reset_terminating_signals (); /* in sig.c */
+ /* Cancel traps, in trap.c. */
+ /* Reset the signal handlers in the child, but don't free the
+ trap strings. Set a flag noting that we have to free the
+ trap strings if we run trap to change a signal disposition. */
+ reset_signal_handlers ();
+ subshell_environment |= SUBSHELL_RESETTRAP;
+
+ /* Make sure restore_original_signals doesn't undo the work done by
+ make_child to ensure that asynchronous children are immune to SIGINT
+ and SIGQUIT. Turn off asynchronous to make sure more subshells are
+ not spawned. */
+ if (asynchronous)
+ {
+ setup_async_signals ();
+ asynchronous = 0;
+ }
+
+#if defined (JOB_CONTROL)
+ set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+ set_sigint_handler ();
+
+#if defined (JOB_CONTROL)
+ /* Delete all traces that there were any jobs running. This is
+ only for subshells. */
+ without_job_control ();
+#endif /* JOB_CONTROL */
+
+ if (fds_to_close)
+ close_fd_bitmap (fds_to_close);
+
+ do_piping (pipe_in, pipe_out);
+
+#if defined (COPROCESS_SUPPORT)
+ coproc_closeall ();
+#endif
+
+ /* If this is a user subshell, set a flag if stdin was redirected.
+ This is used later to decide whether to redirect fd 0 to
+ /dev/null for async commands in the subshell. This adds more
+ sh compatibility, but I'm not sure it's the right thing to do. */
+ if (user_subshell)
+ {
+ stdin_redir = stdin_redirects (command->redirects);
+ restore_default_signal (EXIT_TRAP);
+ }
+
+ /* If this is an asynchronous command (command &), we want to
+ redirect the standard input from /dev/null in the absence of
+ any specific redirection involving stdin. */
+ if (should_redir_stdin && stdin_redir == 0)
+ async_redirect_stdin ();
+
+ /* Do redirections, then dispose of them before recursive call. */
+ if (command->redirects)
+ {
+ if (do_redirections (command->redirects, RX_ACTIVE) != 0)
+ exit (invert ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
+
+ dispose_redirects (command->redirects);
+ command->redirects = (REDIRECT *)NULL;
+ }
+
+ if (command->type == cm_subshell)
+ tcom = command->value.Subshell->command;
+ else if (user_coproc)
+ tcom = command->value.Coproc->command;
+ else
+ tcom = command;
+
+ if (command->flags & CMD_TIME_PIPELINE)
+ tcom->flags |= CMD_TIME_PIPELINE;
+ if (command->flags & CMD_TIME_POSIX)
+ tcom->flags |= CMD_TIME_POSIX;
+
+ /* Make sure the subshell inherits any CMD_IGNORE_RETURN flag. */
+ if ((command->flags & CMD_IGNORE_RETURN) && tcom != command)
+ tcom->flags |= CMD_IGNORE_RETURN;
+
+ /* If this is a simple command, tell execute_disk_command that it
+ might be able to get away without forking and simply exec.
+ This means things like ( sleep 10 ) will only cause one fork.
+ If we're timing the command or inverting its return value, however,
+ we cannot do this optimization. */
+ if ((user_subshell || user_coproc) && (tcom->type == cm_simple || tcom->type == cm_subshell) &&
+ ((tcom->flags & CMD_TIME_PIPELINE) == 0) &&
+ ((tcom->flags & CMD_INVERT_RETURN) == 0))
+ {
+ tcom->flags |= CMD_NO_FORK;
+ if (tcom->type == cm_simple)
+ tcom->value.Simple->flags |= CMD_NO_FORK;
+ }
+
+ invert = (tcom->flags & CMD_INVERT_RETURN) != 0;
+ tcom->flags &= ~CMD_INVERT_RETURN;
+
+ result = setjmp_nosigs (top_level);
+
+ /* If we're inside a function while executing this subshell, we
+ need to handle a possible `return'. */
+ function_value = 0;
+ if (return_catch_flag)
+ function_value = setjmp_nosigs (return_catch);
+
+ /* If we're going to exit the shell, we don't want to invert the return
+ status. */
+ if (result == EXITPROG)
+ invert = 0, return_code = last_command_exit_value;
+ else if (result)
+ return_code = (last_command_exit_value == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : last_command_exit_value;
+ else if (function_value)
+ return_code = return_catch_value;
+ else
+ return_code = execute_command_internal ((COMMAND *)tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
+
+ /* If we are asked to, invert the return value. */
+ if (invert)
+ return_code = (return_code == EXECUTION_SUCCESS) ? EXECUTION_FAILURE
+ : EXECUTION_SUCCESS;
+
+ /* If we were explicitly placed in a subshell with (), we need
+ to do the `shell cleanup' things, such as running traps[0]. */
+ if (user_subshell && signal_is_trapped (0))
+ {
+ last_command_exit_value = return_code;
+ return_code = run_exit_trap ();
+ }
+
+ subshell_level--;
+ return (return_code);
+ /* NOTREACHED */
+}
+
+#if defined (COPROCESS_SUPPORT)
+#define COPROC_MAX 16
+
+typedef struct cpelement
+ {
+ struct cpelement *next;
+ struct coproc *coproc;
+ }
+cpelement_t;
+
+typedef struct cplist
+ {
+ struct cpelement *head;
+ struct cpelement *tail;
+ int ncoproc;
+ int lock;
+ }
+cplist_t;
+
+static struct cpelement *cpe_alloc __P((struct coproc *));
+static void cpe_dispose __P((struct cpelement *));
+static struct cpelement *cpl_add __P((struct coproc *));
+static struct cpelement *cpl_delete __P((pid_t));
+static void cpl_reap __P((void));
+static void cpl_flush __P((void));
+static void cpl_closeall __P((void));
+static struct cpelement *cpl_search __P((pid_t));
+static struct cpelement *cpl_searchbyname __P((const char *));
+static void cpl_prune __P((void));
+
+static void coproc_free __P((struct coproc *));
+
+/* Will go away when there is fully-implemented support for multiple coprocs. */
+Coproc sh_coproc = { 0, NO_PID, -1, -1, 0, 0, 0, 0, 0 };
+
+cplist_t coproc_list = {0, 0, 0};
+
+/* Functions to manage the list of coprocs */
+
+static struct cpelement *
+cpe_alloc (cp)
+ Coproc *cp;
+{
+ struct cpelement *cpe;
+
+ cpe = (struct cpelement *)xmalloc (sizeof (struct cpelement));
+ cpe->coproc = cp;
+ cpe->next = (struct cpelement *)0;
+ return cpe;
+}
+
+static void
+cpe_dispose (cpe)
+ struct cpelement *cpe;
+{
+ free (cpe);
+}
+
+static struct cpelement *
+cpl_add (cp)
+ Coproc *cp;
+{
+ struct cpelement *cpe;
+
+ cpe = cpe_alloc (cp);
+
+ if (coproc_list.head == 0)
+ {
+ coproc_list.head = coproc_list.tail = cpe;
+ coproc_list.ncoproc = 0; /* just to make sure */
+ }
+ else
+ {
+ coproc_list.tail->next = cpe;
+ coproc_list.tail = cpe;
+ }
+ coproc_list.ncoproc++;
+
+ return cpe;
+}
+
+static struct cpelement *
+cpl_delete (pid)
+ pid_t pid;
+{
+ struct cpelement *prev, *p;
+
+ for (prev = p = coproc_list.head; p; prev = p, p = p->next)
+ if (p->coproc->c_pid == pid)
+ {
+ prev->next = p->next; /* remove from list */
+ break;
+ }
+
+ if (p == 0)
+ return 0; /* not found */
+
+#if defined (DEBUG)
+ itrace("cpl_delete: deleting %d", pid);
+#endif
+
+ /* Housekeeping in the border cases. */
+ if (p == coproc_list.head)
+ coproc_list.head = coproc_list.head->next;
+ else if (p == coproc_list.tail)
+ coproc_list.tail = prev;
+
+ coproc_list.ncoproc--;
+ if (coproc_list.ncoproc == 0)
+ coproc_list.head = coproc_list.tail = 0;
+ else if (coproc_list.ncoproc == 1)
+ coproc_list.tail = coproc_list.head; /* just to make sure */
+
+ return (p);
+}
+
+static void
+cpl_reap ()
+{
+ struct cpelement *p, *next, *nh, *nt;
+
+ /* Build a new list by removing dead coprocs and fix up the coproc_list
+ pointers when done. */
+ nh = nt = next = (struct cpelement *)0;
+ for (p = coproc_list.head; p; p = next)
+ {
+ next = p->next;
+ if (p->coproc->c_flags & COPROC_DEAD)
+ {
+ coproc_list.ncoproc--; /* keep running count, fix up pointers later */
+
+#if defined (DEBUG)
+ itrace("cpl_reap: deleting %d", p->coproc->c_pid);
+#endif
+
+ coproc_dispose (p->coproc);
+ cpe_dispose (p);
+ }
+ else if (nh == 0)
+ nh = nt = p;
+ else
+ {
+ nt->next = p;
+ nt = nt->next;
+ }
+ }
+
+ if (coproc_list.ncoproc == 0)
+ coproc_list.head = coproc_list.tail = 0;
+ else
+ {
+ if (nt)
+ nt->next = 0;
+ coproc_list.head = nh;
+ coproc_list.tail = nt;
+ if (coproc_list.ncoproc == 1)
+ coproc_list.tail = coproc_list.head; /* just to make sure */
+ }
+}
+
+/* Clear out the list of saved statuses */
+static void
+cpl_flush ()
+{
+ struct cpelement *cpe, *p;
+
+ for (cpe = coproc_list.head; cpe; )
+ {
+ p = cpe;
+ cpe = cpe->next;
+
+ coproc_dispose (p->coproc);
+ cpe_dispose (p);
+ }
+
+ coproc_list.head = coproc_list.tail = 0;
+ coproc_list.ncoproc = 0;
+}
+
+static void
+cpl_closeall ()
+{
+ struct cpelement *cpe;
+
+ for (cpe = coproc_list.head; cpe; cpe = cpe->next)
+ coproc_close (cpe->coproc);
+}
+
+static void
+cpl_fdchk (fd)
+ int fd;
+{
+ struct cpelement *cpe;
+
+ for (cpe = coproc_list.head; cpe; cpe = cpe->next)
+ coproc_checkfd (cpe->coproc, fd);
+}
+
+/* Search for PID in the list of coprocs; return the cpelement struct if
+ found. If not found, return NULL. */
+static struct cpelement *
+cpl_search (pid)
+ pid_t pid;
+{
+ struct cpelement *cpe;
+
+ for (cpe = coproc_list.head ; cpe; cpe = cpe->next)
+ if (cpe->coproc->c_pid == pid)
+ return cpe;
+ return (struct cpelement *)NULL;
+}
+
+/* Search for the coproc named NAME in the list of coprocs; return the
+ cpelement struct if found. If not found, return NULL. */
+static struct cpelement *
+cpl_searchbyname (name)
+ const char *name;
+{
+ struct cpelement *cp;
+
+ for (cp = coproc_list.head ; cp; cp = cp->next)
+ if (STREQ (cp->coproc->c_name, name))
+ return cp;
+ return (struct cpelement *)NULL;
+}
+
+#if 0
+static void
+cpl_prune ()
+{
+ struct cpelement *cp;
+
+ while (coproc_list.head && coproc_list.ncoproc > COPROC_MAX)
+ {
+ cp = coproc_list.head;
+ coproc_list.head = coproc_list.head->next;
+ coproc_dispose (cp->coproc);
+ cpe_dispose (cp);
+ coproc_list.ncoproc--;
+ }
+}
+#endif
+
+/* These currently use a single global "shell coproc" but are written in a
+ way to not preclude additional coprocs later (using the list management
+ package above). */
+
+struct coproc *
+getcoprocbypid (pid)
+ pid_t pid;
+{
+#if MULTIPLE_COPROCS
+ struct cpelement *p;
+
+ p = cpl_search (pid);
+ return (p ? p->coproc : 0);
+#else
+ return (pid == sh_coproc.c_pid ? &sh_coproc : 0);
+#endif
+}
+
+struct coproc *
+getcoprocbyname (name)
+ const char *name;
+{
+#if MULTIPLE_COPROCS
+ struct cpelement *p;
+
+ p = cpl_searchbyname (name);
+ return (p ? p->coproc : 0);
+#else
+ return ((sh_coproc.c_name && STREQ (sh_coproc.c_name, name)) ? &sh_coproc : 0);
+#endif
+}
+
+void
+coproc_init (cp)
+ struct coproc *cp;
+{
+ cp->c_name = 0;
+ cp->c_pid = NO_PID;
+ cp->c_rfd = cp->c_wfd = -1;
+ cp->c_rsave = cp->c_wsave = -1;
+ cp->c_flags = cp->c_status = cp->c_lock = 0;
+}
+
+struct coproc *
+coproc_alloc (name, pid)
+ char *name;
+ pid_t pid;
+{
+ struct coproc *cp;
+
+#if MULTIPLE_COPROCS
+ cp = (struct coproc *)xmalloc (sizeof (struct coproc));
+#else
+ cp = &sh_coproc;
+#endif
+ coproc_init (cp);
+ cp->c_lock = 2;
+
+ cp->c_pid = pid;
+ cp->c_name = savestring (name);
+#if MULTIPLE_COPROCS
+ cpl_add (cp);
+#endif
+ cp->c_lock = 0;
+ return (cp);
+}
+
+static void
+coproc_free (cp)
+ struct coproc *cp;
+{
+ free (cp);
+}
+
+void
+coproc_dispose (cp)
+ struct coproc *cp;
+{
+ sigset_t set, oset;
+
+ if (cp == 0)
+ return;
+
+ BLOCK_SIGNAL (SIGCHLD, set, oset);
+ cp->c_lock = 3;
+ coproc_unsetvars (cp);
+ FREE (cp->c_name);
+ coproc_close (cp);
+#if MULTIPLE_COPROCS
+ coproc_free (cp);
+#else
+ coproc_init (cp);
+ cp->c_lock = 0;
+#endif
+ UNBLOCK_SIGNAL (oset);
+}
+
+/* Placeholder for now. Will require changes for multiple coprocs */
+void
+coproc_flush ()
+{
+#if MULTIPLE_COPROCS
+ cpl_flush ();
+#else
+ coproc_dispose (&sh_coproc);
+#endif
+}
+
+void
+coproc_close (cp)
+ struct coproc *cp;
+{
+ if (cp->c_rfd >= 0)
+ {
+ close (cp->c_rfd);
+ cp->c_rfd = -1;
+ }
+ if (cp->c_wfd >= 0)
+ {
+ close (cp->c_wfd);
+ cp->c_wfd = -1;
+ }
+ cp->c_rsave = cp->c_wsave = -1;
+}
+
+void
+coproc_closeall ()
+{
+#if MULTIPLE_COPROCS
+ cpl_closeall ();
+#else
+ coproc_close (&sh_coproc); /* XXX - will require changes for multiple coprocs */
+#endif
+}
+
+void
+coproc_reap ()
+{
+#if MULTIPLE_COPROCS
+ cpl_reap ();
+#else
+ struct coproc *cp;
+
+ cp = &sh_coproc; /* XXX - will require changes for multiple coprocs */
+ if (cp && (cp->c_flags & COPROC_DEAD))
+ coproc_dispose (cp);
+#endif
+}
+
+void
+coproc_rclose (cp, fd)
+ struct coproc *cp;
+ int fd;
+{
+ if (cp->c_rfd >= 0 && cp->c_rfd == fd)
+ {
+ close (cp->c_rfd);
+ cp->c_rfd = -1;
+ }
+}
+
+void
+coproc_wclose (cp, fd)
+ struct coproc *cp;
+ int fd;
+{
+ if (cp->c_wfd >= 0 && cp->c_wfd == fd)
+ {
+ close (cp->c_wfd);
+ cp->c_wfd = -1;
+ }
+}
+
+void
+coproc_checkfd (cp, fd)
+ struct coproc *cp;
+ int fd;
+{
+ int update;
+
+ update = 0;
+ if (cp->c_rfd >= 0 && cp->c_rfd == fd)
+ update = cp->c_rfd = -1;
+ if (cp->c_wfd >= 0 && cp->c_wfd == fd)
+ update = cp->c_wfd = -1;
+ if (update)
+ coproc_setvars (cp);
+}
+
+void
+coproc_fdchk (fd)
+ int fd;
+{
+#if MULTIPLE_COPROCS
+ cpl_fdchk (fd);
+#else
+ coproc_checkfd (&sh_coproc, fd);
+#endif
+}
+
+void
+coproc_fdclose (cp, fd)
+ struct coproc *cp;
+ int fd;
+{
+ coproc_rclose (cp, fd);
+ coproc_wclose (cp, fd);
+ coproc_setvars (cp);
+}
+
+void
+coproc_fdsave (cp)
+ struct coproc *cp;
+{
+ cp->c_rsave = cp->c_rfd;
+ cp->c_wsave = cp->c_wfd;
+}
+
+void
+coproc_fdrestore (cp)
+ struct coproc *cp;
+{
+ cp->c_rfd = cp->c_rsave;
+ cp->c_wfd = cp->c_wsave;
+}
+
+void
+coproc_pidchk (pid, status)
+ pid_t pid;
+{
+ struct coproc *cp;
+
+#if MULTIPLE_COPROCS
+ struct cpelement *cpe;
+
+ cpe = cpl_delete (pid);
+ cp = cpe ? cpe->coproc : 0;
+#else
+ cp = getcoprocbypid (pid);
+#endif
+ if (cp)
+ {
+ cp->c_lock = 4;
+ cp->c_status = status;
+ cp->c_flags |= COPROC_DEAD;
+ cp->c_flags &= ~COPROC_RUNNING;
+ /* Don't dispose the coproc or unset the COPROC_XXX variables because
+ this is executed in a signal handler context. Wait until coproc_reap
+ takes care of it. */
+ cp->c_lock = 0;
+ }
+}
+
+void
+coproc_setvars (cp)
+ struct coproc *cp;
+{
+ SHELL_VAR *v;
+ char *namevar, *t;
+ int l;
+#if defined (ARRAY_VARS)
+ arrayind_t ind;
+#endif
+
+ if (cp->c_name == 0)
+ return;
+
+ l = strlen (cp->c_name);
+ namevar = xmalloc (l + 16);
+
+#if defined (ARRAY_VARS)
+ v = find_variable (cp->c_name);
+ if (v == 0)
+ v = make_new_array_variable (cp->c_name);
+ if (array_p (v) == 0)
+ v = convert_var_to_array (v);
+
+ t = itos (cp->c_rfd);
+ ind = 0;
+ v = bind_array_variable (cp->c_name, ind, t, 0);
+ free (t);
+
+ t = itos (cp->c_wfd);
+ ind = 1;
+ bind_array_variable (cp->c_name, ind, t, 0);
+ free (t);
+#else
+ sprintf (namevar, "%s_READ", cp->c_name);
+ t = itos (cp->c_rfd);
+ bind_variable (namevar, t, 0);
+ free (t);
+ sprintf (namevar, "%s_WRITE", cp->c_name);
+ t = itos (cp->c_wfd);
+ bind_variable (namevar, t, 0);
+ free (t);
+#endif
+
+ sprintf (namevar, "%s_PID", cp->c_name);
+ t = itos (cp->c_pid);
+ bind_variable (namevar, t, 0);
+ free (t);
+
+ free (namevar);
+}
+
+void
+coproc_unsetvars (cp)
+ struct coproc *cp;
+{
+ int l;
+ char *namevar;
+
+ if (cp->c_name == 0)
+ return;
+
+ l = strlen (cp->c_name);
+ namevar = xmalloc (l + 16);
+
+ sprintf (namevar, "%s_PID", cp->c_name);
+ unbind_variable (namevar);
+
+#if defined (ARRAY_VARS)
+ unbind_variable (cp->c_name);
+#else
+ sprintf (namevar, "%s_READ", cp->c_name);
+ unbind_variable (namevar);
+ sprintf (namevar, "%s_WRITE", cp->c_name);
+ unbind_variable (namevar);
+#endif
+
+ free (namevar);
+}
+
+static int
+execute_coproc (command, pipe_in, pipe_out, fds_to_close)
+ COMMAND *command;
+ int pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ int rpipe[2], wpipe[2], estat, invert;
+ pid_t coproc_pid;
+ Coproc *cp;
+ char *tcmd;
+ sigset_t set, oset;
+
+ /* XXX -- can be removed after changes to handle multiple coprocs */
+#if !MULTIPLE_COPROCS
+ if (sh_coproc.c_pid != NO_PID)
+ internal_warning ("execute_coproc: coproc [%d:%s] still exists", sh_coproc.c_pid, sh_coproc.c_name);
+ coproc_init (&sh_coproc);
+#endif
+
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+ command_string_index = 0;
+ tcmd = make_command_string (command);
+
+ sh_openpipe ((int *)&rpipe); /* 0 = parent read, 1 = child write */
+ sh_openpipe ((int *)&wpipe); /* 0 = child read, 1 = parent write */
+
+ BLOCK_SIGNAL (SIGCHLD, set, oset);
+
+ coproc_pid = make_child (savestring (tcmd), 1);
+
+ if (coproc_pid == 0)
+ {
+ close (rpipe[0]);
+ close (wpipe[1]);
+
+ UNBLOCK_SIGNAL (oset);
+ estat = execute_in_subshell (command, 1, wpipe[0], rpipe[1], fds_to_close);
+
+ fflush (stdout);
+ fflush (stderr);
+
+ exit (estat);
+ }
+
+ close (rpipe[1]);
+ close (wpipe[0]);
+
+ /* XXX - possibly run Coproc->name through word expansion? */
+ cp = coproc_alloc (command->value.Coproc->name, coproc_pid);
+ cp->c_rfd = rpipe[0];
+ cp->c_wfd = wpipe[1];
+
+ SET_CLOSE_ON_EXEC (cp->c_rfd);
+ SET_CLOSE_ON_EXEC (cp->c_wfd);
+
+ coproc_setvars (cp);
+
+ UNBLOCK_SIGNAL (oset);
+
+#if 0
+ itrace ("execute_coproc: [%d] %s", coproc_pid, the_printed_command);
+#endif
+
+ close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+ unlink_fifo_list ();
+#endif
+ stop_pipeline (1, (COMMAND *)NULL);
+ DESCRIBE_PID (coproc_pid);
+ run_pending_traps ();
+
+ return (invert ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
+}
+#endif
+
+static void
+restore_stdin (s)
+ int s;
+{
+ dup2 (s, 0);
+ close (s);
+}
+
+/* Catch-all cleanup function for lastpipe code for unwind-protects */
+static void
+lastpipe_cleanup (s)
+ int s;
+{
+ unfreeze_jobs_list ();
+}
+
+static int
+execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+ COMMAND *command;
+ int asynchronous, pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ int prev, fildes[2], new_bitmap_size, dummyfd, ignore_return, exec_result;
+ int lstdin, lastpipe_flag, lastpipe_jid;
+ COMMAND *cmd;
+ struct fd_bitmap *fd_bitmap;
+ pid_t lastpid;
+
+#if defined (JOB_CONTROL)
+ sigset_t set, oset;
+ BLOCK_CHILD (set, oset);
+#endif /* JOB_CONTROL */
+
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+ prev = pipe_in;
+ cmd = command;
+
+ while (cmd && cmd->type == cm_connection &&
+ cmd->value.Connection && cmd->value.Connection->connector == '|')
+ {
+ /* Make a pipeline between the two commands. */
+ if (pipe (fildes) < 0)
+ {
+ sys_error (_("pipe error"));
+#if defined (JOB_CONTROL)
+ terminate_current_pipeline ();
+ kill_current_pipeline ();
+ UNBLOCK_CHILD (oset);
+#endif /* JOB_CONTROL */
+ last_command_exit_value = EXECUTION_FAILURE;
+ /* The unwind-protects installed below will take care
+ of closing all of the open file descriptors. */
+ throw_to_top_level ();
+ return (EXECUTION_FAILURE); /* XXX */
+ }
+
+ /* Here is a problem: with the new file close-on-exec
+ code, the read end of the pipe (fildes[0]) stays open
+ in the first process, so that process will never get a
+ SIGPIPE. There is no way to signal the first process
+ that it should close fildes[0] after forking, so it
+ remains open. No SIGPIPE is ever sent because there
+ is still a file descriptor open for reading connected
+ to the pipe. We take care of that here. This passes
+ around a bitmap of file descriptors that must be
+ closed after making a child process in execute_simple_command. */
+
+ /* We need fd_bitmap to be at least as big as fildes[0].
+ If fildes[0] is less than fds_to_close->size, then
+ use fds_to_close->size. */
+ new_bitmap_size = (fildes[0] < fds_to_close->size)
+ ? fds_to_close->size
+ : fildes[0] + 8;
+
+ fd_bitmap = new_fd_bitmap (new_bitmap_size);
+
+ /* Now copy the old information into the new bitmap. */
+ xbcopy ((char *)fds_to_close->bitmap, (char *)fd_bitmap->bitmap, fds_to_close->size);
+
+ /* And mark the pipe file descriptors to be closed. */
+ fd_bitmap->bitmap[fildes[0]] = 1;
+
+ /* In case there are pipe or out-of-processes errors, we
+ want all these file descriptors to be closed when
+ unwind-protects are run, and the storage used for the
+ bitmaps freed up. */
+ begin_unwind_frame ("pipe-file-descriptors");
+ add_unwind_protect (dispose_fd_bitmap, fd_bitmap);
+ add_unwind_protect (close_fd_bitmap, fd_bitmap);
+ if (prev >= 0)
+ add_unwind_protect (close, prev);
+ dummyfd = fildes[1];
+ add_unwind_protect (close, dummyfd);
+
+#if defined (JOB_CONTROL)
+ add_unwind_protect (restore_signal_mask, &oset);
+#endif /* JOB_CONTROL */
+
+ if (ignore_return && cmd->value.Connection->first)
+ cmd->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+ execute_command_internal (cmd->value.Connection->first, asynchronous,
+ prev, fildes[1], fd_bitmap);
+
+ if (prev >= 0)
+ close (prev);
+
+ prev = fildes[0];
+ close (fildes[1]);
+
+ dispose_fd_bitmap (fd_bitmap);
+ discard_unwind_frame ("pipe-file-descriptors");
+
+ cmd = cmd->value.Connection->second;
+ }
+
+ lastpid = last_made_pid;
+
+ /* Now execute the rightmost command in the pipeline. */
+ if (ignore_return && cmd)
+ cmd->flags |= CMD_IGNORE_RETURN;
+
+ lastpipe_flag = 0;
+
+ begin_unwind_frame ("lastpipe-exec");
+ lstdin = -1;
+ /* If the `lastpipe' option is set with shopt, and job control is not
+ enabled, execute the last element of non-async pipelines in the
+ current shell environment. */
+ if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
+ {
+ lstdin = move_to_high_fd (0, 1, -1);
+ if (lstdin > 0)
+ {
+ do_piping (prev, pipe_out);
+ prev = NO_PIPE;
+ add_unwind_protect (restore_stdin, lstdin);
+ lastpipe_flag = 1;
+ freeze_jobs_list ();
+ lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL); /* XXX */
+ add_unwind_protect (lastpipe_cleanup, lastpipe_jid);
+ }
+ if (cmd)
+ cmd->flags |= CMD_LASTPIPE;
+ }
+ if (prev >= 0)
+ add_unwind_protect (close, prev);
+
+ exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close);
+
+ if (lstdin > 0)
+ restore_stdin (lstdin);
+
+ if (prev >= 0)
+ close (prev);
+
+#if defined (JOB_CONTROL)
+ UNBLOCK_CHILD (oset);
+#endif
+
+ QUIT;
+
+ if (lastpipe_flag)
+ {
+#if defined (JOB_CONTROL)
+ if (INVALID_JOB (lastpipe_jid) == 0)
+ {
+ append_process (savestring (the_printed_command_except_trap), dollar_dollar_pid, exec_result, lastpipe_jid);
+ lstdin = wait_for (lastpid);
+ }
+ else
+ lstdin = wait_for_single_pid (lastpid); /* checks bgpids list */
+#else
+ lstdin = wait_for (lastpid);
+#endif
+
+#if defined (JOB_CONTROL)
+ /* If wait_for removes the job from the jobs table, use result of last
+ command as pipeline's exit status as usual. The jobs list can get
+ frozen and unfrozen at inconvenient times if there are multiple pipelines
+ running simultaneously. */
+ if (INVALID_JOB (lastpipe_jid) == 0)
+ exec_result = job_exit_status (lastpipe_jid);
+ else if (pipefail_opt)
+ exec_result = exec_result | lstdin; /* XXX */
+ /* otherwise we use exec_result */
+
+#endif
+ unfreeze_jobs_list ();
+ }
+
+ discard_unwind_frame ("lastpipe-exec");
+
+ return (exec_result);
+}
+
+static int
+execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+ COMMAND *command;
+ int asynchronous, pipe_in, pipe_out;
+ struct fd_bitmap *fds_to_close;
+{
+ COMMAND *tc, *second;
+ int ignore_return, exec_result, was_error_trap, invert;
+ volatile int save_line_number;
+
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+ switch (command->value.Connection->connector)
+ {
+ /* Do the first command asynchronously. */
+ case '&':
+ tc = command->value.Connection->first;
+ if (tc == 0)
+ return (EXECUTION_SUCCESS);
+
+ if (ignore_return)
+ tc->flags |= CMD_IGNORE_RETURN;
+ tc->flags |= CMD_AMPERSAND;
+
+ /* If this shell was compiled without job control support,
+ if we are currently in a subshell via `( xxx )', or if job
+ control is not active then the standard input for an
+ asynchronous command is forced to /dev/null. */
+#if defined (JOB_CONTROL)
+ if ((subshell_environment || !job_control) && !stdin_redir)
+#else
+ if (!stdin_redir)
+#endif /* JOB_CONTROL */
+ tc->flags |= CMD_STDIN_REDIR;
+
+ exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out, fds_to_close);
+ QUIT;
+
+ if (tc->flags & CMD_STDIN_REDIR)
+ tc->flags &= ~CMD_STDIN_REDIR;
+
+ second = command->value.Connection->second;
+ if (second)
+ {
+ if (ignore_return)
+ second->flags |= CMD_IGNORE_RETURN;
+
+ exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);
+ }
+
+ break;
+
+ /* Just call execute command on both sides. */
+ case ';':
+ if (ignore_return)
+ {
+ if (command->value.Connection->first)
+ command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+ if (command->value.Connection->second)
+ command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+ }
+ executing_list++;
+ QUIT;
+ execute_command (command->value.Connection->first);
+ QUIT;
+ exec_result = execute_command_internal (command->value.Connection->second,
+ asynchronous, pipe_in, pipe_out,
+ fds_to_close);
+ executing_list--;
+ break;
+
+ case '|':
+ was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+ invert = (command->flags & CMD_INVERT_RETURN) != 0;
+ ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+ line_number_for_err_trap = line_number;
+ exec_result = execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+
+ if (asynchronous)
+ {
+ exec_result = EXECUTION_SUCCESS;
+ invert = 0;
+ }
+
+ if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ save_line_number = line_number;
+ line_number = line_number_for_err_trap;
+ run_error_trap ();
+ line_number = save_line_number;
+ }
+
+ if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+ {
+ last_command_exit_value = exec_result;
+ run_pending_traps ();
+ jump_to_top_level (ERREXIT);
+ }
+
+ break;
+
+ case AND_AND:
+ case OR_OR:
+ if (asynchronous)
+ {
+ /* If we have something like `a && b &' or `a || b &', run the
+ && or || stuff in a subshell. Force a subshell and just call
+ execute_command_internal again. Leave asynchronous on
+ so that we get a report from the parent shell about the
+ background job. */
+ command->flags |= CMD_FORCE_SUBSHELL;
+ exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
+ break;
+ }
+
+ /* Execute the first command. If the result of that is successful
+ and the connector is AND_AND, or the result is not successful
+ and the connector is OR_OR, then execute the second command,
+ otherwise return. */
+
+ executing_list++;
+ if (command->value.Connection->first)
+ command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+
+ exec_result = execute_command (command->value.Connection->first);
+ QUIT;
+ if (((command->value.Connection->connector == AND_AND) &&
+ (exec_result == EXECUTION_SUCCESS)) ||
+ ((command->value.Connection->connector == OR_OR) &&
+ (exec_result != EXECUTION_SUCCESS)))
+ {
+ if (ignore_return && command->value.Connection->second)
+ command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+
+ exec_result = execute_command (command->value.Connection->second);
+ }
+ executing_list--;
+ break;
+
+ default:
+ command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);
+ jump_to_top_level (DISCARD);
+ exec_result = EXECUTION_FAILURE;
+ }
+
+ return exec_result;
+}
+
+#define REAP() \
+ do \
+ { \
+ if (!interactive_shell) \
+ reap_dead_jobs (); \
+ } \
+ while (0)
+
+/* Execute a FOR command. The syntax is: FOR word_desc IN word_list;
+ DO command; DONE */
+static int
+execute_for_command (for_command)
+ FOR_COM *for_command;
+{
+ register WORD_LIST *releaser, *list;
+ SHELL_VAR *v;
+ char *identifier;
+ int retval, save_line_number;
+#if 0
+ SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */
+#endif
+
+ save_line_number = line_number;
+ if (check_identifier (for_command->name, 1) == 0)
+ {
+ if (posixly_correct && interactive_shell == 0)
+ {
+ last_command_exit_value = EX_BADUSAGE;
+ jump_to_top_level (ERREXIT);
+ }
+ return (EXECUTION_FAILURE);
+ }
+
+ loop_level++;
+ identifier = for_command->name->word;
+
+ line_number = for_command->line; /* for expansion error messages */
+ list = releaser = expand_words_no_vars (for_command->map_list);
+
+ begin_unwind_frame ("for");
+ add_unwind_protect (dispose_words, releaser);
+
+#if 0
+ if (lexical_scoping)
+ {
+ old_value = copy_variable (find_variable (identifier));
+ if (old_value)
+ add_unwind_protect (dispose_variable, old_value);
+ }
+#endif
+
+ if (for_command->flags & CMD_IGNORE_RETURN)
+ for_command->action->flags |= CMD_IGNORE_RETURN;
+
+ for (retval = EXECUTION_SUCCESS; list; list = list->next)
+ {
+ QUIT;
+
+ line_number = for_command->line;
+
+ /* Remember what this command looks like, for debugger. */
+ command_string_index = 0;
+ print_for_command_head (for_command);
+
+ if (echo_command_at_execute)
+ xtrace_print_for_command_head (for_command);
+
+ /* Save this command unless it's a trap command and we're not running
+ a debug trap. */
+ if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ retval = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && retval != EXECUTION_SUCCESS)
+ continue;
+#endif
+
+ this_command_name = (char *)NULL;
+ /* XXX - special ksh93 for command index variable handling */
+ v = find_variable_last_nameref (identifier);
+ if (v && nameref_p (v))
+ {
+ v = bind_variable_value (v, list->word->word, 0);
+ }
+ else
+ v = bind_variable (identifier, list->word->word, 0);
+ if (readonly_p (v) || noassign_p (v))
+ {
+ line_number = save_line_number;
+ if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
+ {
+ last_command_exit_value = EXECUTION_FAILURE;
+ jump_to_top_level (FORCE_EOF);
+ }
+ else
+ {
+ dispose_words (releaser);
+ discard_unwind_frame ("for");
+ loop_level--;
+ return (EXECUTION_FAILURE);
+ }
+ }
+ retval = execute_command (for_command->action);
+ REAP ();
+ QUIT;
+
+ if (breaking)
+ {
+ breaking--;
+ break;
+ }
+
+ if (continuing)
+ {
+ continuing--;
+ if (continuing)
+ break;
+ }
+ }
+
+ loop_level--;
+ line_number = save_line_number;
+
+#if 0
+ if (lexical_scoping)
+ {
+ if (!old_value)
+ unbind_variable (identifier);
+ else
+ {
+ SHELL_VAR *new_value;
+
+ new_value = bind_variable (identifier, value_cell(old_value), 0);
+ new_value->attributes = old_value->attributes;
+ dispose_variable (old_value);
+ }
+ }
+#endif
+
+ dispose_words (releaser);
+ discard_unwind_frame ("for");
+ return (retval);
+}
+
+#if defined (ARITH_FOR_COMMAND)
+/* Execute an arithmetic for command. The syntax is
+
+ for (( init ; step ; test ))
+ do
+ body
+ done
+
+ The execution should be exactly equivalent to
+
+ eval \(\( init \)\)
+ while eval \(\( test \)\) ; do
+ body;
+ eval \(\( step \)\)
+ done
+*/
+static intmax_t
+eval_arith_for_expr (l, okp)
+ WORD_LIST *l;
+ int *okp;
+{
+ WORD_LIST *new;
+ intmax_t expresult;
+ int r;
+
+ new = expand_words_no_vars (l);
+ if (new)
+ {
+ if (echo_command_at_execute)
+ xtrace_print_arith_cmd (new);
+ this_command_name = "(("; /* )) for expression error messages */
+
+ command_string_index = 0;
+ print_arith_command (new);
+ if (signal_in_progress (DEBUG_TRAP) == 0)
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ r = run_debug_trap ();
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+#if defined (DEBUGGER)
+ if (debugging_mode == 0 || r == EXECUTION_SUCCESS)
+ expresult = evalexp (new->word->word, okp);
+ else
+ {
+ expresult = 0;
+ if (okp)
+ *okp = 1;
+ }
+#else
+ expresult = evalexp (new->word->word, okp);
+#endif
+ dispose_words (new);
+ }
+ else
+ {
+ expresult = 0;
+ if (okp)
+ *okp = 1;
+ }
+ return (expresult);
+}
+
+static int
+execute_arith_for_command (arith_for_command)
+ ARITH_FOR_COM *arith_for_command;
+{
+ intmax_t expresult;
+ int expok, body_status, arith_lineno, save_lineno;
+
+ body_status = EXECUTION_SUCCESS;
+ loop_level++;
+ save_lineno = line_number;
+
+ if (arith_for_command->flags & CMD_IGNORE_RETURN)
+ arith_for_command->action->flags |= CMD_IGNORE_RETURN;
+
+ this_command_name = "(("; /* )) for expression error messages */
+
+ /* save the starting line number of the command so we can reset
+ line_number before executing each expression -- for $LINENO
+ and the DEBUG trap. */
+ line_number = arith_lineno = arith_for_command->line;
+ if (variable_context && interactive_shell)
+ line_number -= function_line_number;
+
+ /* Evaluate the initialization expression. */
+ expresult = eval_arith_for_expr (arith_for_command->init, &expok);
+ if (expok == 0)
+ {
+ line_number = save_lineno;
+ return (EXECUTION_FAILURE);
+ }
+
+ while (1)
+ {
+ /* Evaluate the test expression. */
+ line_number = arith_lineno;
+ expresult = eval_arith_for_expr (arith_for_command->test, &expok);
+ line_number = save_lineno;
+
+ if (expok == 0)
+ {
+ body_status = EXECUTION_FAILURE;
+ break;
+ }
+ REAP ();
+ if (expresult == 0)
+ break;
+
+ /* Execute the body of the arithmetic for command. */
+ QUIT;
+ body_status = execute_command (arith_for_command->action);
+ QUIT;
+
+ /* Handle any `break' or `continue' commands executed by the body. */
+ if (breaking)
+ {
+ breaking--;
+ break;
+ }
+
+ if (continuing)
+ {
+ continuing--;
+ if (continuing)
+ break;
+ }
+
+ /* Evaluate the step expression. */
+ line_number = arith_lineno;
+ expresult = eval_arith_for_expr (arith_for_command->step, &expok);
+ line_number = save_lineno;
+
+ if (expok == 0)
+ {
+ body_status = EXECUTION_FAILURE;
+ break;
+ }
+ }
+
+ loop_level--;
+ line_number = save_lineno;
+
+ return (body_status);
+}
+#endif
+
+#if defined (SELECT_COMMAND)
+static int LINES, COLS, tabsize;
+
+#define RP_SPACE ") "
+#define RP_SPACE_LEN 2
+
+/* XXX - does not handle numbers > 1000000 at all. */
+#define NUMBER_LEN(s) \
+((s < 10) ? 1 \
+ : ((s < 100) ? 2 \
+ : ((s < 1000) ? 3 \
+ : ((s < 10000) ? 4 \
+ : ((s < 100000) ? 5 \
+ : 6)))))
+
+static int
+displen (s)
+ const char *s;
+{
+#if defined (HANDLE_MULTIBYTE)
+ wchar_t *wcstr;
+ size_t slen;
+ int wclen;
+
+ wcstr = 0;
+ slen = mbstowcs (wcstr, s, 0);
+ if (slen == -1)
+ slen = 0;
+ wcstr = (wchar_t *)xmalloc (sizeof (wchar_t) * (slen + 1));
+ mbstowcs (wcstr, s, slen + 1);
+ wclen = wcswidth (wcstr, slen);
+ free (wcstr);
+ return (wclen < 0 ? STRLEN(s) : wclen);
+#else
+ return (STRLEN (s));
+#endif
+}
+
+static int
+print_index_and_element (len, ind, list)
+ int len, ind;
+ WORD_LIST *list;
+{
+ register WORD_LIST *l;
+ register int i;
+
+ if (list == 0)
+ return (0);
+ for (i = ind, l = list; l && --i; l = l->next)
+ ;
+ if (l == 0) /* don't think this can happen */
+ return (0);
+ fprintf (stderr, "%*d%s%s", len, ind, RP_SPACE, l->word->word);
+ return (displen (l->word->word));
+}
+
+static void
+indent (from, to)
+ int from, to;
+{
+ while (from < to)
+ {
+ if ((to / tabsize) > (from / tabsize))
+ {
+ putc ('\t', stderr);
+ from += tabsize - from % tabsize;
+ }
+ else
+ {
+ putc (' ', stderr);
+ from++;
+ }
+ }
+}
+
+static void
+print_select_list (list, list_len, max_elem_len, indices_len)
+ WORD_LIST *list;
+ int list_len, max_elem_len, indices_len;
+{
+ int ind, row, elem_len, pos, cols, rows;
+ int first_column_indices_len, other_indices_len;
+
+ if (list == 0)
+ {
+ putc ('\n', stderr);
+ return;
+ }
+
+ cols = max_elem_len ? COLS / max_elem_len : 1;
+ if (cols == 0)
+ cols = 1;
+ rows = list_len ? list_len / cols + (list_len % cols != 0) : 1;
+ cols = list_len ? list_len / rows + (list_len % rows != 0) : 1;
+
+ if (rows == 1)
+ {
+ rows = cols;
+ cols = 1;
+ }
+
+ first_column_indices_len = NUMBER_LEN (rows);
+ other_indices_len = indices_len;
+
+ for (row = 0; row < rows; row++)
+ {
+ ind = row;
+ pos = 0;
+ while (1)
+ {
+ indices_len = (pos == 0) ? first_column_indices_len : other_indices_len;
+ elem_len = print_index_and_element (indices_len, ind + 1, list);
+ elem_len += indices_len + RP_SPACE_LEN;
+ ind += rows;
+ if (ind >= list_len)
+ break;
+ indent (pos + elem_len, pos + max_elem_len);
+ pos += max_elem_len;
+ }
+ putc ('\n', stderr);
+ }
+}
+
+/* Print the elements of LIST, one per line, preceded by an index from 1 to
+ LIST_LEN. Then display PROMPT and wait for the user to enter a number.
+ If the number is between 1 and LIST_LEN, return that selection. If EOF
+ is read, return a null string. If a blank line is entered, or an invalid
+ number is entered, the loop is executed again. */
+static char *
+select_query (list, list_len, prompt, print_menu)
+ WORD_LIST *list;
+ int list_len;
+ char *prompt;
+ int print_menu;
+{
+ int max_elem_len, indices_len, len;
+ intmax_t reply;
+ WORD_LIST *l;
+ char *repl_string, *t;
+
+#if 0
+ t = get_string_value ("LINES");
+ LINES = (t && *t) ? atoi (t) : 24;
+#endif
+ t = get_string_value ("COLUMNS");
+ COLS = (t && *t) ? atoi (t) : 80;
+
+#if 0
+ t = get_string_value ("TABSIZE");
+ tabsize = (t && *t) ? atoi (t) : 8;
+ if (tabsize <= 0)
+ tabsize = 8;
+#else
+ tabsize = 8;
+#endif
+
+ max_elem_len = 0;
+ for (l = list; l; l = l->next)
+ {
+ len = displen (l->word->word);
+ if (len > max_elem_len)
+ max_elem_len = len;
+ }
+ indices_len = NUMBER_LEN (list_len);
+ max_elem_len += indices_len + RP_SPACE_LEN + 2;
+
+ while (1)
+ {
+ if (print_menu)
+ print_select_list (list, list_len, max_elem_len, indices_len);
+ fprintf (stderr, "%s", prompt);
+ fflush (stderr);
+ QUIT;
+
+ if (read_builtin ((WORD_LIST *)NULL) != EXECUTION_SUCCESS)
+ {
+ putchar ('\n');
+ return ((char *)NULL);
+ }
+ repl_string = get_string_value ("REPLY");
+ if (*repl_string == 0)
+ {
+ print_menu = 1;
+ continue;
+ }
+ if (legal_number (repl_string, &reply) == 0)
+ return "";
+ if (reply < 1 || reply > list_len)
+ return "";
+
+ for (l = list; l && --reply; l = l->next)
+ ;
+ return (l->word->word); /* XXX - can't be null? */
+ }
+}
+
+/* Execute a SELECT command. The syntax is:
+ SELECT word IN list DO command_list DONE
+ Only `break' or `return' in command_list will terminate
+ the command. */
+static int
+execute_select_command (select_command)
+ SELECT_COM *select_command;
+{
+ WORD_LIST *releaser, *list;
+ SHELL_VAR *v;
+ char *identifier, *ps3_prompt, *selection;
+ int retval, list_len, show_menu, save_line_number;
+
+ if (check_identifier (select_command->name, 1) == 0)
+ return (EXECUTION_FAILURE);
+
+ save_line_number = line_number;
+ line_number = select_command->line;
+
+ command_string_index = 0;
+ print_select_command_head (select_command);
+
+ if (echo_command_at_execute)
+ xtrace_print_select_command_head (select_command);
+
+#if 0
+ if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+ if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ retval = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && retval != EXECUTION_SUCCESS)
+ return (EXECUTION_SUCCESS);
+#endif
+
+ loop_level++;
+ identifier = select_command->name->word;
+
+ /* command and arithmetic substitution, parameter and variable expansion,
+ word splitting, pathname expansion, and quote removal. */
+ list = releaser = expand_words_no_vars (select_command->map_list);
+ list_len = list_length (list);
+ if (list == 0 || list_len == 0)
+ {
+ if (list)
+ dispose_words (list);
+ line_number = save_line_number;
+ return (EXECUTION_SUCCESS);
+ }
+
+ begin_unwind_frame ("select");
+ add_unwind_protect (dispose_words, releaser);
+
+ if (select_command->flags & CMD_IGNORE_RETURN)
+ select_command->action->flags |= CMD_IGNORE_RETURN;
+
+ retval = EXECUTION_SUCCESS;
+ show_menu = 1;
+
+ while (1)
+ {
+ line_number = select_command->line;
+ ps3_prompt = get_string_value ("PS3");
+ if (ps3_prompt == 0)
+ ps3_prompt = "#? ";
+
+ QUIT;
+ selection = select_query (list, list_len, ps3_prompt, show_menu);
+ QUIT;
+ if (selection == 0)
+ {
+ /* select_query returns EXECUTION_FAILURE if the read builtin
+ fails, so we want to return failure in this case. */
+ retval = EXECUTION_FAILURE;
+ break;
+ }
+
+ v = bind_variable (identifier, selection, 0);
+ if (readonly_p (v) || noassign_p (v))
+ {
+ if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
+ {
+ last_command_exit_value = EXECUTION_FAILURE;
+ jump_to_top_level (FORCE_EOF);
+ }
+ else
+ {
+ dispose_words (releaser);
+ discard_unwind_frame ("select");
+ loop_level--;
+ line_number = save_line_number;
+ return (EXECUTION_FAILURE);
+ }
+ }
+
+ retval = execute_command (select_command->action);
+
+ REAP ();
+ QUIT;
+
+ if (breaking)
+ {
+ breaking--;
+ break;
+ }
+
+ if (continuing)
+ {
+ continuing--;
+ if (continuing)
+ break;
+ }
+
+#if defined (KSH_COMPATIBLE_SELECT)
+ show_menu = 0;
+ selection = get_string_value ("REPLY");
+ if (selection && *selection == '\0')
+ show_menu = 1;
+#endif
+ }
+
+ loop_level--;
+ line_number = save_line_number;
+
+ dispose_words (releaser);
+ discard_unwind_frame ("select");
+ return (retval);
+}
+#endif /* SELECT_COMMAND */
+
+/* Execute a CASE command. The syntax is: CASE word_desc IN pattern_list ESAC.
+ The pattern_list is a linked list of pattern clauses; each clause contains
+ some patterns to compare word_desc against, and an associated command to
+ execute. */
+static int
+execute_case_command (case_command)
+ CASE_COM *case_command;
+{
+ register WORD_LIST *list;
+ WORD_LIST *wlist, *es;
+ PATTERN_LIST *clauses;
+ char *word, *pattern;
+ int retval, match, ignore_return, save_line_number;
+
+ save_line_number = line_number;
+ line_number = case_command->line;
+
+ command_string_index = 0;
+ print_case_command_head (case_command);
+
+ if (echo_command_at_execute)
+ xtrace_print_case_command_head (case_command);
+
+#if 0
+ if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+ if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ retval = run_debug_trap();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && retval != EXECUTION_SUCCESS)
+ {
+ line_number = save_line_number;
+ return (EXECUTION_SUCCESS);
+ }
+#endif
+
+ wlist = expand_word_unsplit (case_command->word, 0);
+ word = wlist ? string_list (wlist) : savestring ("");
+ dispose_words (wlist);
+
+ retval = EXECUTION_SUCCESS;
+ ignore_return = case_command->flags & CMD_IGNORE_RETURN;
+
+ begin_unwind_frame ("case");
+ add_unwind_protect (xfree, word);
+
+#define EXIT_CASE() goto exit_case_command
+
+ for (clauses = case_command->clauses; clauses; clauses = clauses->next)
+ {
+ QUIT;
+ for (list = clauses->patterns; list; list = list->next)
+ {
+ es = expand_word_leave_quoted (list->word, 0);
+
+ if (es && es->word && es->word->word && *(es->word->word))
+ pattern = quote_string_for_globbing (es->word->word, QGLOB_CVTNULL);
+ else
+ {
+ pattern = (char *)xmalloc (1);
+ pattern[0] = '\0';
+ }
+
+ /* Since the pattern does not undergo quote removal (as per
+ Posix.2, section 3.9.4.3), the strmatch () call must be able
+ to recognize backslashes as escape characters. */
+ match = strmatch (pattern, word, FNMATCH_EXTFLAG|FNMATCH_IGNCASE) != FNM_NOMATCH;
+ free (pattern);
+
+ dispose_words (es);
+
+ if (match)
+ {
+ do
+ {
+ if (clauses->action && ignore_return)
+ clauses->action->flags |= CMD_IGNORE_RETURN;
+ retval = execute_command (clauses->action);
+ }
+ while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
+ if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
+ EXIT_CASE ();
+ else
+ break;
+ }
+
+ QUIT;
+ }
+ }
+
+exit_case_command:
+ free (word);
+ discard_unwind_frame ("case");
+ line_number = save_line_number;
+ return (retval);
+}
+
+#define CMD_WHILE 0
+#define CMD_UNTIL 1
+
+/* The WHILE command. Syntax: WHILE test DO action; DONE.
+ Repeatedly execute action while executing test produces
+ EXECUTION_SUCCESS. */
+static int
+execute_while_command (while_command)
+ WHILE_COM *while_command;
+{
+ return (execute_while_or_until (while_command, CMD_WHILE));
+}
+
+/* UNTIL is just like WHILE except that the test result is negated. */
+static int
+execute_until_command (while_command)
+ WHILE_COM *while_command;
+{
+ return (execute_while_or_until (while_command, CMD_UNTIL));
+}
+
+/* The body for both while and until. The only difference between the
+ two is that the test value is treated differently. TYPE is
+ CMD_WHILE or CMD_UNTIL. The return value for both commands should
+ be EXECUTION_SUCCESS if no commands in the body are executed, and
+ the status of the last command executed in the body otherwise. */
+static int
+execute_while_or_until (while_command, type)
+ WHILE_COM *while_command;
+ int type;
+{
+ int return_value, body_status;
+
+ body_status = EXECUTION_SUCCESS;
+ loop_level++;
+
+ while_command->test->flags |= CMD_IGNORE_RETURN;
+ if (while_command->flags & CMD_IGNORE_RETURN)
+ while_command->action->flags |= CMD_IGNORE_RETURN;
+
+ while (1)
+ {
+ return_value = execute_command (while_command->test);
+ REAP ();
+
+ /* Need to handle `break' in the test when we would break out of the
+ loop. The job control code will set `breaking' to loop_level
+ when a job in a loop is stopped with SIGTSTP. If the stopped job
+ is in the loop test, `breaking' will not be reset unless we do
+ this, and the shell will cease to execute commands. */
+ if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
+ {
+ if (breaking)
+ breaking--;
+ break;
+ }
+ if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
+ {
+ if (breaking)
+ breaking--;
+ break;
+ }
+
+ QUIT;
+ body_status = execute_command (while_command->action);
+ QUIT;
+
+ if (breaking)
+ {
+ breaking--;
+ break;
+ }
+
+ if (continuing)
+ {
+ continuing--;
+ if (continuing)
+ break;
+ }
+ }
+ loop_level--;
+
+ return (body_status);
+}
+
+/* IF test THEN command [ELSE command].
+ IF also allows ELIF in the place of ELSE IF, but
+ the parser makes *that* stupidity transparent. */
+static int
+execute_if_command (if_command)
+ IF_COM *if_command;
+{
+ int return_value, save_line_number;
+
+ save_line_number = line_number;
+ if_command->test->flags |= CMD_IGNORE_RETURN;
+ return_value = execute_command (if_command->test);
+ line_number = save_line_number;
+
+ if (return_value == EXECUTION_SUCCESS)
+ {
+ QUIT;
+
+ if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
+ if_command->true_case->flags |= CMD_IGNORE_RETURN;
+
+ return (execute_command (if_command->true_case));
+ }
+ else
+ {
+ QUIT;
+
+ if (if_command->false_case && (if_command->flags & CMD_IGNORE_RETURN))
+ if_command->false_case->flags |= CMD_IGNORE_RETURN;
+
+ return (execute_command (if_command->false_case));
+ }
+}
+
+#if defined (DPAREN_ARITHMETIC)
+static int
+execute_arith_command (arith_command)
+ ARITH_COM *arith_command;
+{
+ int expok, save_line_number, retval;
+ intmax_t expresult;
+ WORD_LIST *new;
+ char *exp;
+
+ expresult = 0;
+
+ save_line_number = line_number;
+ this_command_name = "(("; /* )) */
+ line_number = arith_command->line;
+ /* If we're in a function, update the line number information. */
+ if (variable_context && interactive_shell)
+ line_number -= function_line_number;
+
+ command_string_index = 0;
+ print_arith_command (arith_command->exp);
+
+ if (signal_in_progress (DEBUG_TRAP) == 0)
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ /* Run the debug trap before each arithmetic command, but do it after we
+ update the line number information and before we expand the various
+ words in the expression. */
+ retval = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && retval != EXECUTION_SUCCESS)
+ {
+ line_number = save_line_number;
+ return (EXECUTION_SUCCESS);
+ }
+#endif
+
+ new = expand_words_no_vars (arith_command->exp);
+
+ /* If we're tracing, make a new word list with `((' at the front and `))'
+ at the back and print it. */
+ if (echo_command_at_execute)
+ xtrace_print_arith_cmd (new);
+
+ if (new)
+ {
+ exp = new->next ? string_list (new) : new->word->word;
+ expresult = evalexp (exp, &expok);
+ line_number = save_line_number;
+ if (exp != new->word->word)
+ free (exp);
+ dispose_words (new);
+ }
+ else
+ {
+ expresult = 0;
+ expok = 1;
+ }
+
+ if (expok == 0)
+ return (EXECUTION_FAILURE);
+
+ return (expresult == 0 ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
+}
+#endif /* DPAREN_ARITHMETIC */
+
+#if defined (COND_COMMAND)
+
+static char * const nullstr = "";
+
+/* XXX - can COND ever be NULL when this is called? */
+static int
+execute_cond_node (cond)
+ COND_COM *cond;
+{
+ int result, invert, patmatch, rmatch, mflags, ignore;
+ char *arg1, *arg2;
+#if 0
+ char *t1, *t2;
+#endif
+
+ invert = (cond->flags & CMD_INVERT_RETURN);
+ ignore = (cond->flags & CMD_IGNORE_RETURN);
+ if (ignore)
+ {
+ if (cond->left)
+ cond->left->flags |= CMD_IGNORE_RETURN;
+ if (cond->right)
+ cond->right->flags |= CMD_IGNORE_RETURN;
+ }
+
+ if (cond->type == COND_EXPR)
+ result = execute_cond_node (cond->left);
+ else if (cond->type == COND_OR)
+ {
+ result = execute_cond_node (cond->left);
+ if (result != EXECUTION_SUCCESS)
+ result = execute_cond_node (cond->right);
+ }
+ else if (cond->type == COND_AND)
+ {
+ result = execute_cond_node (cond->left);
+ if (result == EXECUTION_SUCCESS)
+ result = execute_cond_node (cond->right);
+ }
+ else if (cond->type == COND_UNARY)
+ {
+ if (ignore)
+ comsub_ignore_return++;
+ arg1 = cond_expand_word (cond->left->op, 0);
+ if (ignore)
+ comsub_ignore_return--;
+ if (arg1 == 0)
+ arg1 = nullstr;
+ if (echo_command_at_execute)
+ xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *)NULL);
+ result = unary_test (cond->op->word, arg1) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
+ if (arg1 != nullstr)
+ free (arg1);
+ }
+ else if (cond->type == COND_BINARY)
+ {
+ rmatch = 0;
+ patmatch = (((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
+ (cond->op->word[0] == '!' || cond->op->word[0] == '=')) ||
+ (cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
+#if defined (COND_REGEXP)
+ rmatch = (cond->op->word[0] == '=' && cond->op->word[1] == '~' &&
+ cond->op->word[2] == '\0');
+#endif
+
+ if (ignore)
+ comsub_ignore_return++;
+ arg1 = cond_expand_word (cond->left->op, 0);
+ if (ignore)
+ comsub_ignore_return--;
+ if (arg1 == 0)
+ arg1 = nullstr;
+ if (ignore)
+ comsub_ignore_return++;
+ arg2 = cond_expand_word (cond->right->op,
+ (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
+ if (ignore)
+ comsub_ignore_return--;
+ if (arg2 == 0)
+ arg2 = nullstr;
+
+ if (echo_command_at_execute)
+ xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
+
+#if defined (COND_REGEXP)
+ if (rmatch)
+ {
+ mflags = SHMAT_PWARN;
+#if defined (ARRAY_VARS)
+ mflags |= SHMAT_SUBEXP;
+#endif
+
+#if 0
+ t1 = strescape(arg1);
+ t2 = strescape(arg2);
+ itrace("execute_cond_node: sh_regmatch on `%s' and `%s'", t1, t2);
+ free(t1);
+ free(t2);
+#endif
+
+ result = sh_regmatch (arg1, arg2, mflags);
+ }
+ else
+#endif /* COND_REGEXP */
+ {
+ int oe;
+ oe = extended_glob;
+ extended_glob = 1;
+ result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
+ ? EXECUTION_SUCCESS
+ : EXECUTION_FAILURE;
+ extended_glob = oe;
+ }
+ if (arg1 != nullstr)
+ free (arg1);
+ if (arg2 != nullstr)
+ free (arg2);
+ }
+ else
+ {
+ command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);
+ jump_to_top_level (DISCARD);
+ result = EXECUTION_FAILURE;
+ }
+
+ if (invert)
+ result = (result == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
+
+ return result;
+}
+
+static int
+execute_cond_command (cond_command)
+ COND_COM *cond_command;
+{
+ int retval, save_line_number;
+
+ retval = EXECUTION_SUCCESS;
+ save_line_number = line_number;
+
+ this_command_name = "[[";
+ line_number = cond_command->line;
+ /* If we're in a function, update the line number information. */
+ if (variable_context && interactive_shell)
+ line_number -= function_line_number;
+ command_string_index = 0;
+ print_cond_command (cond_command);
+
+ if (signal_in_progress (DEBUG_TRAP) == 0)
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = savestring (the_printed_command);
+ }
+
+ /* Run the debug trap before each conditional command, but do it after we
+ update the line number information. */
+ retval = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && retval != EXECUTION_SUCCESS)
+ {
+ line_number = save_line_number;
+ return (EXECUTION_SUCCESS);
+ }
+#endif
+
+#if 0
+ debug_print_cond_command (cond_command);
+#endif
+
+ last_command_exit_value = retval = execute_cond_node (cond_command);
+ line_number = save_line_number;
+ return (retval);
+}
+#endif /* COND_COMMAND */
+
+static void
+bind_lastarg (arg)
+ char *arg;
+{
+ SHELL_VAR *var;
+
+ if (arg == 0)
+ arg = "";
+ var = bind_variable ("_", arg, 0);
+ VUNSETATTR (var, att_exported);
+}
+
+/* Execute a null command. Fork a subshell if the command uses pipes or is
+ to be run asynchronously. This handles all the side effects that are
+ supposed to take place. */
+static int
+execute_null_command (redirects, pipe_in, pipe_out, async)
+ REDIRECT *redirects;
+ int pipe_in, pipe_out, async;
+{
+ int r;
+ int forcefork;
+ REDIRECT *rd;
+
+ for (forcefork = 0, rd = redirects; rd; rd = rd->next)
+ forcefork += rd->rflags & REDIR_VARASSIGN;
+
+ if (forcefork || pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
+ {
+ /* We have a null command, but we really want a subshell to take
+ care of it. Just fork, do piping and redirections, and exit. */
+ if (make_child ((char *)NULL, async) == 0)
+ {
+ /* Cancel traps, in trap.c. */
+ restore_original_signals (); /* XXX */
+
+ do_piping (pipe_in, pipe_out);
+
+#if defined (COPROCESS_SUPPORT)
+ coproc_closeall ();
+#endif
+
+ subshell_environment = 0;
+ if (async)
+ subshell_environment |= SUBSHELL_ASYNC;
+ if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+ subshell_environment |= SUBSHELL_PIPE;
+
+ if (do_redirections (redirects, RX_ACTIVE) == 0)
+ exit (EXECUTION_SUCCESS);
+ else
+ exit (EXECUTION_FAILURE);
+ }
+ else
+ {
+ close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+ if (pipe_out == NO_PIPE)
+ unlink_fifo_list ();
+#endif
+ return (EXECUTION_SUCCESS);
+ }
+ }
+ else
+ {
+ /* Even if there aren't any command names, pretend to do the
+ redirections that are specified. The user expects the side
+ effects to take place. If the redirections fail, then return
+ failure. Otherwise, if a command substitution took place while
+ expanding the command or a redirection, return the value of that
+ substitution. Otherwise, return EXECUTION_SUCCESS. */
+
+ r = do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE);
+ cleanup_redirects (redirection_undo_list);
+ redirection_undo_list = (REDIRECT *)NULL;
+
+ if (r != 0)
+ return (EXECUTION_FAILURE);
+ else if (last_command_subst_pid != NO_PID)
+ return (last_command_exit_value);
+ else
+ return (EXECUTION_SUCCESS);
+ }
+}
+
+/* This is a hack to suppress word splitting for assignment statements
+ given as arguments to builtins with the ASSIGNMENT_BUILTIN flag set. */
+static void
+fix_assignment_words (words)
+ WORD_LIST *words;
+{
+ WORD_LIST *w, *wcmd;
+ struct builtin *b;
+ int assoc, global, array, integer;
+
+ if (words == 0)
+ return;
+
+ b = 0;
+ assoc = global = array = integer = 0;
+
+ /* Skip over assignment statements preceding a command name */
+ wcmd = words;
+ for (wcmd = words; wcmd; wcmd = wcmd->next)
+ if ((wcmd->word->flags & W_ASSIGNMENT) == 0)
+ break;
+
+ for (w = wcmd; w; w = w->next)
+ if (w->word->flags & W_ASSIGNMENT)
+ {
+ if (b == 0)
+ {
+ /* Posix (post-2008) says that `command' doesn't change whether
+ or not the builtin it shadows is a `declaration command', even
+ though it removes other special builtin properties. In Posix
+ mode, we skip over one or more instances of `command' and
+ deal with the next word as the assignment builtin. */
+ while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
+ wcmd = wcmd->next;
+ b = builtin_address_internal (wcmd->word->word, 0);
+ if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
+ return;
+ else if (b && (b->flags & ASSIGNMENT_BUILTIN))
+ wcmd->word->flags |= W_ASSNBLTIN;
+ }
+ w->word->flags |= (W_NOSPLIT|W_NOGLOB|W_TILDEEXP|W_ASSIGNARG);
+#if defined (ARRAY_VARS)
+ if (assoc)
+ w->word->flags |= W_ASSIGNASSOC;
+ if (array)
+ w->word->flags |= W_ASSIGNARRAY;
+#endif
+ if (global)
+ w->word->flags |= W_ASSNGLOBAL;
+ if (integer)
+ w->word->flags |= W_ASSIGNINT;
+ }
+#if defined (ARRAY_VARS)
+ /* Note that we saw an associative array option to a builtin that takes
+ assignment statements. This is a bit of a kludge. */
+ else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'a') || strchr (w->word->word+1, 'g')))
+#else
+ else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))
+#endif
+ {
+ if (b == 0)
+ {
+ while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
+ wcmd = wcmd->next;
+ b = builtin_address_internal (wcmd->word->word, 0);
+ if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
+ return;
+ else if (b && (b->flags & ASSIGNMENT_BUILTIN))
+ wcmd->word->flags |= W_ASSNBLTIN;
+ }
+ if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
+ assoc = 1;
+ else if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'a'))
+ array = 1;
+ if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
+ global = 1;
+ if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'i'))
+ integer = 1;
+ }
+}
+
+/* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
+ to PATHNAME, is a directory. Used by the autocd code below. */
+static int
+is_dirname (pathname)
+ char *pathname;
+{
+ char *temp;
+ int ret;
+
+ temp = search_for_command (pathname, 0);
+ ret = (temp ? file_isdir (temp) : file_isdir (pathname));
+ free (temp);
+ return ret;
+}
+
+/* The meaty part of all the executions. We have to start hacking the
+ real execution of commands here. Fork a process, set things up,
+ execute the command. */
+static int
+execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
+ SIMPLE_COM *simple_command;
+ int pipe_in, pipe_out, async;
+ struct fd_bitmap *fds_to_close;
+{
+ WORD_LIST *words, *lastword;
+ char *command_line, *lastarg, *temp;
+ int first_word_quoted, result, builtin_is_special, already_forked, dofork;
+ pid_t old_last_async_pid;
+ sh_builtin_func_t *builtin;
+ SHELL_VAR *func;
+ volatile int old_builtin, old_command_builtin;
+
+ result = EXECUTION_SUCCESS;
+ special_builtin_failed = builtin_is_special = 0;
+ command_line = (char *)0;
+
+ QUIT;
+
+ /* If we're in a function, update the line number information. */
+ if (variable_context && interactive_shell && sourcelevel == 0)
+ line_number -= function_line_number;
+
+ /* Remember what this command line looks like at invocation. */
+ command_string_index = 0;
+ print_simple_command (simple_command);
+
+#if 0
+ if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+ if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+ {
+ FREE (the_printed_command_except_trap);
+ the_printed_command_except_trap = the_printed_command ? savestring (the_printed_command) : (char *)0;
+ }
+
+ /* Run the debug trap before each simple command, but do it after we
+ update the line number information. */
+ result = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode && result != EXECUTION_SUCCESS)
+ return (EXECUTION_SUCCESS);
+#endif
+
+ first_word_quoted =
+ simple_command->words ? (simple_command->words->word->flags & W_QUOTED) : 0;
+
+ last_command_subst_pid = NO_PID;
+ old_last_async_pid = last_asynchronous_pid;
+
+ already_forked = dofork = 0;
+
+ /* If we're in a pipeline or run in the background, set DOFORK so we
+ make the child early, before word expansion. This keeps assignment
+ statements from affecting the parent shell's environment when they
+ should not. */
+ dofork = pipe_in != NO_PIPE || pipe_out != NO_PIPE || async;
+
+ /* Something like `%2 &' should restart job 2 in the background, not cause
+ the shell to fork here. */
+ if (dofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE &&
+ simple_command->words && simple_command->words->word &&
+ simple_command->words->word->word &&
+ (simple_command->words->word->word[0] == '%'))
+ dofork = 0;
+
+ if (dofork)
+ {
+ /* Do this now, because execute_disk_command will do it anyway in the
+ vast majority of cases. */
+ maybe_make_export_env ();
+
+ /* Don't let a DEBUG trap overwrite the command string to be saved with
+ the process/job associated with this child. */
+ if (make_child (savestring (the_printed_command_except_trap), async) == 0)
+ {
+ already_forked = 1;
+ simple_command->flags |= CMD_NO_FORK;
+
+ subshell_environment = SUBSHELL_FORK; /* XXX */
+ if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+ subshell_environment |= SUBSHELL_PIPE;
+ if (async)
+ subshell_environment |= SUBSHELL_ASYNC;
+
+ /* We need to do this before piping to handle some really
+ pathological cases where one of the pipe file descriptors
+ is < 2. */
+ if (fds_to_close)
+ close_fd_bitmap (fds_to_close);
+
+ do_piping (pipe_in, pipe_out);
+ pipe_in = pipe_out = NO_PIPE;
+#if defined (COPROCESS_SUPPORT)
+ coproc_closeall ();
+#endif
+
+ last_asynchronous_pid = old_last_async_pid;
+
+ CHECK_SIGTERM;
+ }
+ else
+ {
+ /* Don't let simple commands that aren't the last command in a
+ pipeline change $? for the rest of the pipeline (or at all). */
+ if (pipe_out != NO_PIPE)
+ result = last_command_exit_value;
+ close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+ /* Close /dev/fd file descriptors in the parent after forking the
+ last child in a (possibly one-element) pipeline. Defer this
+ until any running shell function completes. */
+ if (pipe_out == NO_PIPE && variable_context == 0) /* XXX */
+ unlink_fifo_list (); /* XXX */
+#endif
+ command_line = (char *)NULL; /* don't free this. */
+ bind_lastarg ((char *)NULL);
+ return (result);
+ }
+ }
+
+ /* If we are re-running this as the result of executing the `command'
+ builtin, do not expand the command words a second time. */
+ if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
+ {
+ current_fds_to_close = fds_to_close;
+ fix_assignment_words (simple_command->words);
+ /* Pass the ignore return flag down to command substitutions */
+ if (simple_command->flags & CMD_IGNORE_RETURN) /* XXX */
+ comsub_ignore_return++;
+ words = expand_words (simple_command->words);
+ if (simple_command->flags & CMD_IGNORE_RETURN)
+ comsub_ignore_return--;
+ current_fds_to_close = (struct fd_bitmap *)NULL;
+ }
+ else
+ words = copy_word_list (simple_command->words);
+
+ /* It is possible for WORDS not to have anything left in it.
+ Perhaps all the words consisted of `$foo', and there was
+ no variable `$foo'. */
+ if (words == 0)
+ {
+ this_command_name = 0;
+ result = execute_null_command (simple_command->redirects,
+ pipe_in, pipe_out,
+ already_forked ? 0 : async);
+ if (already_forked)
+ exit (result);
+ else
+ {
+ bind_lastarg ((char *)NULL);
+ set_pipestatus_from_exit (result);
+ return (result);
+ }
+ }
+
+ lastarg = (char *)NULL;
+
+ begin_unwind_frame ("simple-command");
+
+ if (echo_command_at_execute)
+ xtrace_print_word_list (words, 1);
+
+ builtin = (sh_builtin_func_t *)NULL;
+ func = (SHELL_VAR *)NULL;
+ if ((simple_command->flags & CMD_NO_FUNCTIONS) == 0)
+ {
+ /* Posix.2 says special builtins are found before functions. We
+ don't set builtin_is_special anywhere other than here, because
+ this path is followed only when the `command' builtin is *not*
+ being used, and we don't want to exit the shell if a special
+ builtin executed with `command builtin' fails. `command' is not
+ a special builtin. */
+ if (posixly_correct)
+ {
+ builtin = find_special_builtin (words->word->word);
+ if (builtin)
+ builtin_is_special = 1;
+ }
+ if (builtin == 0)
+ func = find_function (words->word->word);
+ }
+
+ /* In POSIX mode, assignment errors in the temporary environment cause a
+ non-interactive shell to exit. */
+ if (posixly_correct && builtin_is_special && interactive_shell == 0 && tempenv_assign_error)
+ {
+ last_command_exit_value = EXECUTION_FAILURE;
+ jump_to_top_level (ERREXIT);
+ }
+ tempenv_assign_error = 0; /* don't care about this any more */
+
+ add_unwind_protect (dispose_words, words);
+ QUIT;
+
+ /* Bind the last word in this command to "$_" after execution. */
+ for (lastword = words; lastword->next; lastword = lastword->next)
+ ;
+ lastarg = lastword->word->word;
+
+#if defined (JOB_CONTROL)
+ /* Is this command a job control related thing? */
+ if (words->word->word[0] == '%' && already_forked == 0)
+ {
+ this_command_name = async ? "bg" : "fg";
+ last_shell_builtin = this_shell_builtin;
+ this_shell_builtin = builtin_address (this_command_name);
+ result = (*this_shell_builtin) (words);
+ goto return_result;
+ }
+
+ /* One other possibililty. The user may want to resume an existing job.
+ If they do, find out whether this word is a candidate for a running
+ job. */
+ if (job_control && already_forked == 0 && async == 0 &&
+ !first_word_quoted &&
+ !words->next &&
+ words->word->word[0] &&
+ !simple_command->redirects &&
+ pipe_in == NO_PIPE &&
+ pipe_out == NO_PIPE &&
+ (temp = get_string_value ("auto_resume")))
+ {
+ int job, jflags, started_status;
+
+ jflags = JM_STOPPED|JM_FIRSTMATCH;
+ if (STREQ (temp, "exact"))
+ jflags |= JM_EXACT;
+ else if (STREQ (temp, "substring"))
+ jflags |= JM_SUBSTRING;
+ else
+ jflags |= JM_PREFIX;
+ job = get_job_by_name (words->word->word, jflags);
+ if (job != NO_JOB)
+ {
+ run_unwind_frame ("simple-command");
+ this_command_name = "fg";
+ last_shell_builtin = this_shell_builtin;
+ this_shell_builtin = builtin_address ("fg");
+
+ started_status = start_job (job, 1);
+ return ((started_status < 0) ? EXECUTION_FAILURE : started_status);
+ }
+ }
+#endif /* JOB_CONTROL */
+
+run_builtin:
+ /* Remember the name of this command globally. */
+ this_command_name = words->word->word;
+
+ QUIT;
+
+ /* This command could be a shell builtin or a user-defined function.
+ We have already found special builtins by this time, so we do not
+ set builtin_is_special. If this is a function or builtin, and we
+ have pipes, then fork a subshell in here. Otherwise, just execute
+ the command directly. */
+ if (func == 0 && builtin == 0)
+ builtin = find_shell_builtin (this_command_name);
+
+ last_shell_builtin = this_shell_builtin;
+ this_shell_builtin = builtin;
+
+ if (builtin || func)
+ {
+ if (builtin)
+ {
+ old_builtin = executing_builtin;
+ old_command_builtin = executing_command_builtin;
+ unwind_protect_int (executing_builtin); /* modified in execute_builtin */
+ unwind_protect_int (executing_command_builtin); /* ditto */
+ }
+ if (already_forked)
+ {
+ /* reset_terminating_signals (); */ /* XXX */
+ /* Reset the signal handlers in the child, but don't free the
+ trap strings. Set a flag noting that we have to free the
+ trap strings if we run trap to change a signal disposition. */
+ reset_signal_handlers ();
+ subshell_environment |= SUBSHELL_RESETTRAP;
+
+ if (async)
+ {
+ if ((simple_command->flags & CMD_STDIN_REDIR) &&
+ pipe_in == NO_PIPE &&
+ (stdin_redirects (simple_command->redirects) == 0))
+ async_redirect_stdin ();
+ setup_async_signals ();
+ }
+
+ subshell_level++;
+ execute_subshell_builtin_or_function
+ (words, simple_command->redirects, builtin, func,
+ pipe_in, pipe_out, async, fds_to_close,
+ simple_command->flags);
+ subshell_level--;
+ }
+ else
+ {
+ result = execute_builtin_or_function
+ (words, builtin, func, simple_command->redirects, fds_to_close,
+ simple_command->flags);
+ if (builtin)
+ {
+ if (result > EX_SHERRBASE)
+ {
+ switch (result)
+ {
+ case EX_REDIRFAIL:
+ case EX_BADASSIGN:
+ case EX_EXPFAIL:
+ /* These errors cause non-interactive posix mode shells to exit */
+ if (posixly_correct && builtin_is_special && interactive_shell == 0)
+ {
+ last_command_exit_value = EXECUTION_FAILURE;
+ jump_to_top_level (ERREXIT);
+ }
+ }
+ result = builtin_status (result);
+ if (builtin_is_special)
+ special_builtin_failed = 1;
+ }
+ /* In POSIX mode, if there are assignment statements preceding
+ a special builtin, they persist after the builtin
+ completes. */
+ if (posixly_correct && builtin_is_special && temporary_env)
+ merge_temporary_env ();
+ }
+ else /* function */
+ {
+ if (result == EX_USAGE)
+ result = EX_BADUSAGE;
+ else if (result > EX_SHERRBASE)
+ result = EXECUTION_FAILURE;
+ }
+
+ set_pipestatus_from_exit (result);
+
+ goto return_result;
+ }
+ }
+
+ if (autocd && interactive && words->word && is_dirname (words->word->word))
+ {
+ words = make_word_list (make_word ("cd"), words);
+ xtrace_print_word_list (words, 0);
+ goto run_builtin;
+ }
+
+ if (command_line == 0)
+ command_line = savestring (the_printed_command_except_trap ? the_printed_command_except_trap : "");
+
+#if defined (PROCESS_SUBSTITUTION)
+ if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
+ simple_command->flags &= ~CMD_NO_FORK;
+#endif
+
+ result = execute_disk_command (words, simple_command->redirects, command_line,
+ pipe_in, pipe_out, async, fds_to_close,
+ simple_command->flags);
+
+ return_result:
+ bind_lastarg (lastarg);
+ FREE (command_line);
+ dispose_words (words);
+ if (builtin)
+ {
+ executing_builtin = old_builtin;
+ executing_command_builtin = old_command_builtin;
+ }
+ discard_unwind_frame ("simple-command");
+ this_command_name = (char *)NULL; /* points to freed memory now */
+ return (result);
+}
+
+/* Translate the special builtin exit statuses. We don't really need a
+ function for this; it's a placeholder for future work. */
+static int
+builtin_status (result)
+ int result;
+{
+ int r;
+
+ switch (result)
+ {
+ case EX_USAGE:
+ r = EX_BADUSAGE;
+ break;
+ case EX_REDIRFAIL:
+ case EX_BADSYNTAX:
+ case EX_BADASSIGN:
+ case EX_EXPFAIL:
+ r = EXECUTION_FAILURE;
+ break;
+ default:
+ r = EXECUTION_SUCCESS;
+ break;
+ }
+ return (r);
+}
+
+static int
+execute_builtin (builtin, words, flags, subshell)
+ sh_builtin_func_t *builtin;
+ WORD_LIST *words;
+ int flags, subshell;
+{
+ int old_e_flag, result, eval_unwind;
+ int isbltinenv;
+ char *error_trap;
+
+ error_trap = 0;
+ old_e_flag = exit_immediately_on_error;
+
+ /* The eval builtin calls parse_and_execute, which does not know about
+ the setting of flags, and always calls the execution functions with
+ flags that will exit the shell on an error if -e is set. If the
+ eval builtin is being called, and we're supposed to ignore the exit
+ value of the command, we turn the -e flag off ourselves and disable
+ the ERR trap, then restore them when the command completes. This is
+ also a problem (as below) for the command and source/. builtins. */
+ if (subshell == 0 && (flags & CMD_IGNORE_RETURN) &&
+ (builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin))
+ {
+ begin_unwind_frame ("eval_builtin");
+ unwind_protect_int (exit_immediately_on_error);
+ unwind_protect_int (builtin_ignoring_errexit);
+ error_trap = TRAP_STRING (ERROR_TRAP);
+ if (error_trap)
+ {
+ error_trap = savestring (error_trap);
+ add_unwind_protect (xfree, error_trap);
+ add_unwind_protect (set_error_trap, error_trap);
+ restore_default_signal (ERROR_TRAP);
+ }
+ exit_immediately_on_error = 0;
+ builtin_ignoring_errexit = 1;
+ eval_unwind = 1;
+ }
+ else
+ eval_unwind = 0;
+
+ /* The temporary environment for a builtin is supposed to apply to
+ all commands executed by that builtin. Currently, this is a
+ problem only with the `unset', `source' and `eval' builtins.
+ `mapfile' is a special case because it uses evalstring (same as
+ eval or source) to run its callbacks. */
+ isbltinenv = (builtin == source_builtin || builtin == eval_builtin || builtin == unset_builtin || builtin == mapfile_builtin);
+
+ if (isbltinenv)
+ {
+ if (subshell == 0)
+ begin_unwind_frame ("builtin_env");
+
+ if (temporary_env)
+ {
+ push_scope (VC_BLTNENV, temporary_env);
+ if (subshell == 0)
+ add_unwind_protect (pop_scope, (flags & CMD_COMMAND_BUILTIN) ? 0 : "1");
+ temporary_env = (HASH_TABLE *)NULL;
+ }
+ }
+
+ if (subshell == 0 && builtin == eval_builtin)
+ {
+ if (evalnest_max > 0 && evalnest >= evalnest_max)
+ {
+ internal_error (_("eval: maximum eval nesting level exceeded (%d)"), evalnest);
+ evalnest = 0;
+ jump_to_top_level (DISCARD);
+ }
+ unwind_protect_int (evalnest);
+ /* The test for subshell == 0 above doesn't make a difference */
+ evalnest++; /* execute_subshell_builtin_or_function sets this to 0 */
+ }
+ else if (subshell == 0 && builtin == source_builtin)
+ {
+ if (sourcenest_max > 0 && sourcenest >= sourcenest_max)
+ {
+ internal_error (_("%s: maximum source nesting level exceeded (%d)"), this_command_name, sourcenest);
+ sourcenest = 0;
+ jump_to_top_level (DISCARD);
+ }
+ unwind_protect_int (sourcenest);
+ /* The test for subshell == 0 above doesn't make a difference */
+ sourcenest++; /* execute_subshell_builtin_or_function sets this to 0 */
+ }
+
+
+ /* `return' does a longjmp() back to a saved environment in execute_function.
+ If a variable assignment list preceded the command, and the shell is
+ running in POSIX mode, we need to merge that into the shell_variables
+ table, since `return' is a POSIX special builtin. */
+ if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
+ {
+ begin_unwind_frame ("return_temp_env");
+ add_unwind_protect (merge_temporary_env, (char *)NULL);
+ }
+
+ executing_builtin++;
+ executing_command_builtin |= builtin == command_builtin;
+ result = ((*builtin) (words->next));
+
+ /* This shouldn't happen, but in case `return' comes back instead of
+ longjmp'ing, we need to unwind. */
+ if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
+ discard_unwind_frame ("return_temp_env");
+
+ if (subshell == 0 && isbltinenv)
+ run_unwind_frame ("builtin_env");
+
+ if (eval_unwind)
+ {
+ exit_immediately_on_error = errexit_flag;
+ builtin_ignoring_errexit = 0;
+ if (error_trap)
+ {
+ set_error_trap (error_trap);
+ xfree (error_trap);
+ }
+ discard_unwind_frame ("eval_builtin");
+ }
+
+ return (result);
+}
+
+static int
+execute_function (var, words, flags, fds_to_close, async, subshell)
+ SHELL_VAR *var;
+ WORD_LIST *words;
+ int flags;
+ struct fd_bitmap *fds_to_close;
+ int async, subshell;
+{
+ int return_val, result;
+ COMMAND *tc, *fc, *save_current;
+ char *debug_trap, *error_trap, *return_trap;
+#if defined (ARRAY_VARS)
+ SHELL_VAR *funcname_v, *nfv, *bash_source_v, *bash_lineno_v;
+ ARRAY *funcname_a;
+ volatile ARRAY *bash_source_a;
+ volatile ARRAY *bash_lineno_a;
+#endif
+ FUNCTION_DEF *shell_fn;
+ char *sfile, *t;
+
+ USE_VAR(fc);
+
+ if (funcnest_max > 0 && funcnest >= funcnest_max)
+ {
+ internal_error (_("%s: maximum function nesting level exceeded (%d)"), var->name, funcnest);
+ funcnest = 0; /* XXX - should we reset it somewhere else? */
+ jump_to_top_level (DISCARD);
+ }
+
+#if defined (ARRAY_VARS)
+ GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
+ GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
+ GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);
+#endif
+
+ tc = (COMMAND *)copy_command (function_cell (var));
+ if (tc && (flags & CMD_IGNORE_RETURN))
+ tc->flags |= CMD_IGNORE_RETURN;
+
+ if (subshell == 0)
+ {
+ begin_unwind_frame ("function_calling");
+ push_context (var->name, subshell, temporary_env);
+ add_unwind_protect (pop_context, (char *)NULL);
+ unwind_protect_int (line_number);
+ unwind_protect_int (return_catch_flag);
+ unwind_protect_jmp_buf (return_catch);
+ add_unwind_protect (dispose_command, (char *)tc);
+ unwind_protect_pointer (this_shell_function);
+ unwind_protect_int (loop_level);
+ unwind_protect_int (funcnest);
+ unwind_protect_int (breaking);
+ unwind_protect_int (continuing);
+ }
+ else
+ push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */
+
+ temporary_env = (HASH_TABLE *)NULL;
+
+ this_shell_function = var;
+ make_funcname_visible (1);
+
+ debug_trap = TRAP_STRING(DEBUG_TRAP);
+ error_trap = TRAP_STRING(ERROR_TRAP);
+ return_trap = TRAP_STRING(RETURN_TRAP);
+
+ /* The order of the unwind protects for debug_trap, error_trap and
+ return_trap is important here! unwind-protect commands are run
+ in reverse order of registration. If this causes problems, take
+ out the xfree unwind-protect calls and live with the small memory leak. */
+
+ /* function_trace_mode != 0 means that all functions inherit the DEBUG trap.
+ if the function has the trace attribute set, it inherits the DEBUG trap */
+ if (debug_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
+ {
+ if (subshell == 0)
+ {
+ debug_trap = savestring (debug_trap);
+ add_unwind_protect (xfree, debug_trap);
+ add_unwind_protect (set_debug_trap, debug_trap);
+ }
+ restore_default_signal (DEBUG_TRAP);
+ }
+
+ /* error_trace_mode != 0 means that functions inherit the ERR trap. */
+ if (error_trap && error_trace_mode == 0)
+ {
+ if (subshell == 0)
+ {
+ error_trap = savestring (error_trap);
+ add_unwind_protect (xfree, error_trap);
+ add_unwind_protect (set_error_trap, error_trap);
+ }
+ restore_default_signal (ERROR_TRAP);
+ }
+
+ /* Shell functions inherit the RETURN trap if function tracing is on
+ globally or on individually for this function. */
+#if 0
+ if (return_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
+#else
+ if (return_trap && (signal_in_progress (DEBUG_TRAP) || ((trace_p (var) == 0) && function_trace_mode == 0)))
+#endif
+ {
+ if (subshell == 0)
+ {
+ return_trap = savestring (return_trap);
+ add_unwind_protect (xfree, return_trap);
+ add_unwind_protect (set_return_trap, return_trap);
+ }
+ restore_default_signal (RETURN_TRAP);
+ }
+
+ funcnest++;
+#if defined (ARRAY_VARS)
+ /* This is quite similar to the code in shell.c and elsewhere. */
+ shell_fn = find_function_def (this_shell_function->name);
+ sfile = shell_fn ? shell_fn->source_file : "";
+ array_push ((ARRAY *)funcname_a, this_shell_function->name);
+
+ array_push ((ARRAY *)bash_source_a, sfile);
+ t = itos (executing_line_number ());
+ array_push ((ARRAY *)bash_lineno_a, t);
+ free (t);
+#endif
+
+ /* The temporary environment for a function is supposed to apply to
+ all commands executed within the function body. */
+
+ remember_args (words->next, 1);
+
+ /* Update BASH_ARGV and BASH_ARGC */
+ if (debugging_mode)
+ push_args (words->next);
+
+ /* Number of the line on which the function body starts. */
+ line_number = function_line_number = tc->line;
+
+#if defined (JOB_CONTROL)
+ if (subshell)
+ stop_pipeline (async, (COMMAND *)NULL);
+#endif
+
+ breaking = continuing = 0;
+
+ fc = tc;
+
+ from_return_trap = 0;
+
+ return_catch_flag++;
+ return_val = setjmp_nosigs (return_catch);
+
+ if (return_val)
+ {
+ result = return_catch_value;
+ /* Run the RETURN trap in the function's context. */
+ save_current = currently_executing_command;
+ if (from_return_trap == 0)
+ run_return_trap ();
+ currently_executing_command = save_current;
+ }
+ else
+ {
+ /* Run the debug trap here so we can trap at the start of a function's
+ execution rather than the execution of the body's first command. */
+ showing_function_line = 1;
+ save_current = currently_executing_command;
+ result = run_debug_trap ();
+#if defined (DEBUGGER)
+ /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+ skip the command. */
+ if (debugging_mode == 0 || result == EXECUTION_SUCCESS)
+ {
+ showing_function_line = 0;
+ currently_executing_command = save_current;
+ result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+ /* Run the RETURN trap in the function's context */
+ save_current = currently_executing_command;
+ run_return_trap ();
+ currently_executing_command = save_current;
+ }
+#else
+ result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+ save_current = currently_executing_command;
+ run_return_trap ();
+ currently_executing_command = save_current;
+#endif
+ showing_function_line = 0;
+ }
+
+ /* Restore BASH_ARGC and BASH_ARGV */
+ if (debugging_mode)
+ pop_args ();
+
+ if (subshell == 0)
+ run_unwind_frame ("function_calling");
+
+#if defined (ARRAY_VARS)
+ /* These two variables cannot be unset, and cannot be affected by the
+ function. */
+ array_pop ((ARRAY *)bash_source_a);
+ array_pop ((ARRAY *)bash_lineno_a);
+
+ /* FUNCNAME can be unset, and so can potentially be changed by the
+ function. */
+ GET_ARRAY_FROM_VAR ("FUNCNAME", nfv, funcname_a);
+ if (nfv == funcname_v)
+ array_pop (funcname_a);
+#endif
+
+ if (variable_context == 0 || this_shell_function == 0)
+ {
+ make_funcname_visible (0);
+#if defined (PROCESS_SUBSTITUTION)
+ unlink_fifo_list ();
+#endif
+ }
+
+ return (result);
+}
+
+/* A convenience routine for use by other parts of the shell to execute
+ a particular shell function. */
+int
+execute_shell_function (var, words)
+ SHELL_VAR *var;
+ WORD_LIST *words;
+{
+ int ret;
+ struct fd_bitmap *bitmap;
+
+ bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
+ begin_unwind_frame ("execute-shell-function");
+ add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
+
+ ret = execute_function (var, words, 0, bitmap, 0, 0);
+
+ dispose_fd_bitmap (bitmap);
+ discard_unwind_frame ("execute-shell-function");
+
+ return ret;
+}
+
+/* Execute a shell builtin or function in a subshell environment. This
+ routine does not return; it only calls exit(). If BUILTIN is non-null,
+ it points to a function to call to execute a shell builtin; otherwise
+ VAR points at the body of a function to execute. WORDS is the arguments
+ to the command, REDIRECTS specifies redirections to perform before the
+ command is executed. */
+static void
+execute_subshell_builtin_or_function (words, redirects, builtin, var,
+ pipe_in, pipe_out, async, fds_to_close,
+ flags)
+ WORD_LIST *words;
+ REDIRECT *redirects;
+ sh_builtin_func_t *builtin;
+ SHELL_VAR *var;
+ int pipe_in, pipe_out, async;
+ struct fd_bitmap *fds_to_close;
+ int flags;
+{
+ int result, r, funcvalue;
+#if defined (JOB_CONTROL)
+ int jobs_hack;
+
+ jobs_hack = (builtin == jobs_builtin) &&
+ ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
+#endif
+
+ /* A subshell is neither a login shell nor interactive. */
+ login_shell = interactive = 0;
+ if (builtin == eval_builtin)
+ evalnest = 0;
+ else if (builtin == source_builtin)
+ sourcenest = 0;
+
+ if (async)
+ subshell_environment |= SUBSHELL_ASYNC;
+ if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+ subshell_environment |= SUBSHELL_PIPE;
+
+ maybe_make_export_env (); /* XXX - is this needed? */
+
+#if defined (JOB_CONTROL)
+ /* Eradicate all traces of job control after we fork the subshell, so
+ all jobs begun by this subshell are in the same process group as
+ the shell itself. */
+
+ /* Allow the output of `jobs' to be piped. */
+ if (jobs_hack)
+ kill_current_pipeline ();
+ else
+ without_job_control ();
+
+ set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+ set_sigint_handler ();
+
+ if (fds_to_close)
+ close_fd_bitmap (fds_to_close);
+
+ do_piping (pipe_in, pipe_out);
+
+ if (do_redirections (redirects, RX_ACTIVE) != 0)
+ exit (EXECUTION_FAILURE);
+
+ if (builtin)
+ {
+ /* Give builtins a place to jump back to on failure,
+ so we don't go back up to main(). */
+ result = setjmp_nosigs (top_level);
+
+ /* Give the return builtin a place to jump to when executed in a subshell
+ or pipeline */
+ funcvalue = 0;
+ if (return_catch_flag && builtin == return_builtin)
+ funcvalue = setjmp_nosigs (return_catch);
+
+ if (result == EXITPROG)
+ exit (last_command_exit_value);
+ else if (result)
+ exit (EXECUTION_FAILURE);
+ else if (funcvalue)
+ exit (return_catch_value);
+ else
+ {
+ r = execute_builtin (builtin, words, flags, 1);
+ fflush (stdout);
+ if (r == EX_USAGE)
+ r = EX_BADUSAGE;
+ exit (r);
+ }
+ }
+ else
+ {
+ r = execute_function (var, words, flags, fds_to_close, async, 1);
+ fflush (stdout);
+ exit (r);
+ }
+}
+
+/* Execute a builtin or function in the current shell context. If BUILTIN
+ is non-null, it is the builtin command to execute, otherwise VAR points
+ to the body of a function. WORDS are the command's arguments, REDIRECTS
+ are the redirections to perform. FDS_TO_CLOSE is the usual bitmap of
+ file descriptors to close.
+
+ If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are
+ not undone before this function returns. */
+static int
+execute_builtin_or_function (words, builtin, var, redirects,
+ fds_to_close, flags)
+ WORD_LIST *words;
+ sh_builtin_func_t *builtin;
+ SHELL_VAR *var;
+ REDIRECT *redirects;
+ struct fd_bitmap *fds_to_close;
+ int flags;
+{
+ int result;
+ REDIRECT *saved_undo_list;
+#if defined (PROCESS_SUBSTITUTION)
+ int ofifo, nfifo, osize;
+ char *ofifo_list;
+#endif
+
+#if defined (PROCESS_SUBSTITUTION)
+ ofifo = num_fifos ();
+ ofifo_list = copy_fifo_list (&osize);
+#endif
+
+ if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
+ {
+ cleanup_redirects (redirection_undo_list);
+ redirection_undo_list = (REDIRECT *)NULL;
+ dispose_exec_redirects ();
+#if defined (PROCESS_SUBSTITUTION)
+ free (ofifo_list);
+#endif
+ return (EX_REDIRFAIL); /* was EXECUTION_FAILURE */
+ }
+
+ saved_undo_list = redirection_undo_list;
+
+ /* Calling the "exec" builtin changes redirections forever. */
+ if (builtin == exec_builtin)
+ {
+ dispose_redirects (saved_undo_list);
+ saved_undo_list = exec_redirection_undo_list;
+ exec_redirection_undo_list = (REDIRECT *)NULL;
+ }
+ else
+ dispose_exec_redirects ();
+
+ if (saved_undo_list)
+ {
+ begin_unwind_frame ("saved-redirects");
+ add_unwind_protect (cleanup_redirects, (char *)saved_undo_list);
+ }
+
+ redirection_undo_list = (REDIRECT *)NULL;
+
+ if (builtin)
+ result = execute_builtin (builtin, words, flags, 0);
+ else
+ result = execute_function (var, words, flags, fds_to_close, 0, 0);
+
+ /* We do this before undoing the effects of any redirections. */
+ fflush (stdout);
+ fpurge (stdout);
+ if (ferror (stdout))
+ clearerr (stdout);
+
+ /* If we are executing the `command' builtin, but this_shell_builtin is
+ set to `exec_builtin', we know that we have something like
+ `command exec [redirection]', since otherwise `exec' would have
+ overwritten the shell and we wouldn't get here. In this case, we
+ want to behave as if the `command' builtin had not been specified
+ and preserve the redirections. */
+ if (builtin == command_builtin && this_shell_builtin == exec_builtin)
+ {
+ int discard;
+
+ discard = 0;
+ if (saved_undo_list)
+ {
+ dispose_redirects (saved_undo_list);
+ discard = 1;
+ }
+ redirection_undo_list = exec_redirection_undo_list;
+ saved_undo_list = exec_redirection_undo_list = (REDIRECT *)NULL;
+ if (discard)
+ discard_unwind_frame ("saved-redirects");
+ }
+
+ if (saved_undo_list)
+ {
+ redirection_undo_list = saved_undo_list;
+ discard_unwind_frame ("saved-redirects");
+ }
+
+ if (redirection_undo_list)
+ {
+ cleanup_redirects (redirection_undo_list);
+ redirection_undo_list = (REDIRECT *)NULL;
+ }
+
+#if defined (PROCESS_SUBSTITUTION)
+ /* Close any FIFOs created by this builtin or function. */
+ nfifo = num_fifos ();
+ if (nfifo > ofifo)
+ close_new_fifos (ofifo_list, osize);
+ free (ofifo_list);
+#endif
+
+ return (result);
+}
+
+void
+setup_async_signals ()
+{
+#if defined (__BEOS__)
+ set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */
+#endif
+
+#if defined (JOB_CONTROL)
+ if (job_control == 0)
+#endif
+ {
+ /* Make sure we get the original signal dispositions now so we don't
+ confuse the trap builtin later if the subshell tries to use it to
+ reset SIGINT/SIGQUIT. Don't call set_signal_ignored; that sets
+ the value of original_signals to SIG_IGN. Posix interpretation 751. */
+ get_original_signal (SIGINT);
+ set_signal_handler (SIGINT, SIG_IGN);
+
+ get_original_signal (SIGQUIT);
+ set_signal_handler (SIGQUIT, SIG_IGN);
+ }
+}
+
+/* Execute a simple command that is hopefully defined in a disk file
+ somewhere.
+
+ 1) fork ()
+ 2) connect pipes
+ 3) look up the command
+ 4) do redirections
+ 5) execve ()
+ 6) If the execve failed, see if the file has executable mode set.
+ If so, and it isn't a directory, then execute its contents as
+ a shell script.
+
+ Note that the filename hashing stuff has to take place up here,
+ in the parent. This is probably why the Bourne style shells
+ don't handle it, since that would require them to go through
+ this gnarly hair, for no good reason.
+
+ NOTE: callers expect this to fork or exit(). */
+
+/* Name of a shell function to call when a command name is not found. */
+#ifndef NOTFOUND_HOOK
+# define NOTFOUND_HOOK "command_not_found_handle"
+#endif
+
+static int
+execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
+ async, fds_to_close, cmdflags)
+ WORD_LIST *words;
+ REDIRECT *redirects;
+ char *command_line;
+ int pipe_in, pipe_out, async;
+ struct fd_bitmap *fds_to_close;
+ int cmdflags;
+{
+ char *pathname, *command, **args;
+ int nofork, result;
+ pid_t pid;
+ SHELL_VAR *hookf;
+ WORD_LIST *wl;
+
+ nofork = (cmdflags & CMD_NO_FORK); /* Don't fork, just exec, if no pipes */
+ pathname = words->word->word;
+
+ result = EXECUTION_SUCCESS;
+#if defined (RESTRICTED_SHELL)
+ command = (char *)NULL;
+ if (restricted && mbschr (pathname, '/'))
+ {
+ internal_error (_("%s: restricted: cannot specify `/' in command names"),
+ pathname);
+ result = last_command_exit_value = EXECUTION_FAILURE;
+
+ /* If we're not going to fork below, we must already be in a child
+ process or a context in which it's safe to call exit(2). */
+ if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
+ exit (last_command_exit_value);
+ else
+ goto parent_return;
+ }
+#endif /* RESTRICTED_SHELL */
+
+ command = search_for_command (pathname, 1);
+
+ if (command)
+ {
+ maybe_make_export_env ();
+ put_command_name_into_env (command);
+ }
+
+ /* We have to make the child before we check for the non-existence
+ of COMMAND, since we want the error messages to be redirected. */
+ /* If we can get away without forking and there are no pipes to deal with,
+ don't bother to fork, just directly exec the command. */
+ if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
+ pid = 0;
+ else
+ pid = make_child (savestring (command_line), async);
+
+ if (pid == 0)
+ {
+ int old_interactive;
+
+ reset_terminating_signals (); /* XXX */
+ /* Cancel traps, in trap.c. */
+ restore_original_signals ();
+
+ CHECK_SIGTERM;
+
+ /* restore_original_signals may have undone the work done
+ by make_child to ensure that SIGINT and SIGQUIT are ignored
+ in asynchronous children. */
+ if (async)
+ {
+ if ((cmdflags & CMD_STDIN_REDIR) &&
+ pipe_in == NO_PIPE &&
+ (stdin_redirects (redirects) == 0))
+ async_redirect_stdin ();
+ setup_async_signals ();
+ }
+
+ /* This functionality is now provided by close-on-exec of the
+ file descriptors manipulated by redirection and piping.
+ Some file descriptors still need to be closed in all children
+ because of the way bash does pipes; fds_to_close is a
+ bitmap of all such file descriptors. */
+ if (fds_to_close)
+ close_fd_bitmap (fds_to_close);
+
+ do_piping (pipe_in, pipe_out);
+
+ old_interactive = interactive;
+ if (async)
+ interactive = 0;
+
+ subshell_environment = SUBSHELL_FORK; /* XXX */
+
+ if (redirects && (do_redirections (redirects, RX_ACTIVE) != 0))
+ {
+#if defined (PROCESS_SUBSTITUTION)
+ /* Try to remove named pipes that may have been created as the
+ result of redirections. */
+ unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+ exit (EXECUTION_FAILURE);
+ }
+
+ if (async)
+ interactive = old_interactive;
+
+ if (command == 0)
+ {
+ hookf = find_function (NOTFOUND_HOOK);
+ if (hookf == 0)
+ {
+ /* Make sure filenames are displayed using printable characters */
+ pathname = printable_filename (pathname, 0);
+ internal_error (_("%s: command not found"), pathname);
+ exit (EX_NOTFOUND); /* Posix.2 says the exit status is 127 */
+ }
+
+#if defined (JOB_CONTROL)
+ /* May need to reinitialize more of the job control state here. */
+ kill_current_pipeline ();
+#endif
+
+ wl = make_word_list (make_word (NOTFOUND_HOOK), words);
+ exit (execute_shell_function (hookf, wl));
+ }
+
+ CHECK_SIGTERM;
+
+ /* Execve expects the command name to be in args[0]. So we
+ leave it there, in the same format that the user used to
+ type it in. */
+ args = strvec_from_word_list (words, 0, 0, (int *)NULL);
+ exit (shell_execve (command, args, export_env));
+ }
+ else
+ {
+parent_return:
+ QUIT;
+
+ /* Make sure that the pipes are closed in the parent. */
+ close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+ if (variable_context == 0)
+ unlink_fifo_list ();
+#endif
+ FREE (command);
+ return (result);
+ }
+}
+
+/* CPP defines to decide whether a particular index into the #! line
+ corresponds to a valid interpreter name or argument character, or
+ whitespace. The MSDOS define is to allow \r to be treated the same
+ as \n. */
+
+#if !defined (MSDOS)
+# define STRINGCHAR(ind) \
+ (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n')
+# define WHITECHAR(ind) \
+ (ind < sample_len && whitespace (sample[ind]))
+#else /* MSDOS */
+# define STRINGCHAR(ind) \
+ (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r')
+# define WHITECHAR(ind) \
+ (ind < sample_len && whitespace (sample[ind]))
+#endif /* MSDOS */
+
+static char *
+getinterp (sample, sample_len, endp)
+ char *sample;
+ int sample_len, *endp;
+{
+ register int i;
+ char *execname;
+ int start;
+
+ /* Find the name of the interpreter to exec. */
+ for (i = 2; i < sample_len && whitespace (sample[i]); i++)
+ ;
+
+ for (start = i; STRINGCHAR(i); i++)
+ ;
+
+ execname = substring (sample, start, i);
+
+ if (endp)
+ *endp = i;
+ return execname;
+}
+
+#if !defined (HAVE_HASH_BANG_EXEC)
+/* If the operating system on which we're running does not handle
+ the #! executable format, then help out. SAMPLE is the text read
+ from the file, SAMPLE_LEN characters. COMMAND is the name of
+ the script; it and ARGS, the arguments given by the user, will
+ become arguments to the specified interpreter. ENV is the environment
+ to pass to the interpreter.
+
+ The word immediately following the #! is the interpreter to execute.
+ A single argument to the interpreter is allowed. */
+
+static int
+execute_shell_script (sample, sample_len, command, args, env)
+ char *sample;
+ int sample_len;
+ char *command;
+ char **args, **env;
+{
+ char *execname, *firstarg;
+ int i, start, size_increment, larry;
+
+ /* Find the name of the interpreter to exec. */
+ execname = getinterp (sample, sample_len, &i);
+ size_increment = 1;
+
+ /* Now the argument, if any. */
+ for (firstarg = (char *)NULL, start = i; WHITECHAR(i); i++)
+ ;
+
+ /* If there is more text on the line, then it is an argument for the
+ interpreter. */
+
+ if (STRINGCHAR(i))
+ {
+ for (start = i; STRINGCHAR(i); i++)
+ ;
+ firstarg = substring ((char *)sample, start, i);
+ size_increment = 2;
+ }
+
+ larry = strvec_len (args) + size_increment;
+ args = strvec_resize (args, larry + 1);
+
+ for (i = larry - 1; i; i--)
+ args[i] = args[i - size_increment];
+
+ args[0] = execname;
+ if (firstarg)
+ {
+ args[1] = firstarg;
+ args[2] = command;
+ }
+ else
+ args[1] = command;
+
+ args[larry] = (char *)NULL;
+
+ return (shell_execve (execname, args, env));
+}
+#undef STRINGCHAR
+#undef WHITECHAR
+
+#endif /* !HAVE_HASH_BANG_EXEC */
+
+static void
+initialize_subshell ()
+{
+#if defined (ALIAS)
+ /* Forget about any aliases that we knew of. We are in a subshell. */
+ delete_all_aliases ();
+#endif /* ALIAS */
+
+#if defined (HISTORY)
+ /* Forget about the history lines we have read. This is a non-interactive
+ subshell. */
+ history_lines_this_session = 0;
+#endif
+
+#if defined (JOB_CONTROL)
+ /* Forget about the way job control was working. We are in a subshell. */
+ without_job_control ();
+ set_sigchld_handler ();
+ init_job_stats ();
+#endif /* JOB_CONTROL */
+
+ /* Reset the values of the shell flags and options. */
+ reset_shell_flags ();
+ reset_shell_options ();
+ reset_shopt_options ();
+
+ /* Zero out builtin_env, since this could be a shell script run from a
+ sourced file with a temporary environment supplied to the `source/.'
+ builtin. Such variables are not supposed to be exported (empirical
+ testing with sh and ksh). Just throw it away; don't worry about a
+ memory leak. */
+ if (vc_isbltnenv (shell_variables))
+ shell_variables = shell_variables->down;
+
+ clear_unwind_protect_list (0);
+ /* XXX -- are there other things we should be resetting here? */
+ parse_and_execute_level = 0; /* nothing left to restore it */
+
+ /* We're no longer inside a shell function. */
+ variable_context = return_catch_flag = funcnest = evalnest = sourcenest = 0;
+
+ executing_list = 0; /* XXX */
+
+ /* If we're not interactive, close the file descriptor from which we're
+ reading the current shell script. */
+ if (interactive_shell == 0)
+ unset_bash_input (0);
+}
+
+#if defined (HAVE_SETOSTYPE) && defined (_POSIX_SOURCE)
+# define SETOSTYPE(x) __setostype(x)
+#else
+# define SETOSTYPE(x)
+#endif
+
+#define READ_SAMPLE_BUF(file, buf, len) \
+ do \
+ { \
+ fd = open(file, O_RDONLY); \
+ if (fd >= 0) \
+ { \
+ len = read (fd, buf, 80); \
+ close (fd); \
+ } \
+ else \
+ len = -1; \
+ } \
+ while (0)
+
+/* Call execve (), handling interpreting shell scripts, and handling
+ exec failures. */
+int
+shell_execve (command, args, env)
+ char *command;
+ char **args, **env;
+{
+ int larray, i, fd;
+ char sample[80];
+ int sample_len;
+
+ SETOSTYPE (0); /* Some systems use for USG/POSIX semantics */
+ execve (command, args, env);
+ i = errno; /* error from execve() */
+ CHECK_TERMSIG;
+ SETOSTYPE (1);
+
+ /* If we get to this point, then start checking out the file.
+ Maybe it is something we can hack ourselves. */
+ if (i != ENOEXEC)
+ {
+ /* make sure this is set correctly for file_error/report_error */
+ last_command_exit_value = (i == ENOENT) ? EX_NOTFOUND : EX_NOEXEC; /* XXX Posix.2 says that exit status is 126 */
+ if (file_isdir (command))
+#if defined (EISDIR)
+ internal_error (_("%s: %s"), command, strerror (EISDIR));
+#else
+ internal_error (_("%s: is a directory"), command);
+#endif
+ else if (executable_file (command) == 0)
+ {
+ errno = i;
+ file_error (command);
+ }
+ /* errors not involving the path argument to execve. */
+ else if (i == E2BIG || i == ENOMEM)
+ {
+ errno = i;
+ file_error (command);
+ }
+ else
+ {
+ /* The file has the execute bits set, but the kernel refuses to
+ run it for some reason. See why. */
+#if defined (HAVE_HASH_BANG_EXEC)
+ READ_SAMPLE_BUF (command, sample, sample_len);
+ sample[sample_len - 1] = '\0';
+ if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
+ {
+ char *interp;
+ int ilen;
+
+ interp = getinterp (sample, sample_len, (int *)NULL);
+ ilen = strlen (interp);
+ errno = i;
+ if (interp[ilen - 1] == '\r')
+ {
+ interp = xrealloc (interp, ilen + 2);
+ interp[ilen - 1] = '^';
+ interp[ilen] = 'M';
+ interp[ilen + 1] = '\0';
+ }
+ sys_error (_("%s: %s: bad interpreter"), command, interp ? interp : "");
+ FREE (interp);
+ return (EX_NOEXEC);
+ }
+#endif
+ errno = i;
+ file_error (command);
+ }
+ return (last_command_exit_value);
+ }
+
+ /* This file is executable.
+ If it begins with #!, then help out people with losing operating
+ systems. Otherwise, check to see if it is a binary file by seeing
+ if the contents of the first line (or up to 80 characters) are in the
+ ASCII set. If it's a text file, execute the contents as shell commands,
+ otherwise return 126 (EX_BINARY_FILE). */
+ READ_SAMPLE_BUF (command, sample, sample_len);
+
+ if (sample_len == 0)
+ return (EXECUTION_SUCCESS);
+
+ /* Is this supposed to be an executable script?
+ If so, the format of the line is "#! interpreter [argument]".
+ A single argument is allowed. The BSD kernel restricts
+ the length of the entire line to 32 characters (32 bytes
+ being the size of the BSD exec header), but we allow 80
+ characters. */
+ if (sample_len > 0)
+ {
+#if !defined (HAVE_HASH_BANG_EXEC)
+ if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
+ return (execute_shell_script (sample, sample_len, command, args, env));
+ else
+#endif
+ if (check_binary_file (sample, sample_len))
+ {
+ internal_error (_("%s: cannot execute binary file: %s"), command, strerror (i));
+ return (EX_BINARY_FILE);
+ }
+ }
+
+ /* We have committed to attempting to execute the contents of this file
+ as shell commands. */
+
+ initialize_subshell ();
+
+ set_sigint_handler ();
+
+ /* Insert the name of this shell into the argument list. */
+ larray = strvec_len (args) + 1;
+ args = strvec_resize (args, larray + 1);
+
+ for (i = larray - 1; i; i--)
+ args[i] = args[i - 1];
+
+ args[0] = shell_name;
+ args[1] = command;
+ args[larray] = (char *)NULL;
+
+ if (args[0][0] == '-')
+ args[0]++;
+
+#if defined (RESTRICTED_SHELL)
+ if (restricted)
+ change_flag ('r', FLAG_OFF);
+#endif
+
+ if (subshell_argv)
+ {
+ /* Can't free subshell_argv[0]; that is shell_name. */
+ for (i = 1; i < subshell_argc; i++)
+ free (subshell_argv[i]);
+ free (subshell_argv);
+ }
+
+ dispose_command (currently_executing_command); /* XXX */
+ currently_executing_command = (COMMAND *)NULL;
+
+ subshell_argc = larray;
+ subshell_argv = args;
+ subshell_envp = env;
+
+ unbind_args (); /* remove the positional parameters */
+
+#if defined (PROCESS_SUBSTITUTION)
+ clear_fifo_list (); /* pipe fds are what they are now */
+#endif
+
+ longjmp (subshell_top_level, 1);
+ /*NOTREACHED*/
+}
+
+static int
+execute_intern_function (name, funcdef)
+ WORD_DESC *name;
+ FUNCTION_DEF *funcdef;
+{
+ SHELL_VAR *var;
+
+ if (check_identifier (name, posixly_correct) == 0)
+ {
+ if (posixly_correct && interactive_shell == 0)
+ {
+ last_command_exit_value = EX_BADUSAGE;
+ jump_to_top_level (ERREXIT);
+ }
+ return (EXECUTION_FAILURE);
+ }
+
+ /* Posix interpretation 383 */
+ if (posixly_correct && find_special_builtin (name->word))
+ {
+ internal_error (_("`%s': is a special builtin"), name->word);
+ last_command_exit_value = EX_BADUSAGE;
+ jump_to_top_level (interactive_shell ? DISCARD : ERREXIT);
+ }
+
+ var = find_function (name->word);
+ if (var && (readonly_p (var) || noassign_p (var)))
+ {
+ if (readonly_p (var))
+ internal_error (_("%s: readonly function"), var->name);
+ return (EXECUTION_FAILURE);
+ }
+
+#if defined (DEBUGGER)
+ bind_function_def (name->word, funcdef);
+#endif
+
+ bind_function (name->word, funcdef->command);
+ return (EXECUTION_SUCCESS);
+}
+
+#if defined (INCLUDE_UNUSED)
+#if defined (PROCESS_SUBSTITUTION)
+void
+close_all_files ()
+{
+ register int i, fd_table_size;
+
+ fd_table_size = getdtablesize ();
+ if (fd_table_size > 256) /* clamp to a reasonable value */
+ fd_table_size = 256;
+
+ for (i = 3; i < fd_table_size; i++)
+ close (i);
+}
+#endif /* PROCESS_SUBSTITUTION */
+#endif
+
+static void
+close_pipes (in, out)
+ int in, out;
+{
+ if (in >= 0)
+ close (in);
+ if (out >= 0)
+ close (out);
+}
+
+static void
+dup_error (oldd, newd)
+ int oldd, newd;
+{
+ sys_error (_("cannot duplicate fd %d to fd %d"), oldd, newd);
+}
+
+/* Redirect input and output to be from and to the specified pipes.
+ NO_PIPE and REDIRECT_BOTH are handled correctly. */
+static void
+do_piping (pipe_in, pipe_out)
+ int pipe_in, pipe_out;
+{
+ if (pipe_in != NO_PIPE)
+ {
+ if (dup2 (pipe_in, 0) < 0)
+ dup_error (pipe_in, 0);
+ if (pipe_in > 0)
+ close (pipe_in);
+#ifdef __CYGWIN__
+ /* Let stdio know the fd may have changed from text to binary mode. */
+ freopen (NULL, "r", stdin);
+#endif /* __CYGWIN__ */
+ }
+ if (pipe_out != NO_PIPE)
+ {
+ if (pipe_out != REDIRECT_BOTH)
+ {
+ if (dup2 (pipe_out, 1) < 0)
+ dup_error (pipe_out, 1);
+ if (pipe_out == 0 || pipe_out > 1)
+ close (pipe_out);
+ }
+ else
+ {
+ if (dup2 (1, 2) < 0)
+ dup_error (1, 2);
+ }
+#ifdef __CYGWIN__
+ /* Let stdio know the fd may have changed from text to binary mode, and
+ make sure to preserve stdout line buffering. */
+ freopen (NULL, "w", stdout);
+ sh_setlinebuf (stdout);
+#endif /* __CYGWIN__ */
+ }
+}
--- /dev/null
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+RM = rm -f
+
+MAKEINFO = makeinfo
+TEXI2DVI = texi2dvi
+TEXI2HTML = texi2html
+QUIETPS = #set this to -q to shut up dvips
+DVIPS = dvips -D 300 $(QUIETPS) -o $@ # tricky
+
+INSTALL_DATA = cp
+infodir = /usr/local/info
+
+RLSRC = rlman.texinfo rluser.texinfo rltech.texinfo
+HISTSRC = hist.texinfo hsuser.texinfo hstech.texinfo
+
+DVIOBJ = readline.dvi history.dvi
+INFOOBJ = readline.info history.info
+PSOBJ = readline.ps history.ps
+HTMLOBJ = readline.html history.html
+
+all: info dvi html ps
+nodvi: info html
+
+readline.dvi: $(RLSRC)
+ $(TEXI2DVI) rlman.texinfo
+ mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+ $(MAKEINFO) --no-split -o $@ rlman.texinfo
+
+history.dvi: ${HISTSRC}
+ $(TEXI2DVI) hist.texinfo
+ mv hist.dvi history.dvi
+
+history.info: ${HISTSRC}
+ $(MAKEINFO) --no-split -o $@ hist.texinfo
+
+readline.ps: readline.dvi
+ $(RM) $@
+ $(DVIPS) readline.dvi
+
+history.ps: history.dvi
+ $(RM) $@
+ $(DVIPS) history.dvi
+
+readline.html: ${RLSRC}
+ $(TEXI2HTML) rlman.texinfo
+ sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman.html > readline.html
+ sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman_toc.html > readline_toc.html
+ $(RM) rlman.html rlman_toc.html
+
+history.html: ${HISTSRC}
+ $(TEXI2HTML) hist.texinfo
+ sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist.html > history.html
+ sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist_toc.html > history_toc.html
+ $(RM) hist.html hist_toc.html
+
+info: $(INFOOBJ)
+dvi: $(DVIOBJ)
+ps: $(PSOBJ)
+html: $(HTMLOBJ)
+
+clean:
+ $(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+ *.fns *.kys *.tps *.vrs *.o core
+
+distclean: clean
+mostlyclean: clean
+
+maintainer-clean: clean
+ $(RM) *.dvi *.info *.info-* *.ps *.html
+
+install: info
+ ${INSTALL_DATA} readline.info $(infodir)/readline.info
+ ${INSTALL_DATA} history.info $(infodir)/history.info
if (shell_input_line == 0)
return 0;
if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
- return '\0'; /* XXX */
+ return ""; /* XXX */
return (shell_input_line + shell_input_line_index);
}
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 28
+#define PATCHLEVEL 30
#endif /* _PATCHLEVEL_H_ */
-# Russian translations for GNU bash package
-# áÎÇÌÉÊÓËÉÅ ÐÅÒÅ×ÏÄÙ ÄÌÑ ÐÁËÅÔÁ GNU bash.
-# Copyright (C) 2006 Free Software Foundation, Inc.
-# This file is distributed under the same license as the GNU bash package.
-# <dushistov@mail.ru>, 2006.
+# GNU Bourne Again SHell.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the bash package.
+# Ruslan Batdalov <linnando@tolkien.ru>, 2002.
+# Pavel Maryanov <acid@jack.kiev.ua>, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: GNU bash 3.1-release\n"
+"Project-Id-Version: bash 4.3-rc2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-11 11:19-0500\n"
-"PO-Revision-Date: 2006-01-05 21:28+0300\n"
-"Last-Translator: Evgeniy Dushistov <dushistov@mail.ru>\n"
-"Language-Team: Russian <ru@li.org>\n"
-"Language: ru\n"
+"POT-Creation-Date: 2014-01-23 16:04-0500\n"
+"PO-Revision-Date: 2014-10-07 14:09+0200\n"
+"Last-Translator: Pavel Maryanov <acid@jack.kiev.ua>\n"
+"Language-Team: Russian <gnu@mx.ru>\n"
+"Language: Russian\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=KOI8-R\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 1.6.9\n"
#: arrayfunc.c:51
msgid "bad array subscript"
-msgstr "ÎÅÐÒÁ×ÉÌØÎÙÊ ÉÎÄÅËÓ ÍÁÓÓÉ×Á"
+msgstr "неправильный индекс массива"
#: arrayfunc.c:356 builtins/declare.def:566
#, c-format
msgid "%s: cannot convert indexed to associative array"
-msgstr ""
+msgstr "%s: не удаётся преобразовать индекс в ассоциативный массив"
#: arrayfunc.c:539
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid associative array key"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ ÏÐÃÉÉ"
+msgstr "%s: недействительный ключ ассоциативного массива"
#: arrayfunc.c:541
#, c-format
msgid "%s: cannot assign to non-numeric index"
-msgstr "%s; ÎÅ ÍÏÇÕ ÐÒÉÐÉÓÁÔØ ÎÅ ÞÉÓÌÏ×ÏÊ ÉÎÄÅËÓ"
+msgstr "%s: не удаётся присвоить значение нечисловому индексу"
#: arrayfunc.c:586
#, c-format
msgid "%s: %s: must use subscript when assigning associative array"
-msgstr ""
+msgstr "%s: %s: необходимо использовать индекс при назначении ассоциативному массиву"
#: bashhist.c:388
#, c-format
msgid "%s: cannot create: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÓÏÚÄÁÔØ: %s"
+msgstr "%s: не удаётся создать файл: %s"
-#: bashline.c:3982
+#: bashline.c:3971
msgid "bash_execute_unix_command: cannot find keymap for command"
-msgstr ""
+msgstr "bash_execute_unix_command: не удаётся найти keymap для команды"
-#: bashline.c:4069
+#: bashline.c:4058
#, c-format
msgid "%s: first non-whitespace character is not `\"'"
-msgstr "%s: ÐÅÒ×ÙÊ ÎÅÐÒÏÂÅÌØÎÙÊ ÓÉÍ×ÏÌ ÎÅ `\"'"
+msgstr "%s: пеÑ\80вÑ\8bй непÑ\80обелÑ\8cнÑ\8bй Ñ\81имвол не Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f «\"»"
-#: bashline.c:4098
+#: bashline.c:4087
#, c-format
msgid "no closing `%c' in %s"
-msgstr "ÎÅÔ ÚÁËÒÙ×ÁÀÝÅÇÏ `%c' × %s"
+msgstr "нет закрывающего «%c» в %s"
-#: bashline.c:4132
+#: bashline.c:4121
#, c-format
msgid "%s: missing colon separator"
-msgstr "%s: ÐÒÏÐÕÝÅÎ ÒÁÚÄÅÌÉÔÅÌØ Ä×ÏÅÔÏÞÉÅ"
+msgstr "%s: оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\80азделиÑ\82елÑ\8c-двоеÑ\82оÑ\87ие"
#: braces.c:321
#, c-format
msgid "brace expansion: cannot allocate memory for %s"
-msgstr ""
+msgstr "расширение скобки: не удаётся выделить память для %s"
#: braces.c:413
#, c-format
msgid "brace expansion: failed to allocate memory for %d elements"
-msgstr ""
+msgstr "расширение скобки: не удаётся выделить память для %d элементов"
#: braces.c:452
#, c-format
msgid "brace expansion: failed to allocate memory for `%s'"
-msgstr ""
+msgstr "расширение скобки: не удалось выделить память для «%s»"
#: builtins/alias.def:132
-#, fuzzy, c-format
+#, c-format
msgid "`%s': invalid alias name"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ ÏÐÃÉÉ"
+msgstr "«%s»: недопустимый псевдоним"
#: builtins/bind.def:123 builtins/bind.def:126
msgid "line editing not enabled"
-msgstr ""
+msgstr "редактирование строки не включено"
#: builtins/bind.def:212
#, c-format
msgid "`%s': invalid keymap name"
-msgstr ""
+msgstr "«%s»: недопустимое название keymap"
#: builtins/bind.def:251
#, c-format
msgid "%s: cannot read: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÐÒÏÞÉÔÁÔØ: %s"
+msgstr "%s: не удаётся прочитать файл: %s"
#: builtins/bind.def:266
#, c-format
msgid "`%s': cannot unbind"
-msgstr ""
+msgstr "«%s»: не удаётся отменить привязку"
#: builtins/bind.def:304 builtins/bind.def:334
#, c-format
msgid "`%s': unknown function name"
-msgstr "`%s': ÉÍÑ ÆÕÎËÃÉÉ ÎÅÉÚ×ÅÓÔÎÏ"
+msgstr "«%s»: неизвестное название функции"
#: builtins/bind.def:312
#, c-format
msgid "%s is not bound to any keys.\n"
-msgstr "%s ÎÅ ÐÒÉ×ÑÚÁÎÁ ÎÅ Ë ÏÄÎÏÊ ÉÚ ËÌÁ×ÉÛ.\n"
+msgstr "%s не привязан ни к какой клавише.\n"
#: builtins/bind.def:316
#, c-format
msgid "%s can be invoked via "
-msgstr "%s ÍÏÖÅÔ ÂÙÔØ ×ÙÚ×ÁÎ Ó ÐÏÍÏÝØÀ"
+msgstr "%s можно вызвать через "
#: builtins/break.def:77 builtins/break.def:117
msgid "loop count"
-msgstr ""
+msgstr "счётчик циклов"
#: builtins/break.def:137
msgid "only meaningful in a `for', `while', or `until' loop"
-msgstr "ÉÍÅÅÔ ÓÍÙÓÌ ÔÏÌØËÏ × ÃÉËÌÁÈ `for', `while', ÉÌÉ `until'"
+msgstr "имеет значение только для циклов «for», «while» или «until»"
#: builtins/caller.def:134
msgid ""
" \n"
" Without EXPR, returns "
msgstr ""
+"Возвращает контекст вызова текущей подпрограммы.\n"
+" \n"
+" Без EXPR выполняет возврат "
#: builtins/cd.def:319
msgid "HOME not set"
-msgstr "ÐÅÒÅÍÅÎÎÁÑ HOME ÎÅ ÕÓÔÁÎÏ×ÌÅÎÁ"
+msgstr "Ð\9dе задана пеÑ\80еменнаÑ\8f HOME"
-#: builtins/cd.def:327 builtins/common.c:166 test.c:876
+#: builtins/cd.def:327 builtins/common.c:166 test.c:855
msgid "too many arguments"
-msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÁÒÇÕÍÅÎÔÏ×"
+msgstr "слишком много аргументов"
#: builtins/cd.def:338
msgid "OLDPWD not set"
-msgstr "ÐÅÒÅÍÅÎÎÁÑ OLDPWD ÎÅ ÕÓÔÁÎÏ×ÌÅÎÁ"
+msgstr "Ð\9dе задана пеÑ\80еменнаÑ\8f OLDPWD"
#: builtins/common.c:101
#, c-format
msgid "line %d: "
-msgstr ""
+msgstr "строка %d: "
#: builtins/common.c:139 error.c:265
-#, fuzzy, c-format
+#, c-format
msgid "warning: "
-msgstr "%s: ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ:"
+msgstr "предупреждение: "
#: builtins/common.c:153
-#, fuzzy, c-format
+#, c-format
msgid "%s: usage: "
-msgstr "%s: ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ:"
+msgstr "%s: иÑ\81полÑ\8cзование: "
#: builtins/common.c:191 shell.c:506 shell.c:788
#, c-format
msgid "%s: option requires an argument"
-msgstr "%s: ÏÐÃÉÑ ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔÁ"
+msgstr "%s: для параметра требуется аргумент"
#: builtins/common.c:198
#, c-format
msgid "%s: numeric argument required"
-msgstr "%s: ÔÒÅÂÕÅÔÓÑ ÞÉÓÌÏ×ÏÊ ÁÒÇÕÍÅÎÔ"
+msgstr "%s: требуется числовой аргумент"
#: builtins/common.c:205
#, c-format
msgid "%s: not found"
-msgstr "%s: ÎÅ ÎÁÊÄÅÎ"
+msgstr "%s: не найден"
#: builtins/common.c:214 shell.c:801
#, c-format
msgid "%s: invalid option"
-msgstr "%s: ÎÅÐÒÁ×ÉÌØÎÁÑ ÏÐÃÉÑ"
+msgstr "%s: недопустимый параметр"
#: builtins/common.c:221
#, c-format
msgid "%s: invalid option name"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ ÏÐÃÉÉ"
+msgstr "%s: недопустимое название параметра"
-#: builtins/common.c:228 general.c:235 general.c:240
+#: builtins/common.c:228 general.c:234 general.c:239
#, c-format
msgid "`%s': not a valid identifier"
-msgstr "`%s': ÎÅÐÒÁ×ÉÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ"
+msgstr "«%s»: это недопустимый идентификатор"
#: builtins/common.c:238
-#, fuzzy
msgid "invalid octal number"
-msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÎÏÍÅÒ ÓÉÇÎÁÌÁ"
+msgstr "недопустимое восьмеричное число"
#: builtins/common.c:240
-#, fuzzy
msgid "invalid hex number"
-msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÞÉÓÌÏ"
+msgstr "недопустимое шестнадцатеричное число"
#: builtins/common.c:242 expr.c:1470
msgid "invalid number"
-msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÞÉÓÌÏ"
+msgstr "недопустимое число"
#: builtins/common.c:250
#, c-format
msgid "%s: invalid signal specification"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÁÑ ÓÐÅÃÉÆÉËÁÃÉÑ ÓÉÇÎÁÌÁ"
+msgstr "%s: недопустимое указание сигнала"
#: builtins/common.c:257
#, c-format
msgid "`%s': not a pid or valid job spec"
-msgstr "`%s': ÎÅ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÒÏÃÅÓÓÁ ÉÌÉ ÐÒÁ×ÉÌØÎÏÅ ÉÍÑ ÚÁÄÁÞÉ"
+msgstr "«%s»: это не идентификатор процесса и не допустимый указатель задания"
#: builtins/common.c:264 error.c:488
#, c-format
msgid "%s: readonly variable"
-msgstr "%s: ÄÏÓÔÕÐÎÁÑ ÔÏÌØËÏ ÎÁ ÞÔÅÎÉÅ ÐÅÒÅÍÅÎÎÁÑ"
+msgstr "%s: переменная только для чтения"
#: builtins/common.c:272
#, c-format
msgid "%s: %s out of range"
-msgstr "%s: %s ×ÙÈÏÄÉÔ ÚÁ ÐÒÅÄÅÌÙ ÄÏÐÕÓÔÉÍÙÈ ÚÎÁÞÅÎÉÊ"
+msgstr "%s: %s за пределами диапазона"
#: builtins/common.c:272 builtins/common.c:274
msgid "argument"
-msgstr "ÁÒÇÕÍÅÎÔ"
+msgstr "аргумент"
#: builtins/common.c:274
#, c-format
msgid "%s out of range"
-msgstr "%s ×ÙÈÏÄÉÔ ÚÁ ÐÒÅÄÅÌÙ ÄÏÐÕÓÔÉÍÙÈ ÚÎÁÞÅÎÉÊ"
+msgstr "%s за пределами диапазона"
#: builtins/common.c:282
#, c-format
msgid "%s: no such job"
-msgstr "%s: ÎÅ ÔÁËÏÊ ÚÁÄÁÞÉ"
+msgstr "%s: нет такого задания"
#: builtins/common.c:290
#, c-format
msgid "%s: no job control"
-msgstr ""
+msgstr "%s: нет управления заданиями"
#: builtins/common.c:292
msgid "no job control"
-msgstr ""
+msgstr "нет управления заданиями"
#: builtins/common.c:302
#, c-format
msgid "%s: restricted"
-msgstr ""
+msgstr "%s: ограниченный режим"
#: builtins/common.c:304
msgid "restricted"
-msgstr ""
+msgstr "ограниченный режим"
#: builtins/common.c:312
#, c-format
msgid "%s: not a shell builtin"
-msgstr "%s: ÎÅ ×ÓÔÒÏÅÎÎÁ × ÏÂÏÌÏÞËÕ"
+msgstr "%s: это не не встроенная команда bash"
#: builtins/common.c:321
#, c-format
msgid "write error: %s"
-msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ: %s"
+msgstr "ошибка записи: %s"
#: builtins/common.c:329
#, c-format
msgid "error setting terminal attributes: %s"
-msgstr ""
+msgstr "ошибка назначения атрибутов терминала: %s"
#: builtins/common.c:331
#, c-format
msgid "error getting terminal attributes: %s"
-msgstr ""
+msgstr "ошибка получения атрибутов терминала: %s"
#: builtins/common.c:563
#, c-format
msgid "%s: error retrieving current directory: %s: %s\n"
-msgstr "%s: ÏÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ ÔÅËÕÝÅÊ ÄÉÒÅËÔÏÒÉÉ: %s: %s\n"
+msgstr "%s: ошибка определения текущего каталога: %s: %s\n"
#: builtins/common.c:629 builtins/common.c:631
#, c-format
msgid "%s: ambiguous job spec"
-msgstr ""
+msgstr "%s: неоднозначный указатель задания"
#: builtins/complete.def:277
#, c-format
msgid "%s: invalid action name"
-msgstr ""
+msgstr "%s: недопустимое название действия"
#: builtins/complete.def:450 builtins/complete.def:645
#: builtins/complete.def:855
#, c-format
msgid "%s: no completion specification"
-msgstr ""
+msgstr "%s: нет определения завершения"
#: builtins/complete.def:697
msgid "warning: -F option may not work as you expect"
-msgstr ""
+msgstr "предупреждение: параметр -F может работать не так, как ожидается"
#: builtins/complete.def:699
msgid "warning: -C option may not work as you expect"
-msgstr ""
+msgstr "предупреждение: параметр -C может работать не так, как ожидается"
#: builtins/complete.def:828
msgid "not currently executing completion function"
-msgstr ""
+msgstr "сейчас не выполняет функцию завершения"
#: builtins/declare.def:126
msgid "can only be used in a function"
-msgstr "ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÁ ÔÏÌØËÏ × ÆÕÎËÃÉÉ"
+msgstr "можно использовать только внутри функции"
#: builtins/declare.def:315 builtins/declare.def:509
#, c-format
msgid "%s: reference variable cannot be an array"
-msgstr ""
+msgstr "%s: ссылочная переменная не может быть массивом"
#: builtins/declare.def:324
#, c-format
msgid "%s: nameref variable self references not allowed"
-msgstr ""
+msgstr "%s: переменные nameref, ссылающиеся сами на себя, не допускаются"
#: builtins/declare.def:398
msgid "cannot use `-f' to make functions"
-msgstr ""
+msgstr "«-f» нельзя использовать для создания функций"
-#: builtins/declare.def:410 execute_cmd.c:5361
+#: builtins/declare.def:410 execute_cmd.c:5349
#, c-format
msgid "%s: readonly function"
-msgstr "%s: ÄÏÓÔÕÐÎÁÑ ÔÏÌØËÏ ÎÁ ÞÔÅÎÉÅ ÆÕÎËÃÉÑ"
+msgstr "%s: значение функции можно только считать"
#: builtins/declare.def:553
#, c-format
msgid "%s: cannot destroy array variables in this way"
-msgstr "%s: ÎÅ ÍÏÇÕ ÕÄÁÌÉÔØ ÐÅÒÅÍÅÎÎÕÀ-ÍÁÓÓÉ× ÔÁËÉÍ ÓÐÏÓÏÂÏÍ"
+msgstr "%s: переменные массива нельзя уничтожить таким образом"
#: builtins/declare.def:560 builtins/read.def:733
#, c-format
msgid "%s: cannot convert associative to indexed array"
-msgstr ""
+msgstr "%s: не удаётся преобразовать ассоциативный массив в индексированный"
#: builtins/enable.def:137 builtins/enable.def:145
msgid "dynamic loading not available"
-msgstr ""
+msgstr "динамическая загрузка недоступна"
#: builtins/enable.def:312
#, c-format
msgid "cannot open shared object %s: %s"
-msgstr ""
+msgstr "не удаётся открыть общий объект %s: %s"
#: builtins/enable.def:335
#, c-format
msgid "cannot find %s in shared object %s: %s"
-msgstr ""
+msgstr "не удаётся найти %s в общем объекте %s: %s"
#: builtins/enable.def:459
#, c-format
msgid "%s: not dynamically loaded"
-msgstr ""
+msgstr "%s: не загружается динамически"
#: builtins/enable.def:474
#, c-format
msgid "%s: cannot delete: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÕÄÁÌÉÔØ: %s"
+msgstr "%s: не удаётся удалить: %s"
-#: builtins/evalfile.c:140 builtins/hash.def:171 execute_cmd.c:5208
+#: builtins/evalfile.c:140 builtins/hash.def:171 execute_cmd.c:5196
#: shell.c:1481
#, c-format
msgid "%s: is a directory"
-msgstr "%s: Ñ×ÌÑÅÔÓÑ ÄÉÒÅËÔÏÒÉÅÊ"
+msgstr "%s: Ñ\8dÑ\82о каÑ\82алог"
#: builtins/evalfile.c:146
#, c-format
msgid "%s: not a regular file"
-msgstr "%s: ÎÅ Ñ×ÌÑÅÔÓÑ ÏÂÙÞÎÙÍ ÆÁÊÌÏÍ"
+msgstr "%s: это не обычный файл"
#: builtins/evalfile.c:155
#, c-format
msgid "%s: file is too large"
-msgstr "%s: ÓÌÉÛËÏÍ ÂÏÌØÛÏÊ ÆÁÊÌ"
+msgstr "%s: файл слишком велик"
#: builtins/evalfile.c:190 builtins/evalfile.c:208 shell.c:1491
#, c-format
msgid "%s: cannot execute binary file"
-msgstr "%s: ÎÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ ÂÉÎÁÒÎÙÊ ÆÁÊÌ"
+msgstr "%s: не удаётся запустить бинарный файл"
#: builtins/exec.def:154 builtins/exec.def:156 builtins/exec.def:228
#, c-format
msgid "%s: cannot execute: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ: %s"
+msgstr "%s: не удаётся запустить: %s"
#: builtins/exit.def:65
#, c-format
msgid "logout\n"
-msgstr ""
+msgstr "выход\n"
#: builtins/exit.def:88
msgid "not login shell: use `exit'"
-msgstr ""
-"ÏÂÏÌÏÞËÁ ÎÅ Ñ×ÌÑÅÔÓÑ ÚÁÐÕÝÅÎÎÏÊ ÐÏÓÌÅ ×ÈÏÄÁ × ÓÉÓÔÅÍÕ: ÉÓÐÏÌØÚÕÊÔÅ `exit' "
+msgstr "не командный процессор login: используйте «exit»"
#: builtins/exit.def:120
#, c-format
msgid "There are stopped jobs.\n"
-msgstr "åÓÔØ ÐÒÉÏÓÔÁÎÏ×ÌÅÎÎÙÅ ÚÁÄÁÞÉ.\n"
+msgstr "Есть остановленные задания.\n"
#: builtins/exit.def:122
-#, fuzzy, c-format
+#, c-format
msgid "There are running jobs.\n"
-msgstr "åÓÔØ ÐÒÉÏÓÔÁÎÏ×ÌÅÎÎÙÅ ÚÁÄÁÞÉ.\n"
+msgstr "Есть выполняемые задания.\n"
#: builtins/fc.def:262
msgid "no command found"
-msgstr "ÎÅ ÎÁÛÅÌ ÔÁËÕÀ ËÏÍÁÎÄÕ"
+msgstr "команда не найдена"
#: builtins/fc.def:320 builtins/fc.def:369
msgid "history specification"
-msgstr ""
+msgstr "указание журнала команд"
#: builtins/fc.def:390
#, c-format
msgid "%s: cannot open temp file: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ: %s"
+msgstr "%s: не удаётся открыть временный файл: %s"
#: builtins/fg_bg.def:149 builtins/jobs.def:282
msgid "current"
-msgstr ""
+msgstr "текущий"
#: builtins/fg_bg.def:158
#, c-format
msgid "job %d started without job control"
-msgstr ""
+msgstr "задание %d запущено без возможности управления"
#: builtins/getopt.c:110
#, c-format
msgid "%s: illegal option -- %c\n"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÁÑ ÏÐÃÉÑ -- %c\n"
+msgstr "%s: недопустимый параметр — %c\n"
#: builtins/getopt.c:111
#, c-format
msgid "%s: option requires an argument -- %c\n"
-msgstr ""
+msgstr "%s: для параметра требуется аргумент — %c\n"
#: builtins/hash.def:92
msgid "hashing disabled"
-msgstr ""
+msgstr "хэширование отключено"
#: builtins/hash.def:138
#, c-format
msgid "%s: hash table empty\n"
-msgstr ""
+msgstr "%s: таблица хэшей пустая\n"
#: builtins/hash.def:245
-#, fuzzy, c-format
+#, c-format
msgid "hits\tcommand\n"
-msgstr "ÐÏÓÌÅÄÎÑÑ ËÏÍÁÎÄÁ: %s\n"
+msgstr "вÑ\8bзовÑ\8b\tкоманда\n"
#: builtins/help.def:130
#, c-format
msgid "Shell commands matching keyword `"
msgid_plural "Shell commands matching keywords `"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Команды, соответствующие ключевому слову «"
+msgstr[1] "Команды, соответствующие ключевым словам «"
+msgstr[2] "Команды, соответствующие ключевым словам «"
#: builtins/help.def:182
#, c-format
-msgid ""
-"no help topics match `%s'. Try `help help' or `man -k %s' or `info %s'."
-msgstr ""
+msgid "no help topics match `%s'. Try `help help' or `man -k %s' or `info %s'."
+msgstr "нет разделов справки, соответствующих «%s». Попробуйте ввести «help help» или «man -k %s» или «info %s»."
#: builtins/help.def:199
#, c-format
msgid "%s: cannot open: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ: %s"
+msgstr "%s: не удаётся открыть файл: %s"
#: builtins/help.def:485
#, c-format
"A star (*) next to a name means that the command is disabled.\n"
"\n"
msgstr ""
+"Показанные ниже команды определены внутри командного процессора. Чтобы вывести полный список, введите «help».\n"
+"Чтобы вывести справку по функции «name», введите «help name».\n"
+"Чтобы вывести справку по командному процессору, введите «info bash».\n"
+"Чтобы вывести справку по командам, которые отсутствуют в этом списке, введите «man -k» или «info».\n"
+"\n"
+"Звёздочка (*) рядом с названием команды означает, что эта команда отключена.\n"
+"\n"
#: builtins/history.def:154
msgid "cannot use more than one of -anrw"
-msgstr ""
+msgstr "нельзя использовать больше одного параметра -anrw"
#: builtins/history.def:186
msgid "history position"
-msgstr ""
+msgstr "положение журнала команд"
#: builtins/history.def:366
#, c-format
msgid "%s: history expansion failed"
-msgstr ""
+msgstr "%s: не удалось расширить журнал команд"
#: builtins/inlib.def:71
-#, fuzzy, c-format
+#, c-format
msgid "%s: inlib failed"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÅÒ×ÉÓ"
+msgstr "%s: ошибка inlib"
#: builtins/jobs.def:109
msgid "no other options allowed with `-x'"
-msgstr ""
+msgstr "с параметром «-x» нельзя указывать другие параметры"
#: builtins/kill.def:200
#, c-format
msgid "%s: arguments must be process or job IDs"
-msgstr ""
+msgstr "%s: аргументами должны быть идентификаторы процессов или заданий"
#: builtins/kill.def:263
msgid "Unknown error"
-msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ"
+msgstr "Неизвестная ошибка"
#: builtins/let.def:95 builtins/let.def:120 expr.c:583 expr.c:598
msgid "expression expected"
-msgstr "ÏÖÉÄÁÌÏÓØ ×ÙÒÁÖÅÎÉÅ"
+msgstr "ожидается выражение"
#: builtins/mapfile.def:172
-#, fuzzy, c-format
+#, c-format
msgid "%s: not an indexed array"
-msgstr "%s: ÎÅ ÐÅÒÅÍÅÎÎÁÑ-ÍÁÓÓÉ×"
+msgstr "%s: это не индексированный массив"
#: builtins/mapfile.def:259 builtins/read.def:302
#, c-format
msgid "%s: invalid file descriptor specification"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÏÐÉÓÁÎÉÅ ÆÁÊÌÏ×ÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ"
+msgstr "%s: недопустимое указание дескриптора файла"
#: builtins/mapfile.def:267 builtins/read.def:309
#, c-format
msgid "%d: invalid file descriptor: %s"
-msgstr "%d: ÎÅÄÏÐÕÓÔÉÍÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ: %s"
+msgstr "%d: invalid недопустимый дескриптор файла: %s"
#: builtins/mapfile.def:276 builtins/mapfile.def:314
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid line count"
-msgstr "%s: ÎÅÐÒÁ×ÉÌØÎÁÑ ÏÐÃÉÑ"
+msgstr "%s: недопустимое число строк"
#: builtins/mapfile.def:287
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid array origin"
-msgstr "%s: ÎÅÐÒÁ×ÉÌØÎÁÑ ÏÐÃÉÑ"
+msgstr "%s: недопустимое начало массива"
#: builtins/mapfile.def:304
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid callback quantum"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÞÉÓÌÏ"
+msgstr "%s: недопустимый квант обратного вызова"
#: builtins/mapfile.def:336
-#, fuzzy
msgid "empty array variable name"
-msgstr "%s: ÎÅ ÐÅÒÅÍÅÎÎÁÑ-ÍÁÓÓÉ×"
+msgstr "пустое имя переменной массива"
#: builtins/mapfile.def:357
msgid "array variable support required"
-msgstr ""
+msgstr "требуется поддержка переменных массива"
#: builtins/printf.def:402
#, c-format
msgid "`%s': missing format character"
-msgstr "`%s': ÐÒÏÐÕÝÅÎ ÓÉÍ×ÏÌ ÆÏÒÍÁÔÉÒÏ×ÁÎÉÑ"
+msgstr "«%s»: отсутствует символ форматирования"
#: builtins/printf.def:456
-#, fuzzy, c-format
+#, c-format
msgid "`%c': invalid time format specification"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÁÑ ÓÐÅÃÉÆÉËÁÃÉÑ ÓÉÇÎÁÌÁ"
+msgstr "«%c»: недопустимое указание формата времени"
#: builtins/printf.def:658
#, c-format
msgid "`%c': invalid format character"
-msgstr "%c': ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ ÆÏÒÍÁÔÉÒÏ×ÁÎÉÑ"
+msgstr "«%c»: недопустимый символ форматирования"
#: builtins/printf.def:684
-#, fuzzy, c-format
+#, c-format
msgid "warning: %s: %s"
-msgstr "%s: ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ:"
+msgstr "предупреждение: %s: %s"
#: builtins/printf.def:768
#, c-format
msgid "format parsing problem: %s"
-msgstr ""
+msgstr "ошибка анализа формата: %s"
#: builtins/printf.def:865
msgid "missing hex digit for \\x"
-msgstr ""
+msgstr "отсутствует шестнадцатеричная цифра для \\x"
#: builtins/printf.def:880
#, c-format
msgid "missing unicode digit for \\%c"
-msgstr ""
+msgstr "отсутствует цифра Юникода для \\%c"
#: builtins/pushd.def:195
msgid "no other directory"
-msgstr "ÎÅÔ ÄÒÕÇÏÊ ÄÉÒÅËÔÏÒÉÉ"
+msgstr "отсутствует другой каталог"
#: builtins/pushd.def:354
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid argument"
-msgstr "%s: ÎÅÐÒÁ×ÉÌØÎÁÑ ÏÐÃÉÑ"
+msgstr "%s: недопустимый аргумент"
#: builtins/pushd.def:468
msgid "<no current directory>"
-msgstr ""
+msgstr "<отсутствует текущий каталог>"
#: builtins/pushd.def:512
msgid "directory stack empty"
-msgstr ""
+msgstr "стек каталогов пуст"
#: builtins/pushd.def:514
msgid "directory stack index"
-msgstr ""
+msgstr "индекс стека каталогов"
#: builtins/pushd.def:689
msgid ""
" \twith its position in the stack\n"
" \n"
" Arguments:\n"
-" +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+" +N\tDisplays the Nth entry counting from the left of the list shown by\n"
" \tdirs when invoked without options, starting with zero.\n"
" \n"
-" -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+" -N\tDisplays the Nth entry counting from the right of the list shown by\n"
"\tdirs when invoked without options, starting with zero."
msgstr ""
+"Выводит список запомненных на данный момент каталогов. Каталоги\n"
+" помещаются в список командой «pushd». Чтобы очистить\n"
+" список, используйте команду «popd».\n"
+" \n"
+" Параметры:\n"
+" -c\tочистить стек каталогов, удалив из него все элементы\n"
+" -l\tне выводить каталоги, начинающиеся с тильды (~),\n"
+" \tкоторая означает домашний каталог\n"
+" -p\tвывести стек по одному каталогу в строке\n"
+" -v\tвывести стек по одному каталогу в строке\n"
+" \tи с позицией в стеке\n"
+" \n"
+" Аргументы:\n"
+" +N\tпоказать N-ю слева в списке каталогов запись,\n"
+" \tпоказанного при вызове без параметров, начиная с нуля.\n"
+" \n"
+" -N\tпоказать N-ю справа в списке каталогов запись,\n"
+"\tпоказанного при вызове без параметров, начиная с нуля."
#: builtins/pushd.def:711
msgid ""
" \n"
" The `dirs' builtin displays the directory stack."
msgstr ""
+"Добавляет каталог в начало стека каталогов или выполняет\n"
+" ротацию стека, помещая в начало стека текущий рабочий\n"
+" каталог. Если аргументы не указаны, меняет местами два первых каталога.\n"
+" \n"
+" Параметры:\n"
+" -n\tпредотвращает обычное изменение каталога при добавлении\n"
+" \tкаталогов в стек, чтобы действия выполнялись только над стеком.\n"
+" \n"
+" Аргументы:\n"
+" +N\tвыполняет ротацию стека, чтобы N-й каталог (слева\n"
+" \tв списке, показанного командой «dirs», начиная с нуля)\n"
+" \tстал первым в стеке.\n"
+" \n"
+" -N\tвыполняет ротацию стека, чтобы N-й каталог (справа\n"
+" \tв списке, показанного командой «dirs», начиная с нуля)\n"
+" \tстал первым в стеке.\n"
+" \n"
+" dir\tдобавляет КАТАЛОГ в начало стека каталогов, делая его\n"
+" \tновым текущим каталогом.\n"
+" \n"
+" Встроенная команда «dirs» выводит стек каталогов."
#: builtins/pushd.def:736
msgid ""
" \n"
" The `dirs' builtin displays the directory stack."
msgstr ""
+"Удаляет записи из стека каталогов. Если аргументы не указаны,\n"
+" первый каталог из стека и назначает новый новый первый каталог.\n"
+" \n"
+" Параметры:\n"
+" -n\tпредотвращает обычное изменение каталога при удалении\n"
+" \tкаталогов из стека, чтобы действия выполнялись только над стеком.\n"
+" \n"
+" Аргументы:\n"
+" +N\tудаляет N-ю слева в списке каталогов запись,\n"
+" \tпоказанного командой «dirs», начиная с нуля. Пример: «popd +0»\n"
+" \tудаляет первый каталог, «popd +1» — второй каталог.\n"
+" \n"
+" -N\tудаляет N-ю справа в списке каталогов запись,\n"
+" \tпоказанного командой «dirs», начиная с нуля. Пример: «popd -0»\n"
+" \tудаляет последний каталог, «popd -1» — предпоследний каталог.\n"
+" \n"
+" Встроенная команда «dirs» выводит стек каталогов."
#: builtins/read.def:275
#, c-format
msgid "%s: invalid timeout specification"
-msgstr ""
+msgstr "%s: недопустимое указание тайм-аута"
#: builtins/read.def:678
#, c-format
msgid "read error: %d: %s"
-msgstr "ÏÛÉÂËÁ ÞÔÅÎÉÑ: %d: %s"
+msgstr "ошибка чтения: %d: %s"
#: builtins/return.def:75
msgid "can only `return' from a function or sourced script"
-msgstr ""
+msgstr "возврат можно выполнить только из функции или исходного скрипта"
#: builtins/set.def:782
msgid "cannot simultaneously unset a function and a variable"
-msgstr ""
+msgstr "нельзя одновременно сбросить функцию и переменную"
#: builtins/set.def:826
#, c-format
msgid "%s: cannot unset"
-msgstr "%s: ÎÅ ÍÏÇÕ ÓÂÒÏÓÉÔØ"
+msgstr "%s: не удаётся выполнить сброс"
#: builtins/set.def:843
#, c-format
msgid "%s: cannot unset: readonly %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÓÂÒÏÓÉÔØ: ÄÏÓÔÕÐÎÏ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ %s"
+msgstr "%s: не удаётся выполнить сброс: %s доступен только для чтения"
#: builtins/set.def:854
#, c-format
msgid "%s: not an array variable"
-msgstr "%s: ÎÅ ÐÅÒÅÍÅÎÎÁÑ-ÍÁÓÓÉ×"
+msgstr "%s: это не переменная массива"
#: builtins/setattr.def:187
#, c-format
msgid "%s: not a function"
-msgstr "%s: ÎÅ ÆÕÎËÃÉÑ"
+msgstr "%s: это не функция"
#: builtins/shift.def:71 builtins/shift.def:77
msgid "shift count"
-msgstr ""
+msgstr "счётчик смещений"
#: builtins/shopt.def:279
msgid "cannot set and unset shell options simultaneously"
-msgstr ""
+msgstr "нельзя одновременно задать и сбросить параметры командного процессора"
#: builtins/shopt.def:346
#, c-format
msgid "%s: invalid shell option name"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ ÏÐÃÉÉ ÏÂÏÌÏÞËÉ"
+msgstr "%s: недопустимое название параметра командного процессора"
#: builtins/source.def:130
msgid "filename argument required"
-msgstr "ÔÒÅÂÕÅÔÓÑ ÁÒÇÕÍÅÎÔ ÉÍÑ ÆÁÊÌÁ"
+msgstr "требуется аргумент с именем файла"
#: builtins/source.def:155
#, c-format
msgid "%s: file not found"
-msgstr "%s: ÆÁÊÌ ÎÅ ÎÁÊÄÅÎ"
+msgstr "%s: файл не найден"
#: builtins/suspend.def:101
msgid "cannot suspend"
-msgstr ""
+msgstr "не удаётся приостановить"
#: builtins/suspend.def:111
msgid "cannot suspend a login shell"
-msgstr ""
+msgstr "не удаётся приостановить командный процессор login"
#: builtins/type.def:234
#, c-format
msgid "%s is aliased to `%s'\n"
-msgstr ""
+msgstr "%s — это псевдонимом для «%s»\n"
#: builtins/type.def:255
#, c-format
msgid "%s is a shell keyword\n"
-msgstr "%s Ñ×ÌÑÅÔÓÑ ËÌÀÞÅ×ÙÍ ÓÌÏ×ÏÍ ÏÂÏÌÏÞËÉ\n"
+msgstr "%s — это ключевое слово командного процессора\n"
#: builtins/type.def:274
#, c-format
msgid "%s is a function\n"
-msgstr "%s Ñ×ÌÑÅÔÓÑ ÆÕÎËÃÉÅÊ\n"
+msgstr "%s — это функция\n"
#: builtins/type.def:296
#, c-format
msgid "%s is a shell builtin\n"
-msgstr ""
+msgstr "%s — это встроенная команда bash\n"
#: builtins/type.def:317 builtins/type.def:393
#, c-format
msgid "%s is %s\n"
-msgstr ""
+msgstr "%s является %s\n"
#: builtins/type.def:337
#, c-format
msgid "%s is hashed (%s)\n"
-msgstr ""
+msgstr "для %s вычислен хэш (%s)\n"
#: builtins/ulimit.def:383
#, c-format
msgid "%s: invalid limit argument"
-msgstr ""
+msgstr "%s: недопустимый аргумент ограничения"
#: builtins/ulimit.def:409
#, c-format
msgid "`%c': bad command"
-msgstr "`%c': ÐÌÏÈÁÑ ËÏÍÁÎÄÁ"
+msgstr "«%c»: недопустимая команда"
#: builtins/ulimit.def:438
#, c-format
msgid "%s: cannot get limit: %s"
-msgstr ""
+msgstr "%s: не удаётся получить ограничение: %s"
#: builtins/ulimit.def:464
msgid "limit"
-msgstr ""
+msgstr "ограничение"
#: builtins/ulimit.def:476 builtins/ulimit.def:776
#, c-format
msgid "%s: cannot modify limit: %s"
-msgstr ""
+msgstr "%s: не удаётся изменить ограничение: %s"
#: builtins/umask.def:114
msgid "octal number"
-msgstr "ÞÉÓÌÏ × ×ÏÓØÍÅÒÉÞÎÏÊ ÓÉÓÔÅÍÅ ÉÓÞÉÓÌÅÎÉÑ"
+msgstr "восьмеричное число"
#: builtins/umask.def:227
#, c-format
msgid "`%c': invalid symbolic mode operator"
-msgstr ""
+msgstr "«%c»: недопустимый оператор символьного режима"
#: builtins/umask.def:282
#, c-format
msgid "`%c': invalid symbolic mode character"
-msgstr ""
+msgstr "«%c»: недопустимый знак символьного режима"
#: error.c:90 error.c:325 error.c:327 error.c:329
msgid " line "
-msgstr ""
+msgstr " строка "
#: error.c:165
#, c-format
msgid "last command: %s\n"
-msgstr "ÐÏÓÌÅÄÎÑÑ ËÏÍÁÎÄÁ: %s\n"
+msgstr "поÑ\81леднÑ\8fÑ\8f команда: %s\n"
#: error.c:173
#, c-format
msgid "Aborting..."
-msgstr "úÁ×ÅÒÛÁÀ ÒÁÂÏÔÕ..."
+msgstr "Прерывание..."
#: error.c:440
msgid "unknown command error"
-msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ ËÏÍÁÎÄÙ"
+msgstr "неизвестная ошибка команды"
#: error.c:441
msgid "bad command type"
-msgstr ""
+msgstr "неверный тип команды"
#: error.c:442
msgid "bad connector"
-msgstr ""
+msgstr "неверный соединитель"
#: error.c:443
msgid "bad jump"
-msgstr ""
+msgstr "ошибка перехода"
#: error.c:481
#, c-format
msgid "%s: unbound variable"
-msgstr ""
+msgstr "%s: не заданы границы переменной"
#: eval.c:189
#, c-format
msgid "\atimed out waiting for input: auto-logout\n"
-msgstr ""
+msgstr "\\aпревышено время ожидания ввода: auto-logout\n"
#: execute_cmd.c:512
#, c-format
msgid "cannot redirect standard input from /dev/null: %s"
-msgstr ""
+msgstr "не удаётся перенаправить стандартный ввод из /dev/null: %s"
#: execute_cmd.c:1233
#, c-format
msgid "TIMEFORMAT: `%c': invalid format character"
-msgstr ""
+msgstr "TIMEFORMAT: «%c»: недопустимый символ форматирования"
#: execute_cmd.c:2287
-#, fuzzy
msgid "pipe error"
-msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ: %s"
+msgstr "ошибка конвейера"
-#: execute_cmd.c:4386
+#: execute_cmd.c:4374
#, c-format
msgid "%s: maximum function nesting level exceeded (%d)"
-msgstr ""
+msgstr "%s: достигнут максимальный уровень вложенности функций (%d)"
-#: execute_cmd.c:4884
+#: execute_cmd.c:4872
#, c-format
msgid "%s: restricted: cannot specify `/' in command names"
-msgstr ""
+msgstr "%s: ограниченный режим: в названиях команд нельзя использовать косую черту «/»"
-#: execute_cmd.c:4973
+#: execute_cmd.c:4961
#, c-format
msgid "%s: command not found"
-msgstr "%s: ËÏÍÁÎÄÁ ÎÅ ÎÁÊÄÅÎÁ"
+msgstr "%s: команда не найдена"
-#: execute_cmd.c:5206
+#: execute_cmd.c:5194
#, c-format
msgid "%s: %s"
-msgstr ""
+msgstr "%s: %s"
-#: execute_cmd.c:5243
+#: execute_cmd.c:5231
#, c-format
msgid "%s: %s: bad interpreter"
-msgstr "%s: %s: ÐÌÏÈÏÊ ÉÎÔÅÒÐÒÅÔÁÔÏÒ"
+msgstr "%s: %s: невеÑ\80нÑ\8bй инÑ\82еÑ\80пÑ\80еÑ\82аÑ\82оÑ\80"
-#: execute_cmd.c:5280
-#, fuzzy, c-format
+#: execute_cmd.c:5268
+#, c-format
msgid "%s: cannot execute binary file: %s"
-msgstr "%s: ÎÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ ÂÉÎÁÒÎÙÊ ÆÁÊÌ"
+msgstr "%s: не удаётся запустить бинарный файл: %s"
-#: execute_cmd.c:5352
-#, fuzzy, c-format
+#: execute_cmd.c:5340
+#, c-format
msgid "`%s': is a special builtin"
-msgstr "%s: ÎÅ ×ÓÔÒÏÅÎÎÁ × ÏÂÏÌÏÞËÕ"
+msgstr "«%s»: это специальная встроенная команда"
-#: execute_cmd.c:5404
+#: execute_cmd.c:5392
#, c-format
msgid "cannot duplicate fd %d to fd %d"
-msgstr "ÎÅ ÍÏÇÕ ÄÕÂÌÉÒÏ×ÁÔØ fd %d × fd %d"
+msgstr "не удаётся скопировать файловый дескриптор %d в %d"
#: expr.c:259
msgid "expression recursion level exceeded"
-msgstr ""
+msgstr "слишком много вложенных выражений"
#: expr.c:283
msgid "recursion stack underflow"
-msgstr ""
+msgstr "отрицательное переполнение стека вложенных выражений"
#: expr.c:431
msgid "syntax error in expression"
-msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ×ÙÒÁÖÅÎÉÅ"
+msgstr "синтаксическая ошибка в выражении"
#: expr.c:475
msgid "attempted assignment to non-variable"
-msgstr "ÐÏÐÙÔËÁ ÐÒÉÓ×ÏÅÎÉÑ ÎÅ-ÐÅÒÅÍÅÎÎÏÊ"
+msgstr "знаÑ\87ение можно пÑ\80иÑ\81воиÑ\82Ñ\8c Ñ\82олÑ\8cко пеÑ\80еменной"
#: expr.c:495 expr.c:858
msgid "division by 0"
-msgstr "ÄÅÌÅÎÉÅ ÎÁ 0"
+msgstr "деление на 0"
#: expr.c:542
msgid "bug: bad expassign token"
-msgstr ""
+msgstr "ошибка: недопустимый маркер присвоения выражения"
#: expr.c:595
msgid "`:' expected for conditional expression"
-msgstr ""
+msgstr "в условном выражении должен быть символ «:»"
#: expr.c:919
msgid "exponent less than 0"
-msgstr ""
+msgstr "экспонента меньше нуля"
#: expr.c:976
msgid "identifier expected after pre-increment or pre-decrement"
-msgstr ""
+msgstr "после предварительного инкремента или декремента ожидается идентификатор "
#: expr.c:1002
msgid "missing `)'"
-msgstr "ÐÒÏÐÕÝÅÎ `)'"
+msgstr "оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81имвол «)»"
#: expr.c:1053 expr.c:1390
msgid "syntax error: operand expected"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ: ÏÖÉÄÁÅÔÓÑ ÏÐÅÒÁÎÄ"
+msgstr "синтаксическая ошибка: ожидается операнд"
#: expr.c:1392
msgid "syntax error: invalid arithmetic operator"
-msgstr ""
+msgstr "ошибка синтаксиса: недопустимый математический оператор"
#: expr.c:1416
#, c-format
msgid "%s%s%s: %s (error token is \"%s\")"
-msgstr ""
+msgstr "%s%s%s: %s (неверный маркер «%s»)"
#: expr.c:1474
msgid "invalid arithmetic base"
-msgstr ""
+msgstr "недопустимое математическое основание"
#: expr.c:1494
msgid "value too great for base"
-msgstr ""
+msgstr "слишком большое значение для основания"
#: expr.c:1543
-#, fuzzy, c-format
+#, c-format
msgid "%s: expression error\n"
-msgstr "ÏÖÉÄÁÌÏÓØ ×ÙÒÁÖÅÎÉÅ"
+msgstr "%s: ошибка выражения\n"
-#: general.c:62
+#: general.c:61
msgid "getcwd: cannot access parent directories"
-msgstr ""
+msgstr "getcwd: нет доступа к родительским каталогам"
#: input.c:102 subst.c:5168
-#, fuzzy, c-format
+#, c-format
msgid "cannot reset nodelay mode for fd %d"
-msgstr "ÎÅ ÍÏÇÕ ÄÕÂÌÉÒÏ×ÁÔØ fd %d × fd %d"
+msgstr "не удаётся сбросить режим nodelay для файлового дескриптора %d"
-#: input.c:271
+#: input.c:269
#, c-format
msgid "cannot allocate new file descriptor for bash input from fd %d"
-msgstr ""
+msgstr "не удаётся выделить новый дескриптор для входных данных bash из файлового дескриптора %d"
-#: input.c:279
+#: input.c:277
#, c-format
msgid "save_bash_input: buffer already exists for new fd %d"
-msgstr ""
+msgstr "save_bash_input: у нового файлового дескриптора %d уже есть буфер"
#: jobs.c:471
msgid "start_pipeline: pgrp pipe"
-msgstr ""
+msgstr "start_pipeline: pgrp pipe"
#: jobs.c:893
#, c-format
msgid "forked pid %d appears in running job %d"
-msgstr ""
+msgstr "идентификатор дочернего процесса %d принадлежит запущенному заданию %d"
#: jobs.c:1012
#, c-format
msgid "deleting stopped job %d with process group %ld"
-msgstr ""
+msgstr "удаление остановленного задания %d с группой процесса %ld"
#: jobs.c:1117
#, c-format
msgid "add_process: process %5ld (%s) in the_pipeline"
-msgstr ""
+msgstr "add_process: процесс %5ld (%s) в the_pipeline"
#: jobs.c:1120
#, c-format
msgid "add_process: pid %5ld (%s) marked as still alive"
-msgstr ""
+msgstr "add_process: процесс с идентификатором %5ld (%s) помечен как всё ещё активный"
#: jobs.c:1435
#, c-format
msgid "describe_pid: %ld: no such pid"
-msgstr ""
+msgstr "describe_pid: %ld: нет процесса с таким идентификатором"
#: jobs.c:1450
#, c-format
msgid "Signal %d"
-msgstr ""
+msgstr "Сигнал %d"
#: jobs.c:1464 jobs.c:1489
msgid "Done"
-msgstr ""
+msgstr "Завершён"
#: jobs.c:1469 siglist.c:123
msgid "Stopped"
-msgstr ""
+msgstr "Остановлен"
#: jobs.c:1473
#, c-format
msgid "Stopped(%s)"
-msgstr ""
+msgstr "Остановлен (%s)"
#: jobs.c:1477
msgid "Running"
-msgstr ""
+msgstr "Запущен"
#: jobs.c:1491
#, c-format
msgid "Done(%d)"
-msgstr ""
+msgstr "Завершён (%d)"
#: jobs.c:1493
#, c-format
msgid "Exit %d"
-msgstr ""
+msgstr "Выход %d"
#: jobs.c:1496
msgid "Unknown status"
-msgstr ""
+msgstr "Состояние неизвестно"
#: jobs.c:1583
#, c-format
msgid "(core dumped) "
-msgstr ""
+msgstr "(стек памяти сброшен на диск) "
#: jobs.c:1602
#, c-format
msgid " (wd: %s)"
-msgstr ""
+msgstr " (рабочий каталог: %s)"
#: jobs.c:1819
#, c-format
msgid "child setpgid (%ld to %ld)"
-msgstr ""
+msgstr "дочерний setpgid (%ld к %ld)"
#: jobs.c:2138 nojobs.c:605
#, c-format
msgid "wait: pid %ld is not a child of this shell"
-msgstr ""
+msgstr "wait: процесс %ld не является дочерним процессом этого командного процессора"
#: jobs.c:2385
#, c-format
msgid "wait_for: No record of process %ld"
-msgstr ""
+msgstr "wait_for: нет записей процесса %ld"
#: jobs.c:2694
#, c-format
msgid "wait_for_job: job %d is stopped"
-msgstr ""
+msgstr "wait_for_job: задание %d остановлено"
#: jobs.c:2986
#, c-format
msgid "%s: job has terminated"
-msgstr ""
+msgstr "%s: выполнение задания прервано"
#: jobs.c:2995
#, c-format
msgid "%s: job %d already in background"
-msgstr ""
+msgstr "%s: задание %d уже выполняется в фоновом режиме"
#: jobs.c:3220
msgid "waitchld: turning on WNOHANG to avoid indefinite block"
-msgstr ""
+msgstr "waitchld: включается WNOHANG, чтобы предотвратить появление неопределённого блока"
#: jobs.c:3711
-#, fuzzy, c-format
+#, c-format
msgid "%s: line %d: "
-msgstr "%s: ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ:"
+msgstr "%s: строка %d: "
#: jobs.c:3725 nojobs.c:843
#, c-format
msgid " (core dumped)"
-msgstr ""
+msgstr " (стек памяти сброшен на диск)"
#: jobs.c:3737 jobs.c:3750
#, c-format
msgid "(wd now: %s)\n"
-msgstr ""
+msgstr "(рабочий каталог: %s)\n"
#: jobs.c:3782
msgid "initialize_job_control: getpgrp failed"
-msgstr ""
+msgstr "initialize_job_control: ошибка вызова getpgrp "
#: jobs.c:3843
msgid "initialize_job_control: line discipline"
-msgstr ""
+msgstr "initialize_job_control: дисциплина строки"
#: jobs.c:3853
msgid "initialize_job_control: setpgid"
-msgstr ""
+msgstr "initialize_job_control: setpgid"
#: jobs.c:3874 jobs.c:3883
#, c-format
msgid "cannot set terminal process group (%d)"
-msgstr ""
+msgstr "не удаётся задать группу процесса терминала (%d)"
#: jobs.c:3888
msgid "no job control in this shell"
-msgstr ""
+msgstr "этот командный процессор не может управлять заданиями"
#: lib/malloc/malloc.c:296
#, c-format
msgid "malloc: failed assertion: %s\n"
-msgstr ""
+msgstr "malloc: ошибка утверждения: %s\n"
#: lib/malloc/malloc.c:312
#, c-format
"\r\n"
"malloc: %s:%d: assertion botched\r\n"
msgstr ""
+"\\r\n"
+"malloc: %s:%d: утверждение не удалось\\r\n"
#: lib/malloc/malloc.c:313
-#, fuzzy
msgid "unknown"
-msgstr "%s: ÈÏÓÔ ÎÅÉÚ×ÅÓÔÅÎ"
+msgstr "неизвестно"
#: lib/malloc/malloc.c:801
msgid "malloc: block on free list clobbered"
-msgstr ""
+msgstr "malloc: блок в списке свободных затёрт"
#: lib/malloc/malloc.c:878
msgid "free: called with already freed block argument"
-msgstr ""
+msgstr "free: вызван с аргументом уже освобождённого блока"
#: lib/malloc/malloc.c:881
msgid "free: called with unallocated block argument"
-msgstr ""
+msgstr "free: вызван с аргументом невыделенного блока"
#: lib/malloc/malloc.c:900
msgid "free: underflow detected; mh_nbytes out of range"
-msgstr ""
+msgstr "free: обнаружено отрицательное переполнение; mh_nbytes байт за пределами диапазона"
#: lib/malloc/malloc.c:906
msgid "free: start and end chunk sizes differ"
-msgstr ""
+msgstr "free: размеры начального и конечного блока отличаются"
#: lib/malloc/malloc.c:1005
msgid "realloc: called with unallocated block argument"
-msgstr ""
+msgstr "realloc: вызван с аргументом невыделенного блока"
#: lib/malloc/malloc.c:1020
msgid "realloc: underflow detected; mh_nbytes out of range"
-msgstr ""
+msgstr "realloc: обнаружено отрицательное переполнение; mh_nbytes байт за пределами диапазона"
#: lib/malloc/malloc.c:1026
msgid "realloc: start and end chunk sizes differ"
-msgstr ""
+msgstr "realloc: размеры начального и конечного блока отличаются"
#: lib/malloc/table.c:194
#, c-format
msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
-msgstr ""
+msgstr "register_alloc: таблица выделения заполнена записями FIND_ALLOC?\n"
#: lib/malloc/table.c:203
#, c-format
msgid "register_alloc: %p already in table as allocated?\n"
-msgstr ""
+msgstr "register_alloc: %p уже есть в таблице как выделенный?\n"
#: lib/malloc/table.c:256
#, c-format
msgid "register_free: %p already in table as free?\n"
-msgstr ""
+msgstr "register_free: %p уже есть в таблице как свободный?\n"
#: lib/sh/fmtulong.c:102
msgid "invalid base"
-msgstr ""
+msgstr "недопустимое основание"
#: lib/sh/netopen.c:168
#, c-format
msgid "%s: host unknown"
-msgstr "%s: ÈÏÓÔ ÎÅÉÚ×ÅÓÔÅÎ"
+msgstr "%s: узел неизвестен"
#: lib/sh/netopen.c:175
#, c-format
msgid "%s: invalid service"
-msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÅÒ×ÉÓ"
+msgstr "%s: недопустимая служба"
#: lib/sh/netopen.c:306
#, c-format
msgid "%s: bad network path specification"
-msgstr ""
+msgstr "%s: недопустимое указание сетевого пути"
#: lib/sh/netopen.c:346
msgid "network operations not supported"
-msgstr ""
+msgstr "сетевые операции не поддерживаются"
#: locale.c:200
#, c-format
msgid "setlocale: LC_ALL: cannot change locale (%s)"
-msgstr ""
+msgstr "setlocale: LC_ALL: не удаётся изменить язык (%s)"
#: locale.c:202
#, c-format
msgid "setlocale: LC_ALL: cannot change locale (%s): %s"
-msgstr ""
+msgstr "setlocale: LC_ALL: не удаётся изменить язык (%s): %s"
#: locale.c:259
#, c-format
msgid "setlocale: %s: cannot change locale (%s)"
-msgstr ""
+msgstr "setlocale: %s: не удаётся изменить язык (%s)"
#: locale.c:261
#, c-format
msgid "setlocale: %s: cannot change locale (%s): %s"
-msgstr ""
+msgstr "setlocale: %s: не удаётся изменить язык (%s): %s"
#: mailcheck.c:439
msgid "You have mail in $_"
-msgstr "õ ×ÁÓ ÅÓÔØ ÐÏÞÔÁ × $_"
+msgstr "Для вас есть почта в $_"
#: mailcheck.c:464
msgid "You have new mail in $_"
-msgstr "õ ×ÁÓ ÅÓÔØ ÎÏ×ÁÑ ÐÏÞÔÁ × $_"
+msgstr "Для вас есть почта в $_"
#: mailcheck.c:480
#, c-format
msgid "The mail in %s has been read\n"
-msgstr "ðÏÞÔÁ × %s ÂÙÌÁ ÐÒÏÞÉÔÁÎÁ\n"
+msgstr "Сообщения в %s были прочитаны\n"
#: make_cmd.c:323
msgid "syntax error: arithmetic expression required"
-msgstr ""
+msgstr "синтаксическая ошибка: требуется математическое выражение"
#: make_cmd.c:325
msgid "syntax error: `;' unexpected"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ: `;' ÎÅ ÏÖÉÄÁÅÔÓÑ"
+msgstr "синтаксическая ошибка: ожидается «;»"
#: make_cmd.c:326
#, c-format
msgid "syntax error: `((%s))'"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ: `((%s))'"
+msgstr "синтаксическая ошибка: «((%s))»"
#: make_cmd.c:578
#, c-format
msgid "make_here_document: bad instruction type %d"
-msgstr ""
+msgstr "make_here_document: недопустимый тип инструкции %d"
#: make_cmd.c:662
#, c-format
msgid "here-document at line %d delimited by end-of-file (wanted `%s')"
-msgstr ""
+msgstr "блок here-document в строке %d разделён знаком конца файла (ожидался «%s»)"
#: make_cmd.c:759
#, c-format
msgid "make_redirection: redirection instruction `%d' out of range"
-msgstr ""
+msgstr "make_redirection: инструкция перенаправления «%d» вышла за пределы диапазона"
-#: parse.y:3278 parse.y:3561
+#: parse.y:3273 parse.y:3556
#, c-format
msgid "unexpected EOF while looking for matching `%c'"
-msgstr ""
+msgstr "неожиданный конец файла во время поиска «%c»"
-#: parse.y:4170
+#: parse.y:4163
msgid "unexpected EOF while looking for `]]'"
-msgstr ""
+msgstr "неожиданный конец файла во время поиска «]]»"
-#: parse.y:4175
+#: parse.y:4168
#, c-format
msgid "syntax error in conditional expression: unexpected token `%s'"
-msgstr ""
+msgstr "синтаксическая ошибка в условном выражении: неожиданный маркер «%s»"
-#: parse.y:4179
+#: parse.y:4172
msgid "syntax error in conditional expression"
-msgstr ""
+msgstr "синтаксическая ошибка в условном выражении"
-#: parse.y:4257
+#: parse.y:4250
#, c-format
msgid "unexpected token `%s', expected `)'"
-msgstr ""
+msgstr "неожиданный маркер «%s», ожидался «)»"
-#: parse.y:4261
+#: parse.y:4254
msgid "expected `)'"
-msgstr "ÏÖÉÄÁÌÓÑ `)'"
+msgstr "ожидается символ «)»"
-#: parse.y:4289
+#: parse.y:4282
#, c-format
msgid "unexpected argument `%s' to conditional unary operator"
-msgstr ""
+msgstr "неожиданный аргумент «%s» для условного унарного оператора"
-#: parse.y:4293
+#: parse.y:4286
msgid "unexpected argument to conditional unary operator"
-msgstr ""
+msgstr "неожиданный аргумент для условного унарного оператора"
-#: parse.y:4339
+#: parse.y:4332
#, c-format
msgid "unexpected token `%s', conditional binary operator expected"
-msgstr ""
+msgstr "неожиданный маркер «%s», ожидается условный бинарный оператор"
-#: parse.y:4343
+#: parse.y:4336
msgid "conditional binary operator expected"
-msgstr ""
+msgstr "ожидается условный бинарный оператор"
-#: parse.y:4365
+#: parse.y:4358
#, c-format
msgid "unexpected argument `%s' to conditional binary operator"
-msgstr ""
+msgstr "неожиданный аргумент «%s» для условного бинарного оператора"
-#: parse.y:4369
+#: parse.y:4362
msgid "unexpected argument to conditional binary operator"
-msgstr ""
+msgstr "неожиданный аргумент для условного бинарного оператора"
-#: parse.y:4380
+#: parse.y:4373
#, c-format
msgid "unexpected token `%c' in conditional command"
-msgstr ""
+msgstr "неожиданный маркер «%c» в условной команде"
-#: parse.y:4383
+#: parse.y:4376
#, c-format
msgid "unexpected token `%s' in conditional command"
-msgstr ""
+msgstr "неожиданный маркер «%s» в условной команде"
-#: parse.y:4387
+#: parse.y:4380
#, c-format
msgid "unexpected token %d in conditional command"
-msgstr ""
+msgstr "неожиданный маркер %d в условной команде"
-#: parse.y:5737
+#: parse.y:5730
#, c-format
msgid "syntax error near unexpected token `%s'"
-msgstr ""
+msgstr "синтаксическая ошибка рядом с неожиданным маркером «%s»"
-#: parse.y:5755
+#: parse.y:5748
#, c-format
msgid "syntax error near `%s'"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ ÏËÏÌÏ `%s'"
+msgstr "синтаксическая ошибка рядом с «%s»"
-#: parse.y:5765
+#: parse.y:5758
msgid "syntax error: unexpected end of file"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ: ÎÅÏÖÉÄÁÎÎÙÊ ËÏÎÅÃ ÆÁÊÌÁ"
+msgstr "синтаксическая ошибка: неожиданный конец файла"
-#: parse.y:5765
+#: parse.y:5758
msgid "syntax error"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ"
+msgstr "синтаксическая ошибка"
-#: parse.y:5827
+#: parse.y:5820
#, c-format
msgid "Use \"%s\" to leave the shell.\n"
-msgstr "éÓÐÏÌØÚÕÊÔÅ \"%s\", ÞÔÏÂÙ ÚÁ×ÅÒÛÉÔØÓÑ ÒÁÂÏÔÕ Ó ÏÂÏÌÏÞËÏÊ.\n"
+msgstr "Для выхода из командного процессора используйте «%s».\n"
-#: parse.y:5989
+#: parse.y:5982
msgid "unexpected EOF while looking for matching `)'"
-msgstr ""
+msgstr "неожиданный конец файла во время поиска «)»"
#: pcomplete.c:1094
#, c-format
msgid "completion: function `%s' not found"
-msgstr ""
+msgstr "completion: функция «%s» не найдена"
#: pcomplib.c:182
#, c-format
msgid "progcomp_insert: %s: NULL COMPSPEC"
-msgstr ""
+msgstr "progcomp_insert: %s: NULL COMPSPEC"
#: print_cmd.c:300
#, c-format
msgid "print_command: bad connector `%d'"
-msgstr ""
+msgstr "print_command: неверный соединитель «%d»"
#: print_cmd.c:373
-#, fuzzy, c-format
+#, c-format
msgid "xtrace_set: %d: invalid file descriptor"
-msgstr "%d: ÎÅÄÏÐÕÓÔÉÍÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ: %s"
+msgstr "xtrace_set: %d: недопустимый идентификатор файла"
#: print_cmd.c:378
msgid "xtrace_set: NULL file pointer"
-msgstr ""
+msgstr "xtrace_set: пустой указатель на файл"
#: print_cmd.c:382
#, c-format
msgid "xtrace fd (%d) != fileno xtrace fp (%d)"
-msgstr ""
+msgstr "xtrace fd (%d) != fileno xtrace fp (%d)"
#: print_cmd.c:1518
#, c-format
msgid "cprintf: `%c': invalid format character"
-msgstr ""
+msgstr "cprintf: «%c»: недопустимый символ форматирования"
#: redir.c:123 redir.c:170
msgid "file descriptor out of range"
-msgstr "ÆÁÊÌÏ×ÙÊ ÄÅÓËÒÉÐÔÏÒ ÚÁ ÐÒÅÄÅÌÁÍÉ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ"
+msgstr "файловый дескриптор за пределами диапазона"
#: redir.c:177
#, c-format
msgid "%s: ambiguous redirect"
-msgstr ""
+msgstr "%s: неоднозначное перенаправление"
#: redir.c:181
#, c-format
msgid "%s: cannot overwrite existing file"
-msgstr "%s: ÎÅ ÍÏÇÕ ÐÅÒÅÐÉÓÁÔØ ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ"
+msgstr "%s: не удаётся перезаписать существующий файл"
#: redir.c:186
#, c-format
msgid "%s: restricted: cannot redirect output"
-msgstr ""
+msgstr "%s: ограниченный режим: не удаётся перенаправить вывод"
#: redir.c:191
#, c-format
msgid "cannot create temp file for here-document: %s"
-msgstr ""
+msgstr "не удаётся создать временный файл для блока here-document: %s"
#: redir.c:195
-#, fuzzy, c-format
+#, c-format
msgid "%s: cannot assign fd to variable"
-msgstr "%s: ÎÅ ÐÅÒÅÍÅÎÎÁÑ-ÍÁÓÓÉ×"
+msgstr "%s: не удаётся присвоить файловый дескриптор переменной"
#: redir.c:582
msgid "/dev/(tcp|udp)/host/port not supported without networking"
-msgstr ""
+msgstr "/dev/(tcp|udp)/host/port не поддерживается без сети"
#: redir.c:861 redir.c:973 redir.c:1034 redir.c:1199
msgid "redirection error: cannot duplicate fd"
-msgstr "ÏÛÉÂËÁ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÉÑ: ÎÅ ÍÏÇÕ ÄÕÂÌÉÒÏ×ÁÔØ fd"
+msgstr "ошибка перенаправления: не удаётся создать копию файлового дескриптора"
#: shell.c:339
msgid "could not find /tmp, please create!"
-msgstr "ÎÅ ÍÏÇÕ ÎÁÊÔÉ /tmp, ÐÏÖÁÌÕÊÓÔÁ ÓÏÚÄÁÊÔÅ!"
+msgstr "не удалось найти /tmp; создайте этот каталог"
#: shell.c:343
msgid "/tmp must be a valid directory name"
-msgstr "/tmp ÄÏÌÖÎÁ ÂÙÔØ ÄÅÊÓÔ×ÉÔÅÌØÎÙÍ ÉÍÅÎÅÍ ÄÉÒÅËÔÏÒÉÉ"
+msgstr "/tmp должен быть допустимым названием каталога"
#: shell.c:890
#, c-format
msgid "%c%c: invalid option"
-msgstr "%c%c: ÎÅÄÏÐÕÓÔÉÍÁÑ ÏÐÃÉÑ"
+msgstr "%c%c: недопустимый параметр"
#: shell.c:1682
msgid "I have no name!"
-msgstr "õ ÍÅÎÑ ÎÅÔ ÉÍÅÎÉ!"
+msgstr "Не удаётся определить название"
#: shell.c:1827
#, c-format
msgid "GNU bash, version %s-(%s)\n"
-msgstr ""
+msgstr "GNU bash, версия %s-(%s)\n"
#: shell.c:1828
#, c-format
"Usage:\t%s [GNU long option] [option] ...\n"
"\t%s [GNU long option] [option] script-file ...\n"
msgstr ""
-"éÓÐÏÌØÚÏ×ÁÎÉÅ:\n"
-"%s [ÄÌÉÎÎÙÅ ÏÐÃÉÉ Á-ÌÑ `GNU'] [ÏÐÃÉÉ] ...\n"
-"\t%s [ÄÌÉÎÎÙÅ ÏÐÃÉÉ Á-ÌÑ `GNU'] [ÏÐÃÉÉ] ÆÁÊÌ_ÓÏ_ÓËÒÉÐÔÏÍ...\n"
+"Использование:\t%s [длинные параметры GNU] [параметры] ...\n"
+"\t\t%s [длинные параметры GNU] [параметры] файл_скрипта ...\n"
#: shell.c:1830
msgid "GNU long options:\n"
-msgstr "äÌÉÎÎÙÅ ÏÐÃÉÉ × ÓÔÅÌÅ GNU:\n"
+msgstr "Длинные параметры GNU:\n"
#: shell.c:1834
msgid "Shell options:\n"
-msgstr "ïÐÃÉÉ ÏÂÏÌÏÞËÉ:\n"
+msgstr "Параметры командного процессора:\n"
#: shell.c:1835
msgid "\t-ilrsD or -c command or -O shopt_option\t\t(invocation only)\n"
-msgstr ""
+msgstr "\t-irsD или -c команда или -O короткие_параметры\t\t(только при запуске)\n"
#: shell.c:1850
#, c-format
msgid "\t-%s or -o option\n"
-msgstr "\t-%s ÉÌÉ ÏÐÃÉÑ -o\n"
+msgstr "\t-%s или -o параметр\n"
#: shell.c:1856
#, c-format
msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
-msgstr ""
+msgstr "Для получения дополнительных сведений о параметрах командного процессора введите «%s -c \"help set\"».\n"
#: shell.c:1857
#, c-format
msgid "Type `%s -c help' for more information about shell builtin commands.\n"
-msgstr ""
+msgstr "Для получения дополнительных сведений о встроенных командах введите «%s -c help».\n"
#: shell.c:1858
#, c-format
msgid "Use the `bashbug' command to report bugs.\n"
-msgstr ""
+msgstr "Для отправки сообщений об ошибках используйте команду «bashbug».\n"
#: sig.c:691
#, c-format
msgid "sigprocmask: %d: invalid operation"
-msgstr ""
+msgstr "sigprocmask: %d: недопустимая операция"
#: siglist.c:48
msgid "Bogus signal"
-msgstr ""
+msgstr "Фиктивный сигнал"
#: siglist.c:51
msgid "Hangup"
-msgstr ""
+msgstr "Отбой"
#: siglist.c:55
msgid "Interrupt"
-msgstr ""
+msgstr "Прерывание"
#: siglist.c:59
msgid "Quit"
-msgstr ""
+msgstr "Выход"
#: siglist.c:63
msgid "Illegal instruction"
-msgstr ""
+msgstr "Недопустимая инструкция"
#: siglist.c:67
msgid "BPT trace/trap"
-msgstr ""
+msgstr "Трасса/ловушка BPT"
#: siglist.c:75
msgid "ABORT instruction"
-msgstr ""
+msgstr "Инструкция ABORT"
#: siglist.c:79
msgid "EMT instruction"
-msgstr ""
+msgstr "Инструкция EMT"
#: siglist.c:83
msgid "Floating point exception"
-msgstr ""
+msgstr "Исключение при обработке чисел с плавающей точкой"
#: siglist.c:87
msgid "Killed"
-msgstr ""
+msgstr "Убит"
#: siglist.c:91
-#, fuzzy
msgid "Bus error"
-msgstr "ÏÛÉÂËÁ ÓÉÎÔÁËÓÉÓÁ"
+msgstr "Ошибка шины"
#: siglist.c:95
msgid "Segmentation fault"
-msgstr ""
+msgstr "Ошибка сегментации"
#: siglist.c:99
msgid "Bad system call"
-msgstr ""
+msgstr "Неверный системный вызов"
#: siglist.c:103
msgid "Broken pipe"
-msgstr ""
+msgstr "Конвейер не работает"
#: siglist.c:107
msgid "Alarm clock"
-msgstr ""
+msgstr "Сигнал часов"
#: siglist.c:111
msgid "Terminated"
-msgstr ""
+msgstr "Прерван"
#: siglist.c:115
msgid "Urgent IO condition"
-msgstr ""
+msgstr "Срочное событие ввода/вывода"
#: siglist.c:119
msgid "Stopped (signal)"
-msgstr ""
+msgstr "Остановлен (сигналом)"
#: siglist.c:127
msgid "Continue"
-msgstr ""
+msgstr "Продолжение"
#: siglist.c:135
msgid "Child death or stop"
-msgstr ""
+msgstr "Смерть или остановка дочернего процесса"
#: siglist.c:139
msgid "Stopped (tty input)"
-msgstr ""
+msgstr "Остановлен (ввод с tty)"
#: siglist.c:143
msgid "Stopped (tty output)"
-msgstr ""
+msgstr "Остановлен (вывод на tty)"
#: siglist.c:147
msgid "I/O ready"
-msgstr ""
+msgstr "Готов к вводу/выводу"
#: siglist.c:151
msgid "CPU limit"
-msgstr ""
+msgstr "Ограничение ЦП"
#: siglist.c:155
msgid "File limit"
-msgstr ""
+msgstr "Ограничение величины файла"
#: siglist.c:159
msgid "Alarm (virtual)"
-msgstr ""
+msgstr "Сигнал часов (виртуальный)"
#: siglist.c:163
msgid "Alarm (profile)"
-msgstr ""
+msgstr "Сигнал часов (профиль)"
#: siglist.c:167
msgid "Window changed"
-msgstr ""
+msgstr "Окно изменено"
#: siglist.c:171
msgid "Record lock"
-msgstr ""
+msgstr "Запись блокирована"
#: siglist.c:175
msgid "User signal 1"
-msgstr ""
+msgstr "Сигнал пользователя 1"
#: siglist.c:179
msgid "User signal 2"
-msgstr ""
+msgstr "Сигнал пользователя 2"
#: siglist.c:183
msgid "HFT input data pending"
-msgstr ""
+msgstr "Ожидание входных данных HFT"
#: siglist.c:187
msgid "power failure imminent"
-msgstr ""
+msgstr "неизбежна ошибка питания"
#: siglist.c:191
msgid "system crash imminent"
-msgstr ""
+msgstr "неизбежно падение системы"
#: siglist.c:195
msgid "migrate process to another CPU"
-msgstr ""
+msgstr "процесс переносится на другой ЦП"
#: siglist.c:199
msgid "programming error"
-msgstr ""
+msgstr "программная ошибка"
#: siglist.c:203
msgid "HFT monitor mode granted"
-msgstr ""
+msgstr "Установлен режим монитора HFT"
#: siglist.c:207
msgid "HFT monitor mode retracted"
-msgstr ""
+msgstr "Выход из режима монитора HFT"
#: siglist.c:211
msgid "HFT sound sequence has completed"
-msgstr ""
+msgstr "Последовательность звуков HFT завершена"
#: siglist.c:215
msgid "Information request"
-msgstr ""
+msgstr "Информационный запрос"
#: siglist.c:223
msgid "Unknown Signal #"
-msgstr ""
+msgstr "Неизвестный номер сигнала"
#: siglist.c:225
#, c-format
msgid "Unknown Signal #%d"
-msgstr ""
+msgstr "Неизвестный номер сигнала %d"
#: subst.c:1362 subst.c:1520
#, c-format
msgid "bad substitution: no closing `%s' in %s"
-msgstr ""
+msgstr "неверная подстановка: нет закрывающей «%s» в %s"
#: subst.c:2847
#, c-format
msgid "%s: cannot assign list to array member"
-msgstr ""
+msgstr "%s: не удаётся присвоить список элементу массива"
#: subst.c:5065 subst.c:5081
msgid "cannot make pipe for process substitution"
-msgstr ""
+msgstr "не удаётся создать конвейер для подстановки процесса"
#: subst.c:5113
msgid "cannot make child for process substitution"
-msgstr ""
+msgstr "не удаётся создать дочерний процесс для подстановки"
#: subst.c:5158
#, c-format
msgid "cannot open named pipe %s for reading"
-msgstr "ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ ÉÍÅÎÎÏÊ ËÁÎÁÌ %s ÄÌÑ ÞÔÅÎÉÑ"
+msgstr "не удаётся открыть именованный конвейер %s для чтения"
#: subst.c:5160
#, c-format
msgid "cannot open named pipe %s for writing"
-msgstr "ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ ÉÍÅÎÎÏÊ ËÁÎÁÌ %s ÄÌÑ ÚÁÐÉÓÉ"
+msgstr "не удаётся открыть именованный конвейер %s для записи"
#: subst.c:5178
#, c-format
msgid "cannot duplicate named pipe %s as fd %d"
-msgstr ""
+msgstr "не удаётся скопировать именованный конвейер %s в файловый дескриптор %d"
#: subst.c:5376
msgid "cannot make pipe for command substitution"
-msgstr ""
+msgstr "не удаётся создать конвейер для подстановки команды"
#: subst.c:5414
msgid "cannot make child for command substitution"
-msgstr ""
+msgstr "не удаётся создать дочерний процесс для подстановки команды"
#: subst.c:5433
msgid "command_substitute: cannot duplicate pipe as fd 1"
-msgstr ""
+msgstr "command_substitute: не удаётся скопировать конвейер в файловый дескриптор 1"
#: subst.c:5837 subst.c:8050
-#, fuzzy, c-format
+#, c-format
msgid "%s: invalid variable name for name reference"
-msgstr "%d: ÎÅÄÏÐÕÓÔÉÍÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ: %s"
+msgstr "%s: недопустимое название переменной для ссылки на имя"
#: subst.c:6048
#, c-format
msgid "%s: parameter null or not set"
-msgstr "%s: ÐÁÒÁÍÅÔÒ null ÉÌÉ ÎÅ ÕÓÔÁÎÏ×ÌÅÎ"
+msgstr "%s: паÑ\80амеÑ\82Ñ\80 не задан или пÑ\83Ñ\81Ñ\82ой"
#: subst.c:6320 subst.c:6335
#, c-format
msgid "%s: substring expression < 0"
-msgstr ""
+msgstr "%s: заданное подстрокой выражение меньше нуля"
#: subst.c:7506
#, c-format
msgid "%s: bad substitution"
-msgstr ""
+msgstr "%s: неверная подстановка"
#: subst.c:7583
#, c-format
msgid "$%s: cannot assign in this way"
-msgstr ""
+msgstr "$%s: такое присвоение невозможно"
#: subst.c:7917
-msgid ""
-"future versions of the shell will force evaluation as an arithmetic "
-"substitution"
-msgstr ""
+msgid "future versions of the shell will force evaluation as an arithmetic substitution"
+msgstr "в будущих версиях командный процессор оценка будет выполняться как математическая подстановка"
#: subst.c:8421
-#, fuzzy, c-format
+#, c-format
msgid "bad substitution: no closing \"`\" in %s"
-msgstr "ÎÅÔ ÚÁËÒÙ×ÁÀÝÅÇÏ `%c' × %s"
+msgstr "неверная подстановка: нет закрывающей «`» в %s"
#: subst.c:9322
#, c-format
msgid "no match: %s"
-msgstr "ÎÅÔ ÓÏ×ÐÁÄÅÎÉÑ Ó: %s"
+msgstr "нет совпадений: %s"
#: test.c:147
msgid "argument expected"
-msgstr "ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ ÞÔÏ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÎ ÁÒÇÕÍÅÎÔ"
+msgstr "ожидаеÑ\82Ñ\81Ñ\8f аÑ\80гÑ\83менÑ\82"
#: test.c:156
#, c-format
msgid "%s: integer expression expected"
-msgstr ""
+msgstr "%s: ожидается целочисленное выражение"
#: test.c:264
msgid "`)' expected"
-msgstr "ÏÖÉÄÁÅÔÓÑ `)' "
+msgstr "ожидается символ «)»"
#: test.c:266
#, c-format
msgid "`)' expected, found %s"
-msgstr "ÏÖÉÄÁÌÓÑ `)', ÎÁÊÄÅÎ %s"
+msgstr "ожидается символ «)», обнаружено %s"
-#: test.c:281 test.c:742 test.c:745
+#: test.c:281 test.c:721 test.c:724
#, c-format
msgid "%s: unary operator expected"
-msgstr "%s: ÏÖÉÄÁÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÕÎÁÒÎÏÇÏ ÏÐÅÒÁÔÏÒÁ"
+msgstr "%s: ожидается унарный оператор"
-#: test.c:468 test.c:785
+#: test.c:468 test.c:764
#, c-format
msgid "%s: binary operator expected"
-msgstr "%s: ÏÖÉÄÁÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÂÉÎÁÒÎÏÇÏ ÏÐÅÒÁÔÏÒÁ"
+msgstr "%s: ожидается бинарный оператор"
-#: test.c:860
+#: test.c:839
msgid "missing `]'"
-msgstr "ÐÒÏÐÕÝÅÎ `]'"
+msgstr "оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81имвол «]»"
#: trap.c:217
msgid "invalid signal number"
-msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÎÏÍÅÒ ÓÉÇÎÁÌÁ"
+msgstr "недопустимый номер сигнала"
#: trap.c:371
#, c-format
msgid "run_pending_traps: bad value in trap_list[%d]: %p"
-msgstr ""
+msgstr "run_pending_traps: неверное значение в trap_list[%d]: %p"
#: trap.c:375
#, c-format
-msgid ""
-"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
-msgstr ""
+msgid "run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr "run_pending_traps: обработчик сигнала — SIG_DFL; повторная отправка %d (%s) самому себе"
#: trap.c:428
#, c-format
msgid "trap_handler: bad signal %d"
-msgstr ""
+msgstr "trap_handler: неверный сигнал %d"
#: variables.c:382
#, c-format
msgid "error importing function definition for `%s'"
-msgstr ""
+msgstr "ошибка импорта определения функции для «%s»"
#: variables.c:780
#, c-format
msgid "shell level (%d) too high, resetting to 1"
-msgstr ""
+msgstr "слишком высокий уровень командного процессора (%d); сбрасывается до 1"
#: variables.c:1865
-#, fuzzy, c-format
+#, c-format
msgid "%s: circular name reference"
-msgstr "%d: ÎÅÄÏÐÕÓÔÉÍÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ: %s"
+msgstr "%s: круговая ссылка на имя"
#: variables.c:2228
msgid "make_local_variable: no function context at current scope"
-msgstr ""
+msgstr "make_local_variable: в текущей области отсутствует контекст функции"
#: variables.c:2247
-#, fuzzy, c-format
+#, c-format
msgid "%s: variable may not be assigned value"
-msgstr "%s: ÎÅ ÐÅÒÅÍÅÎÎÁÑ-ÍÁÓÓÉ×"
+msgstr "%s: переменной не может быть присвоено значение"
#: variables.c:3646
msgid "all_local_variables: no function context at current scope"
-msgstr ""
+msgstr "all_local_variables: в текущей области отсутствует контекст функции"
#: variables.c:3891
-#, fuzzy, c-format
+#, c-format
msgid "%s has null exportstr"
-msgstr "%s: ÐÁÒÁÍÅÔÒ null ÉÌÉ ÎÅ ÕÓÔÁÎÏ×ÌÅÎ"
+msgstr "%s имеет пустую exportstr"
#: variables.c:3896 variables.c:3905
#, c-format
msgid "invalid character %d in exportstr for %s"
-msgstr ""
+msgstr "недопустимый символ %d в exportstr для %s"
#: variables.c:3911
#, c-format
msgid "no `=' in exportstr for %s"
-msgstr ""
+msgstr "отсутствует «=» в exportstr для %s"
#: variables.c:4344
msgid "pop_var_context: head of shell_variables not a function context"
-msgstr ""
+msgstr "pop_var_context: заголовок shell_variables не является контекстом функции"
#: variables.c:4357
msgid "pop_var_context: no global_variables context"
-msgstr ""
+msgstr "pop_var_context: отсутствует контекст global_variables"
#: variables.c:4431
msgid "pop_scope: head of shell_variables not a temporary environment scope"
-msgstr ""
+msgstr "pop_scope: заголовок shell_variables не является областью временного окружения"
#: variables.c:5257
-#, fuzzy, c-format
+#, c-format
msgid "%s: %s: cannot open as FILE"
-msgstr "%s: ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ: %s"
+msgstr "%s: %s: не удаётся открыть как ФАЙЛ"
#: variables.c:5262
-#, fuzzy, c-format
+#, c-format
msgid "%s: %s: invalid value for trace file descriptor"
-msgstr "%d: ÎÅÄÏÐÕÓÔÉÍÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ: %s"
+msgstr "%s: %s: недопустимое значение для дескриптора файла трассировки"
#: variables.c:5307
-#, fuzzy, c-format
+#, c-format
msgid "%s: %s: compatibility value out of range"
-msgstr "%s: %s ×ÙÈÏÄÉÔ ÚÁ ÐÒÅÄÅÌÙ ÄÏÐÕÓÔÉÍÙÈ ÚÎÁÞÅÎÉÊ"
+msgstr "%s: %s: значение совместимости за пределами диапазона"
#: version.c:46
msgid "Copyright (C) 2013 Free Software Foundation, Inc."
-msgstr ""
+msgstr "© Free Software Foundation, Inc, 2013."
#: version.c:47 version2.c:47
-msgid ""
-"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
-"html>\n"
-msgstr ""
+msgid "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
+msgstr "Лицензия GPLv3+: GNU GPL версии 3 или более поздней <http://gnu.org/licenses/gpl.html>\n"
#: version.c:86 version2.c:86
#, c-format
msgid "GNU bash, version %s (%s)\n"
-msgstr ""
+msgstr "GNU bash, версия %s (%s)\n"
#: version.c:91 version2.c:91
msgid "This is free software; you are free to change and redistribute it."
-msgstr ""
+msgstr "Это свободное программное обеспечение. Вы можете изменять и распространять его."
#: version.c:92 version2.c:92
msgid "There is NO WARRANTY, to the extent permitted by law."
-msgstr ""
+msgstr "НИКАКАЯ ГАРАНТИЯ не предоставляется в пределах, допускаемых законом."
#: version2.c:46
msgid "Copyright (C) 2012 Free Software Foundation, Inc."
-msgstr ""
+msgstr "© Free Software Foundation, Inc, 2012."
#: xmalloc.c:91
#, c-format
msgid "%s: cannot allocate %lu bytes (%lu bytes allocated)"
-msgstr ""
+msgstr "%s: не удаётся выделить %lu байт (выделено %lu байт)"
#: xmalloc.c:93
-#, fuzzy, c-format
+#, c-format
msgid "%s: cannot allocate %lu bytes"
-msgstr "%s: ÎÅ ÍÏÇÕ ÓÏÚÄÁÔØ: %s"
+msgstr "%s: не удаётся выделить %lu байт"
#: xmalloc.c:163
#, c-format
msgid "%s: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
-msgstr ""
+msgstr "%s: %s:%d: не удаётся выделить %lu байт (выделено %lu байт)"
#: xmalloc.c:165
-#, fuzzy, c-format
+#, c-format
msgid "%s: %s:%d: cannot allocate %lu bytes"
-msgstr "%s: ÎÅ ÍÏÇÕ ÓÏÚÄÁÔØ: %s"
+msgstr "%s: %s:%d: не удаётся выделить %lu байт"
#: builtins.c:43
msgid "alias [-p] [name[=value] ... ]"
-msgstr ""
+msgstr "alias [-p] [имя[=значение] ... ]"
#: builtins.c:47
msgid "unalias [-a] name [name ...]"
-msgstr ""
+msgstr "unalias [-a] имя [имя ...]"
#: builtins.c:51
-msgid ""
-"bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-"
-"x keyseq:shell-command] [keyseq:readline-function or readline-command]"
-msgstr ""
+msgid "bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]"
+msgstr "bind [-lpvsPSVX] [-m раскладка] [-f файл] [-q имя] [-u name] [-r послед_клавиш] [-x послед_клавиш:команда_shell] [послед_клавиш:фнкц_readline или команда_readline]"
#: builtins.c:54
msgid "break [n]"
-msgstr ""
+msgstr "break [n]"
#: builtins.c:56
msgid "continue [n]"
-msgstr ""
+msgstr "continue [n]"
#: builtins.c:58
msgid "builtin [shell-builtin [arg ...]]"
-msgstr ""
+msgstr "builtin [встр_команда [аргумент ...]]"
#: builtins.c:61
msgid "caller [expr]"
-msgstr ""
+msgstr "caller [выражение]"
#: builtins.c:64
msgid "cd [-L|[-P [-e]] [-@]] [dir]"
-msgstr ""
+msgstr "cd [-L|[-P [-e]] [-@]] [каталог]"
#: builtins.c:66
msgid "pwd [-LP]"
-msgstr ""
+msgstr "pwd [-LP]"
#: builtins.c:68
msgid ":"
-msgstr ""
+msgstr ":"
#: builtins.c:70
msgid "true"
-msgstr ""
+msgstr "true"
#: builtins.c:72
msgid "false"
-msgstr ""
+msgstr "false"
#: builtins.c:74
msgid "command [-pVv] command [arg ...]"
-msgstr ""
+msgstr "command [-pVv] команда [аргумент ...]"
#: builtins.c:76
msgid "declare [-aAfFgilnrtux] [-p] [name[=value] ...]"
-msgstr ""
+msgstr "declare [-aAfFgilnrtux] [-p] [имя[=значение] ...]"
#: builtins.c:78
msgid "typeset [-aAfFgilrtux] [-p] name[=value] ..."
-msgstr ""
+msgstr "typeset [-aAfFgilrtux] [-p] имя[=значение] ..."
#: builtins.c:80
msgid "local [option] name[=value] ..."
-msgstr ""
+msgstr "local [параметр] имя[=значение] ..."
#: builtins.c:83
msgid "echo [-neE] [arg ...]"
-msgstr ""
+msgstr "echo [-neE] [аргумент ...]"
#: builtins.c:87
msgid "echo [-n] [arg ...]"
-msgstr ""
+msgstr "echo [-n] [аргумент ...]"
#: builtins.c:90
msgid "enable [-a] [-dnps] [-f filename] [name ...]"
-msgstr ""
+msgstr "enable [-a] [-dnps] [-f файл] [имя ...]"
#: builtins.c:92
msgid "eval [arg ...]"
-msgstr ""
+msgstr "eval [аргумент ...]"
#: builtins.c:94
msgid "getopts optstring name [arg]"
-msgstr ""
+msgstr "getopts строка_параметров название [аргумент]"
#: builtins.c:96
msgid "exec [-cl] [-a name] [command [arguments ...]] [redirection ...]"
-msgstr ""
+msgstr "exec [-cl] [-a имя] [команда] [аргументы ...]] [перенаправление ...]"
#: builtins.c:98
msgid "exit [n]"
-msgstr ""
+msgstr "exit [n]"
#: builtins.c:100
msgid "logout [n]"
-msgstr ""
+msgstr "logout [n]"
#: builtins.c:103
msgid "fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command]"
-msgstr ""
+msgstr "fc [-e название_редактора] [-lnr] [первая] [последняя] или fc -s [шаблон=замена] [команда]"
#: builtins.c:107
msgid "fg [job_spec]"
-msgstr ""
+msgstr "fg [задание]"
#: builtins.c:111
msgid "bg [job_spec ...]"
-msgstr ""
+msgstr "bg [задание ...]"
#: builtins.c:114
msgid "hash [-lr] [-p pathname] [-dt] [name ...]"
-msgstr ""
+msgstr "hash [-lr] [-p путь] [-dt] [имя ...]"
#: builtins.c:117
msgid "help [-dms] [pattern ...]"
-msgstr ""
+msgstr "help [-dms] [шаблон ...]"
#: builtins.c:121
-msgid ""
-"history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg "
-"[arg...]"
-msgstr ""
+msgid "history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]"
+msgstr "history [-c] [-d смещение] [n] или history -anrw [файл] или history -ps аргумент [аргумент...]"
#: builtins.c:125
msgid "jobs [-lnprs] [jobspec ...] or jobs -x command [args]"
-msgstr ""
+msgstr "jobs [-lnprs] [задание ...] или jobs -x команда [аргументы]"
#: builtins.c:129
msgid "disown [-h] [-ar] [jobspec ...]"
-msgstr ""
+msgstr "disown [-h] [-ar] [задание ...]"
#: builtins.c:132
-msgid ""
-"kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l "
-"[sigspec]"
-msgstr ""
+msgid "kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]"
+msgstr "kill [-s назв_сигнала | -n номер_сигнала | -назв_сигнала] pid | назв_задания] ... или kill -l [назв_сигнала]"
#: builtins.c:134
msgid "let arg [arg ...]"
-msgstr ""
+msgstr "let аргумент [аргумент ...]"
#: builtins.c:136
-msgid ""
-"read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p "
-"prompt] [-t timeout] [-u fd] [name ...]"
-msgstr ""
+msgid "read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]"
+msgstr "read [-ers] [-a массив] [-d разделитель] [-i текст] [-n число_символов] [-N число_символов] [-p приглашение] [-t тайм-аут] [-u дескриптор_файла] [имя ...]"
#: builtins.c:138
msgid "return [n]"
-msgstr ""
+msgstr "return [n]"
#: builtins.c:140
msgid "set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]"
-msgstr ""
+msgstr "set [-abefhkmnptuvxBCHP] [-o параметр] [--] [аргумент ...]"
#: builtins.c:142
msgid "unset [-f] [-v] [-n] [name ...]"
-msgstr ""
+msgstr "unset [-f] [-v] [-n] [имя ...]"
#: builtins.c:144
msgid "export [-fn] [name[=value] ...] or export -p"
-msgstr ""
+msgstr "export [-fn] [имя[=значение ...] или export -p"
#: builtins.c:146
msgid "readonly [-aAf] [name[=value] ...] or readonly -p"
-msgstr ""
+msgstr "readonly [-aAf] [имя[=значение] ...] или readonly -p"
#: builtins.c:148
msgid "shift [n]"
-msgstr ""
+msgstr "shift [n]"
#: builtins.c:150
-#, fuzzy
msgid "source filename [arguments]"
-msgstr "ÔÒÅÂÕÅÔÓÑ ÁÒÇÕÍÅÎÔ ÉÍÑ ÆÁÊÌÁ"
+msgstr "source файл [аргументы]"
#: builtins.c:152
-#, fuzzy
msgid ". filename [arguments]"
-msgstr "ÔÒÅÂÕÅÔÓÑ ÁÒÇÕÍÅÎÔ ÉÍÑ ÆÁÊÌÁ"
+msgstr ". файл [аргументы]"
#: builtins.c:155
msgid "suspend [-f]"
-msgstr ""
+msgstr "suspend [-f]"
#: builtins.c:158
msgid "test [expr]"
-msgstr ""
+msgstr "test [выражение]"
#: builtins.c:160
msgid "[ arg... ]"
-msgstr ""
+msgstr "[ аргумент... ]"
#: builtins.c:162
msgid "times"
-msgstr ""
+msgstr "times"
#: builtins.c:164
msgid "trap [-lp] [[arg] signal_spec ...]"
-msgstr ""
+msgstr "trap [-lp] [[аргумент] назв_сигнала ...]"
#: builtins.c:166
msgid "type [-afptP] name [name ...]"
-msgstr ""
+msgstr "type [-afptP] имя [имя ...]"
#: builtins.c:169
msgid "ulimit [-SHabcdefilmnpqrstuvxT] [limit]"
-msgstr ""
+msgstr "ulimit [-SHabcdefilmnpqrstuvxT] [ограничение]"
#: builtins.c:172
msgid "umask [-p] [-S] [mode]"
-msgstr ""
+msgstr "umask [-p] [-S] [режим]"
#: builtins.c:175
msgid "wait [-n] [id ...]"
-msgstr ""
+msgstr "wait [-n] [идентификатор ...]"
#: builtins.c:179
msgid "wait [pid ...]"
-msgstr ""
+msgstr "wait [идентификатор ...]"
#: builtins.c:182
msgid "for NAME [in WORDS ... ] ; do COMMANDS; done"
-msgstr ""
+msgstr "for ИМЯ [in СЛОВА ... ;] do КОМАНДЫ; done"
#: builtins.c:184
msgid "for (( exp1; exp2; exp3 )); do COMMANDS; done"
-msgstr ""
+msgstr "for (( выраж1; выраж2; выраж3 )); do КОМАНДЫ; done"
#: builtins.c:186
msgid "select NAME [in WORDS ... ;] do COMMANDS; done"
-msgstr ""
+msgstr "select ИМЯ [in СЛОВА ... ;] do КОМАНДЫ; done"
#: builtins.c:188
msgid "time [-p] pipeline"
-msgstr ""
+msgstr "time [-p] конвейер"
#: builtins.c:190
msgid "case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac"
-msgstr ""
+msgstr "case СЛОВО in [ШАБЛОН [| ШАБЛОН]...) КОМАНДЫ ;;]... esac"
#: builtins.c:192
-msgid ""
-"if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else "
-"COMMANDS; ] fi"
-msgstr ""
+msgid "if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi"
+msgstr "if КОМАНДЫ; then КОМАНДЫ; [ elif КОМАНДЫ; then КОМАНДЫ; ]... [ else КОМАНДЫ; ] fi"
#: builtins.c:194
msgid "while COMMANDS; do COMMANDS; done"
-msgstr ""
+msgstr "while КОМАНДЫ; do КОМАНДЫ; done"
#: builtins.c:196
msgid "until COMMANDS; do COMMANDS; done"
-msgstr ""
+msgstr "until КОМАНДЫ; do КОМАНДЫ; done"
#: builtins.c:198
msgid "coproc [NAME] command [redirections]"
-msgstr ""
+msgstr "coproc [ИМЯ] команда [перенаправления]"
#: builtins.c:200
msgid "function name { COMMANDS ; } or name () { COMMANDS ; }"
-msgstr ""
+msgstr "function ИМЯ { КОМАНДЫ ; } или ИМЯ () { КОМАНДЫ ; }"
#: builtins.c:202
msgid "{ COMMANDS ; }"
-msgstr ""
+msgstr "{ КОМАНДЫ ; }"
#: builtins.c:204
msgid "job_spec [&]"
-msgstr ""
+msgstr "задание [&]"
#: builtins.c:206
-#, fuzzy
msgid "(( expression ))"
-msgstr "ÏÖÉÄÁÌÏÓØ ×ÙÒÁÖÅÎÉÅ"
+msgstr "(( выражение ))"
#: builtins.c:208
-#, fuzzy
msgid "[[ expression ]]"
-msgstr "ÏÖÉÄÁÌÏÓØ ×ÙÒÁÖÅÎÉÅ"
+msgstr "[[ выражение ]]"
#: builtins.c:210
msgid "variables - Names and meanings of some shell variables"
-msgstr ""
+msgstr "переменные — имена и значения некоторых переменных командного процессора"
#: builtins.c:213
msgid "pushd [-n] [+N | -N | dir]"
-msgstr ""
+msgstr "pushd [-n] [+N | -N | каталог]"
#: builtins.c:217
msgid "popd [-n] [+N | -N]"
-msgstr ""
+msgstr "popd [-n] [+N | -N]"
#: builtins.c:221
msgid "dirs [-clpv] [+N] [-N]"
-msgstr ""
+msgstr "dirs [-clpv] [+N] [-N]"
#: builtins.c:224
msgid "shopt [-pqsu] [-o] [optname ...]"
-msgstr ""
+msgstr "shopt [-pqsu] [-o] [параметр ...]"
#: builtins.c:226
msgid "printf [-v var] format [arguments]"
-msgstr ""
+msgstr "printf [-v переменная] формат [аргументы]"
#: builtins.c:229
-msgid ""
-"complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-"
-"W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S "
-"suffix] [name ...]"
-msgstr ""
+msgid "complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]"
+msgstr "complete [-abcdefgjksuv] [-pr] [-DE] [-o параметр] [-A действие] [-G глоб_шаблон] [-W список_слов] [-F функция] [-C команда] [-X фильтр_шабл] [-P префикс] [-S суффикс] [имя ...]"
#: builtins.c:233
-msgid ""
-"compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] "
-"[-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
-msgstr ""
+msgid "compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
+msgstr "compgen [-abcdefgjksuv] [-o параметр] [-A действие] [-G глоб_шабл] [-W список_слов] [-F функция] [-C команда] [-X фильтр_шабл] [-P префикс] [-S суффикс] [слово]"
#: builtins.c:237
msgid "compopt [-o|+o option] [-DE] [name ...]"
-msgstr ""
+msgstr "compopt [-o|+o параметр] [-DE] [имя ...]"
#: builtins.c:240
-msgid ""
-"mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
+msgid "mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "mapfile [-n количество] [-O источник] [-s количество] [-t] [-u дейскриптор_файла] [-C обратный_вызов] [-c квант] [массив]"
#: builtins.c:242
-msgid ""
-"readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
+msgid "readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "readarray [-n количество] [-O источник] [-s количество] [-t] [-u дейскриптор_файла] [-C обратный_вызов] [-c квант] [массив]"
#: builtins.c:254
msgid ""
" -p\tPrint all defined aliases in a reusable format\n"
" \n"
" Exit Status:\n"
-" alias returns true unless a NAME is supplied for which no alias has "
-"been\n"
+" alias returns true unless a NAME is supplied for which no alias has been\n"
" defined."
msgstr ""
+"Определение или отображение псевдонимов.\n"
+" \n"
+" Если не указать аргументы, alias выводит список псевдонимов\n"
+" в виде «alias имя=значение» на стандартный вывод.\n"
+" \n"
+" В противном случае каждому имени, для которого указано значение, назначается псевдоним.\n"
+" Если значение в конце содержит пробел, следующее слово будет\n"
+" проверяться на замену псевдонима при его расширении.\n"
+" \n"
+" Параметры:\n"
+" -p\tвыводит все определённые псевдонимы\n"
+" \n"
+" Состояние выхода:\n"
+" alias возвращает истину, если для указанного имени был задан\n"
+" псевдоним."
#: builtins.c:276
msgid ""
" \n"
" Return success unless a NAME is not an existing alias."
msgstr ""
+"Удаляет каждое имя из списка определённых псевдонимов.\n"
+" \n"
+" Параметры:\n"
+" -a\tудаляет все определения псевдонимов\n"
+" \n"
+" Возвращает успех, если имя связано с существующим псевдонимом."
#: builtins.c:289
msgid ""
" Options:\n"
" -m keymap Use KEYMAP as the keymap for the duration of this\n"
" command. Acceptable keymap names are emacs,\n"
-" emacs-standard, emacs-meta, emacs-ctlx, vi, vi-"
-"move,\n"
+" emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,\n"
" vi-command, and vi-insert.\n"
" -l List names of functions.\n"
" -P List function names and bindings.\n"
" -p List functions and bindings in a form that can be\n"
" reused as input.\n"
-" -S List key sequences that invoke macros and their "
-"values\n"
-" -s List key sequences that invoke macros and their "
-"values\n"
+" -S List key sequences that invoke macros and their values\n"
+" -s List key sequences that invoke macros and their values\n"
" in a form that can be reused as input.\n"
" -V List variable names and values\n"
" -v List variable names and values in a form that can\n"
" be reused as input.\n"
" -q function-name Query about which keys invoke the named function.\n"
-" -u function-name Unbind all keys which are bound to the named "
-"function.\n"
+" -u function-name Unbind all keys which are bound to the named function.\n"
" -r keyseq Remove the binding for KEYSEQ.\n"
" -f filename Read key bindings from FILENAME.\n"
" -x keyseq:shell-command\tCause SHELL-COMMAND to be executed when\n"
" Exit Status:\n"
" bind returns 0 unless an unrecognized option is given or an error occurs."
msgstr ""
+"Определение привязок клавиш и переменных readline.\n"
+" \n"
+" Привязывает последовательность клавиш функции readline или макросу\n"
+" или задаёт переменную readline. Синтаксис аргументов без параметров аналогичен\n"
+" синтаксису файла ~/.inputrc, но всё должно передаваться в одном аргументе,\n"
+" например bind '\"\\C-x\\C-r\": перечитать-init-файл'.\n"
+" \n"
+" Параметры:\n"
+" -m раскладка использовать указанную раскладку во время выполнения\n"
+" данной команды. Допустимые раскладки: emacs,\n"
+" emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,\n"
+" vi-command и vi-insert.\n"
+" -l вывести названия функций\n"
+" -P вывести названия функций и их привязки\n"
+" -p вывести функции и их привязки в формате\n"
+" для повторного использования\n"
+" -S вывести список последовательностей клавиш, которые\n"
+" вызывают макросы, и их значения\n"
+" -s вывести список последовательностей клавиш, которые\n"
+" вызывают макросы, и их значения\n"
+" в формате для повторного использования\n"
+" -V вывести названия переменных и их значения\n"
+" -v вывести имена переменных и их значения\n"
+" в формате для повторного использования\n"
+" -q имя_функции\t вывести клавиши, вызывающие указанную функцию\n"
+" -u имя_функции отвязать все клавиши, привязанные к указанной функции\n"
+" -r посл-клавиш удалить привязку для последовательности клавиш\n"
+" -f файл прочитать привязки из файла\n"
+" -x посл-клавиш:кмнд-shell выполнить команду bash, если введена\n"
+" \t\t\t\tпоследовательность клавиш\n"
+" -X\t\t вывести последовательности клавиш, привязанные с помощью -x, и связанные команды\n"
+" в формате для повторного использования\n"
+" \n"
+" Состояние выхода:\n"
+" bind возвращает 0, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:328
msgid ""
" Exit Status:\n"
" The exit status is 0 unless N is not greater than or equal to 1."
msgstr ""
+"Прерывание цикла for, while или until.\n"
+" \n"
+" Прерывает цикл for, while или until. Если указано N, прерывает N вложенных\n"
+" циклов.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 0, если N не больше или равно 1."
#: builtins.c:340
msgid ""
" Exit Status:\n"
" The exit status is 0 unless N is not greater than or equal to 1."
msgstr ""
+"Возобновление цикла for, while или until.\n"
+" \n"
+" Возобновляет следующую итерацию вложенного цикла for, while или until.\n"
+" Если указано N, возобновляет N-й вложенный цикл.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 0, если N не больше или равно 1."
#: builtins.c:352
msgid ""
" \n"
" Execute SHELL-BUILTIN with arguments ARGs without performing command\n"
" lookup. This is useful when you wish to reimplement a shell builtin\n"
-" as a shell function, but need to execute the builtin within the "
-"function.\n"
+" as a shell function, but need to execute the builtin within the function.\n"
" \n"
" Exit Status:\n"
" Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is\n"
" not a shell builtin.."
msgstr ""
+"Выполнение встроенных команд.\n"
+" \n"
+" Выполняет встроенную команду bash с аргументами\n"
+" без поиска команды. Это полезно, если нужно переопределить встроенную команду\n"
+" как функцию командного процессора, в этой функции нужно выполнить встроенную команду.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние выхода встроенной команды или ложь, если указанная команда bash\n"
+" не является встроенной."
#: builtins.c:367
msgid ""
" Returns 0 unless the shell is not executing a shell function or EXPR\n"
" is invalid."
msgstr ""
+"Возвращает контекст вызова текущей подпрограммы.\n"
+" \n"
+" Если выражение не указано, возвращает «$line $filename». Если выражение указано, возвращает\n"
+" «$line $subroutine $filename». Эти дополнительные данные можно\n"
+" использовать для трассировки стека.\n"
+" \n"
+" Значение выражения означает количество кадров, которое нужно вызвать\n"
+" для возврата к текущему кадру. Первый кадр имеет номер 0.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 0, если командный процессор не выполняет функцию, или выражение\n"
+" является допустимым."
#: builtins.c:385
msgid ""
"Change the shell working directory.\n"
" \n"
-" Change the current directory to DIR. The default DIR is the value of "
-"the\n"
+" Change the current directory to DIR. The default DIR is the value of the\n"
" HOME shell variable.\n"
" \n"
-" The variable CDPATH defines the search path for the directory "
-"containing\n"
-" DIR. Alternative directory names in CDPATH are separated by a colon "
-"(:).\n"
-" A null directory name is the same as the current directory. If DIR "
-"begins\n"
+" The variable CDPATH defines the search path for the directory containing\n"
+" DIR. Alternative directory names in CDPATH are separated by a colon (:).\n"
+" A null directory name is the same as the current directory. If DIR begins\n"
" with a slash (/), then CDPATH is not used.\n"
" \n"
-" If the directory is not found, and the shell option `cdable_vars' is "
-"set,\n"
-" the word is assumed to be a variable name. If that variable has a "
-"value,\n"
+" If the directory is not found, and the shell option `cdable_vars' is set,\n"
+" the word is assumed to be a variable name. If that variable has a value,\n"
" its value is used for DIR.\n"
" \n"
" Options:\n"
" \tof `..'\n"
" -e\tif the -P option is supplied, and the current working directory\n"
" \tcannot be determined successfully, exit with a non-zero status\n"
-" -@ on systems that support it, present a file with extended "
-"attributes\n"
+" -@ on systems that support it, present a file with extended attributes\n"
" as a directory containing the file attributes\n"
" \n"
" The default is to follow symbolic links, as if `-L' were specified.\n"
-" `..' is processed by removing the immediately previous pathname "
-"component\n"
+" `..' is processed by removing the immediately previous pathname component\n"
" back to a slash or the beginning of DIR.\n"
" \n"
" Exit Status:\n"
-" Returns 0 if the directory is changed, and if $PWD is set successfully "
-"when\n"
+" Returns 0 if the directory is changed, and if $PWD is set successfully when\n"
" -P is used; non-zero otherwise."
msgstr ""
+"Смена рабочего каталога командного процессора.\n"
+" \n"
+" Изменяет текущий каталог на указанный каталог. Каталог по умолчанию хранится в\n"
+" переменной $HOME командного процессора.\n"
+" \n"
+" Переменная $CDPATH определяет путь поиска каталога, содержащего\n"
+" указанный каталог. Альтернативные каталоги в $CDPATH разделяются двоеточием (:).\n"
+" Пустое название каталога соответствует текущему каталогу. Если каталог начинается\n"
+" с косой черты (/), переменная $CDPATH не используется.\n"
+" \n"
+" Если каталог не найден и задан параметр «cdable_vars»,\n"
+" слово считается названием переменной. Если эта переменная содержит значение,\n"
+" оно используется для каталога.\n"
+" \n"
+" Параметры:\n"
+" -L\tпереходить по символьным ссылкам: ссылки раскрываются \n"
+" \tв каталоге после обработки экземпляров «..»\n"
+" -P\tиспользовать физическую структуру каталогов без перехода\n"
+" \tпо символьным ссылкам: ссылки раскрываются в каталоге до\n"
+" \tобработки «..»\n"
+" -e\tесли указан параметр -P, и не удаётся определить текущий\n"
+" \tрабочий каталог, команда завершается с ненулевым состоянием\n"
+" -@ на системах, которые это поддерживают, представляет файл с расширенными\n"
+" атрибутами как каталог, содержащий атрибуты файла\n"
+" \n"
+" По умолчанию выполняется переход по символьным ссылкам (как при указании параметра «-L»).\n"
+" «..» обрабатывается путём удаления первого компонента пути до косой черты\n"
+" или из начала каталога.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 0, если каталог был изменён, и если $PWD был успешно установлен\n"
+" при использовании параметра -P. В противном случае возвращается ненулевое состояние."
#: builtins.c:422
msgid ""
" Returns 0 unless an invalid option is given or the current directory\n"
" cannot be read."
msgstr ""
+"Вывод названия текущего рабочего каталога.\n"
+" \n"
+" Параметры:\n"
+" -L\tвывести значение $PWD, если переменная указывает на\n"
+" \tтекущий рабочий каталог\n"
+" -P\tвывести физический каталог без символьных ссылок\n"
+" \n"
+" По умолчанию «pwd» работает как без указания «-L».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 0, если был указан допустимый параметр или можно прочитать\n"
+" текущий каталог."
#: builtins.c:439
-#, fuzzy
msgid ""
"Null command.\n"
" \n"
" Exit Status:\n"
" Always succeeds."
msgstr ""
-" îÅÔ ËÁËÏÇÏ-ÌÉÂÏ ÜÆÆÅËÔÁ; ËÏÍÁÎÄÁ ÎÉÞÅÇÏ ÎÅ ÄÅÌÁÅÔ. îÕÌØ ×ÏÚ×ÒÁÝÁÅÔÓÑ × "
-"ËÁÞÅÓÔ×Å ÒÅÚÕÌØÔÁÔÁ."
+"Пустая команда.\n"
+" \n"
+" Команда не выполняет никаких действий и ни на что не влияет.\n"
+" \n"
+" Состояние выхода:\n"
+" Всегда возвращает успех."
#: builtins.c:450
msgid ""
" Exit Status:\n"
" Always succeeds."
msgstr ""
+"Возвращает результат успешного выполнения.\n"
+" \n"
+" Состояние выхода:\n"
+" Всегда возвращает успех."
#: builtins.c:459
-#, fuzzy
msgid ""
"Return an unsuccessful result.\n"
" \n"
" Exit Status:\n"
" Always fails."
-msgstr "÷ÏÚ×ÒÁÝÁÅÔ ÒÅÚÕÌØÔÁÔ: ÎÅÕÄÁÞÁ."
+msgstr ""
+"Возвращает результат неудачного выполнения.\n"
+" \n"
+" Состояние выхода:\n"
+" Всегда возвращает ошибку."
#: builtins.c:468
msgid ""
"Execute a simple command or display information about commands.\n"
" \n"
" Runs COMMAND with ARGS suppressing shell function lookup, or display\n"
-" information about the specified COMMANDs. Can be used to invoke "
-"commands\n"
+" information about the specified COMMANDs. Can be used to invoke commands\n"
" on disk when a function with the same name exists.\n"
" \n"
" Options:\n"
" Exit Status:\n"
" Returns exit status of COMMAND, or failure if COMMAND is not found."
msgstr ""
+"Выполнение простой команды или вывод информации о командах.\n"
+" \n"
+" Выполняет команду с аргументами без поиска функции командного процессора\n"
+" или выводит информацию об указанных командах. Можно использовать для вызова команд\n"
+" с диска, когда функция с таким именем уже существует.\n"
+" \n"
+" Параметры:\n"
+" -p\tиспользовать значение по умолчанию для $PATH, чтобы гарантированно\n"
+" \tнайти все стандартные команды\n"
+" -v\tвывести описание команды аналогично встроенной команде «type»\n"
+" -V\tвывести более подробное описание каждой команды\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние выхода КОМАНДЫ или ошибку, если КОМАНДА не найдена."
#: builtins.c:487
msgid ""
" Variables with the integer attribute have arithmetic evaluation (see\n"
" the `let' command) performed when the variable is assigned a value.\n"
" \n"
-" When used in a function, `declare' makes NAMEs local, as with the "
-"`local'\n"
+" When used in a function, `declare' makes NAMEs local, as with the `local'\n"
" command. The `-g' option suppresses this behavior.\n"
" \n"
" Exit Status:\n"
" Returns success unless an invalid option is supplied or a variable\n"
" assignment error occurs."
msgstr ""
+"Указание значений переменных и атрибутов.\n"
+" \n"
+" Объявление переменных и назначение им атрибутов. Если имена не указаны,\n"
+" выводит атрибуты и значения всех переменных.\n"
+" \n"
+" Параметры:\n"
+" -f\tограничить действие или вывести имена функций и их определения\n"
+" -F\tвывести только имена функций (а также номер строки\n"
+" \tв исходном файле при отладке)\n"
+" -g\tсоздать глобальные переменные при использовании в функции командного процессора; в противном случае\n"
+" \tигнорируется\n"
+" -p\tвывести атрибуты и значения каждого имени\n"
+" \n"
+" Параметры, задающие атрибуты:\n"
+" -a\tсделать имена индексированными массивами (если поддерживается)\n"
+" -A\tсделать имена ассоциативными массивами (если поддерживается)\n"
+" -i\tназначить именам атрибут «integer»\n"
+" -l\tперевести имена в нижний регистр при назначении\n"
+" -n\tсделать имя ссылкой на переменную с именем, соответствующим её значению\n"
+" -r\tотключить запись в имена\n"
+" -t\tназначить именам атрибут «trace»\n"
+" -l\tперевести имена в верхний регистр при назначении\n"
+" -x\tэкспортировать имена\n"
+" \n"
+" Знак «+» вместо «-» отключает указанный атрибут.\n"
+" \n"
+" Переменные с атрибутом «integer» содержат математическое выражение (см.\n"
+" команду «let»), которое рассчитывается при назначении значения переменной.\n"
+" \n"
+" При использовании в функции «declare» делает имена локальными как при использовании\n"
+" данной команды. Параметр «-g» отключает это поведение.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла\n"
+" ошибка присвоения."
#: builtins.c:527
msgid ""
" \n"
" Obsolete. See `help declare'."
msgstr ""
+"Указание значений переменных и атрибутов.\n"
+" \n"
+" Устарел. См. «help declare»."
#: builtins.c:535
msgid ""
" Returns success unless an invalid option is supplied, a variable\n"
" assignment error occurs, or the shell is not executing a function."
msgstr ""
+"Определение локальных переменных.\n"
+" \n"
+" Создаёт локальную переменную НАЗВАНИЕ и присваивает ей ЗНАЧЕНИЕ. Параметром может быть\n"
+" любой параметр, принимаемый командой «declare».\n"
+" \n"
+" Локальные переменные можно использовать только внутри функции. Они видны\n"
+" только той функции, где они определены, и её дочерним функциям.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр, не возникла\n"
+" ошибка присвоения переменной или командный процессор не выполняет функцию."
#: builtins.c:552
msgid ""
"Write arguments to the standard output.\n"
" \n"
-" Display the ARGs, separated by a single space character and followed by "
-"a\n"
+" Display the ARGs, separated by a single space character and followed by a\n"
" newline, on the standard output.\n"
" \n"
" Options:\n"
" Exit Status:\n"
" Returns success unless a write error occurs."
msgstr ""
+"Вывод аргументов на стандартный вывод.\n"
+" \n"
+" Выводит АРГУМЕНТЫ, разделённые пробелом, и добавляя в конце символ новой строки\n"
+" на стандартный вывод.\n"
+" \n"
+" Параметры:\n"
+" -n\tне добавлять символ новой строки\n"
+" -e\tвключить интерпретацию символов, экранированных обратной косой чертой\n"
+" -E\tявно отключить интерпретацию символов, экранированных обратной косой чертой\n"
+" \n"
+" «echo» интерпретирует следующие символы, экранированные обратной косой чертой:\n"
+" \\a\tоповещение (звуковой сигнал)\n"
+" \\b\tbackspace\n"
+" \\c\tотключение дальнейшего вывода\n"
+" \\e\tсимвол escape\n"
+" \\E\tсимвол escape\n"
+" \\f\tпрогон страницы\n"
+" \\n\tновая строка\n"
+" \\r\tвозврат каретки\n"
+" \\t\tгоризонтальная табуляция\n"
+" \\v\tвертикальная табуляция\n"
+" \\\\\tобратная косая черта\n"
+" \\0nnn\tсимвол с ASCII-кодом NNN (восьмеричным) NNN может быть длиной\n"
+" \tот 0 до 3 восьмеричных цифр\n"
+" \\xHH\tвосьмиразрядный символ, значение которого — HH (шестнадцатеричное) HH\n"
+" \tможет быть одной или двумя шестнадцатеричными цифрами\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если не произошла ошибка записи."
#: builtins.c:588
msgid ""
" Exit Status:\n"
" Returns success unless a write error occurs."
msgstr ""
+"Вывод аргументов на стандартный вывод.\n"
+" \n"
+" Выводит АРУГМЕНТЫ на стандартный вывод, добавляя в конце символ новой строки.\n"
+" \n"
+" Параметры:\n"
+" -n\tне добавлять символ новой строки\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если не произошла ошибка записи."
#: builtins.c:603
msgid ""
" Exit Status:\n"
" Returns success unless NAME is not a shell builtin or an error occurs."
msgstr ""
+"Включение и отключение встроенных команд командного процессора.\n"
+" \n"
+" Включает и отключает команды, встроенные в командный процессор. Отключение позволит\n"
+" выполнить команду с диска, название которой совпадает с названием встроенной команды,\n"
+" без указания полного пути к ней.\n"
+" \n"
+" Параметры:\n"
+" -a\tвывести список встроенных команд и их состояние\n"
+" -n\tотключить все НАЗВАНИЯ или вывести список отключённых команд\n"
+" -p\tвывести список встроенных команд\n"
+" -s\tвывести только названия встроенных команд «special» Posix\n"
+" \n"
+" Параметры, управляющие динамической загрузкой:\n"
+" -f\tзагрузить встроенную команду НАЗВАНИЕ из общего объекта ФАЙЛ\n"
+" -d\tудалить встроенную функцию, загруженную с параметром -f\n"
+" \n"
+" Если не указать параметры, включаются все НАЗВАНИЯ.\n"
+" \n"
+" Чтобы использовать команду «test», найденную в переменной $PATH,\n"
+" а не встроенную в командный процессор, введите «enable -n test».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если НАЗВАНИЕ не является встроенной командой или не произошла ошибка."
#: builtins.c:631
msgid ""
"Execute arguments as a shell command.\n"
" \n"
-" Combine ARGs into a single string, use the result as input to the "
-"shell,\n"
+" Combine ARGs into a single string, use the result as input to the shell,\n"
" and execute the resulting commands.\n"
" \n"
" Exit Status:\n"
" Returns exit status of command or success if command is null."
msgstr ""
+"Выполнение аргументов как команды командного процессора.\n"
+" \n"
+" Объединяет АРГУМЕНТЫ в одну строку, результат передаётся\n"
+" в командный процессор с выполнением полученных команд.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние выхода команды или успех, если команда пустая."
#: builtins.c:643
msgid ""
" Returns success if an option is found; fails if the end of options is\n"
" encountered or an error occurs."
msgstr ""
+"Анализ аргументов параметра.\n"
+" \n"
+" Getopts используется процедурами командного процессора для анализа\n"
+" позиционных параметров.\n"
+" \n"
+" OPTSTRING содержит буквы распознаваемого параметра. Если после\n"
+" буквы идёт двоеточие, считается, что у параметра есть аргумент,\n"
+" который должен быть отделён пробелом.\n"
+" \n"
+" При каждом вызове getopts поместит следующий параметр в переменную\n"
+" $name, проинициализировав это название, если оно не существует,\n"
+" и проиндексирует следующий обрабатываемый аргумент в переменной\n"
+" OPTIND. Переменная OPTIND инициализируется при каждом вызове\n"
+" командного процессора или скрипта. Когда для параметра нужен аргумент,\n"
+" getopts помещает этот аргумент в переменную OPTARG.\n"
+" \n"
+" getopts сообщает об ошибках одним из двух способов. Если первый символ\n"
+" OPTSTRING является двоеточием, getopts включает режим молчания. В этом\n"
+" режиме сообщения об ошибках не выводятся. Если указан неверный\n"
+" параметр, getopts помещает символ параметра в переменную OPTARG. Если\n"
+" обязательный аргумент не найден, getopts помещает «:» в НАЗВАНИЕ\n"
+" и задаёт для OPTARG символ найденного параметра. Если getopts не в режиме\n"
+" молчания, и был указан неверный параметр, getopts помещает «?»\n"
+" в НАЗВАНИЕ и удаляет переменную OPTARG. Если обязательный аргумент не найден, в НАЗВАНИЕ\n"
+" помещается «?», переменная OPTARG удаляется и выводится диагностическое\n"
+" сообщение.\n"
+" \n"
+" Если переменная OPTERR имеет значение 0, getopts отключает\n"
+" вывод сообщений об ошибках, даже если первый символ переменной\n"
+" OPTSTRING не является двоеточием. По умолчанию переменная OPTERR имеет значение 1.\n"
+" \n"
+" Getopts обычно анализирует позиционные параметры ($0–$9), но если\n"
+" задано больше аргументов, анализируются последние.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если найден параметр. Возвращает ошибку, если достигнут\n"
+" конец параметров или возникла ошибка."
#: builtins.c:685
msgid ""
"Replace the shell with the given command.\n"
" \n"
" Execute COMMAND, replacing this shell with the specified program.\n"
-" ARGUMENTS become the arguments to COMMAND. If COMMAND is not "
-"specified,\n"
+" ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified,\n"
" any redirections take effect in the current shell.\n"
" \n"
" Options:\n"
" -c\t\texecute COMMAND with an empty environment\n"
" -l\t\tplace a dash in the zeroth argument to COMMAND\n"
" \n"
-" If the command cannot be executed, a non-interactive shell exits, "
-"unless\n"
+" If the command cannot be executed, a non-interactive shell exits, unless\n"
" the shell option `execfail' is set.\n"
" \n"
" Exit Status:\n"
-" Returns success unless COMMAND is not found or a redirection error "
-"occurs."
+" Returns success unless COMMAND is not found or a redirection error occurs."
msgstr ""
+"Замена командного процессора указанной командой.\n"
+" \n"
+" Выполняет КОМАНДУ, заменяя данный командный процессор указанной программой.\n"
+" АРГУМЕНТЫ становятся аргументами для КОМАНДЫ. Если КОМАНДА не указана,\n"
+" все перенаправления будет выполняться в текущем командном процессоре.\n"
+" \n"
+" Параметры:\n"
+" -a имя\t\tпередать ИМЯ как нулевой аргумент в КОМАНДУ\n"
+" -c\t\tвыполнить КОМАНДУ с пустым окружением\n"
+" -l\t\tпоместить тире в нулевой аргумент для КОМАНДЫ\n"
+" \n"
+" Если команду не удаётся выполнить, не интерактивный командный процессор\n"
+" закроется (если только на задан «execfail»).\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если КОМАНДА не была найдена или не возникла ошибка перенаправления."
#: builtins.c:706
msgid ""
" Exits the shell with a status of N. If N is omitted, the exit status\n"
" is that of the last command executed."
msgstr ""
+"Выход из командного процессора.\n"
+" \n"
+" Закрывает командный процессор с состоянием N. Если N опущен, состояние\n"
+" выхода будет относиться к последней выполненной команде."
#: builtins.c:715
msgid ""
"Exit a login shell.\n"
" \n"
-" Exits a login shell with exit status N. Returns an error if not "
-"executed\n"
+" Exits a login shell with exit status N. Returns an error if not executed\n"
" in a login shell."
msgstr ""
+"Выход из командного процессора login.\n"
+" \n"
+" Закрывает командный процессор login с состоянием выхода N. Возвращает\n"
+" ошибку, если выполняется не в командном процессоре login."
#: builtins.c:725
msgid ""
"Display or execute commands from the history list.\n"
" \n"
-" fc is used to list or edit and re-execute commands from the history "
-"list.\n"
+" fc is used to list or edit and re-execute commands from the history list.\n"
" FIRST and LAST can be numbers specifying the range, or FIRST can be a\n"
" string, which means the most recent command beginning with that\n"
" string.\n"
" \n"
" Options:\n"
-" -e ENAME\tselect which editor to use. Default is FCEDIT, then "
-"EDITOR,\n"
+" -e ENAME\tselect which editor to use. Default is FCEDIT, then EDITOR,\n"
" \t\tthen vi\n"
" -l \tlist lines instead of editing\n"
" -n\tomit line numbers when listing\n"
" the last command.\n"
" \n"
" Exit Status:\n"
-" Returns success or status of executed command; non-zero if an error "
-"occurs."
+" Returns success or status of executed command; non-zero if an error occurs."
msgstr ""
+"Отображение или выполнение команд из журнала.\n"
+" \n"
+" fc используется для вывода списка или изменения и повторного выполнения команд из журнала.\n"
+" Аргументы ПЕРВАЯ и ПОСЛЕДНЯЯ могут быть числами, определяющими диапазон.\n"
+" Аргумент ПЕРВАЯ также может быть строкой, которая означает\n"
+" последнюю команду, начинающуюся с этой строки.\n"
+" \n"
+" Параметры:\n"
+" -e РЕДАКТОР\tвыбрать используемый редактор По умолчанию используется FCEDIT, \n"
+" \t\tзатем следует EDITOR, а затем — vi\n"
+" -l \tвывести список строк вместо редактирования\n"
+" -n\tопустить номера строк при выводе списка\n"
+" -r\tинвертировать порядок строк (новые в начале)\n"
+" \n"
+" В синтаксисе «fc -s [шаблон=замена ...] [команда]» КОМАНДА\n"
+" выполняется повторно после замены СТАРЫЙ=НОВЫЙ.\n"
+" \n"
+" Полезный псевдоним для команды — r='fc -s'. Так если ввести «r cc»,\n"
+" будет выполнена последняя команда, начинающаяся с «cc», а если ввести «r»,\n"
+" будет выполнена последняя команда.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех или состояние выполненной команды. В случае ошибки возвращает ненулевое состояние."
#: builtins.c:755
msgid ""
" Exit Status:\n"
" Status of command placed in foreground, or failure if an error occurs."
msgstr ""
+"Перевод задания в интерактивный режим.\n"
+" \n"
+" Переводит задание с указанным номером в интерактивный режим, делая\n"
+" его текущим заданием. Если номер задания не указан, используются данные\n"
+" текущего задания.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние команды, переведённой в интерактивный режим, или ошибку, если возникла ошибка."
#: builtins.c:770
msgid ""
"Move jobs to the background.\n"
" \n"
-" Place the jobs identified by each JOB_SPEC in the background, as if "
-"they\n"
-" had been started with `&'. If JOB_SPEC is not present, the shell's "
-"notion\n"
+" Place the jobs identified by each JOB_SPEC in the background, as if they\n"
+" had been started with `&'. If JOB_SPEC is not present, the shell's notion\n"
" of the current job is used.\n"
" \n"
" Exit Status:\n"
" Returns success unless job control is not enabled or an error occurs."
msgstr ""
+"Перевод заданий в фоновый режим.\n"
+" \n"
+" Переводит указанные задания в фоновый режим, как если бы\n"
+" они были запущены с «&». Если задание не указано, используются данные\n"
+" текущего задания.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если не включено управление заданиями или не произошла ошибка."
#: builtins.c:784
msgid ""
"Remember or display program locations.\n"
" \n"
" Determine and remember the full pathname of each command NAME. If\n"
-" no arguments are given, information about remembered commands is "
-"displayed.\n"
+" no arguments are given, information about remembered commands is displayed.\n"
" \n"
" Options:\n"
" -d\t\tforget the remembered location of each NAME\n"
" Exit Status:\n"
" Returns success unless NAME is not found or an invalid option is given."
msgstr ""
+"Запоминание или отображение местоположений программ.\n"
+" \n"
+" Определяет и запоминает полный путь каждой указанной команды. Если\n"
+" аргументы не указаны, выводит информацию о запомненных командах.\n"
+" \n"
+" Параметры:\n"
+" -d\t\tзабыть запомненные местоположения всех НАЗВАНИЙ\n"
+" -l\t\tотобразить данные в виде входных данных\n"
+" -p путь\t\tиспользовать ПУТЬ в качестве полного пути к НАЗВАНИЮ\n"
+" -r\t\tзабыть все запомненные местоположения\n"
+" -t\t\tвывести запомненные местоположение всех НАЗВАНИЙ,\n"
+" \t\tуказав перед каждым местоположением соответствующее НАЗВАНИЕ,\n"
+" \t\tесли указано несколько НАЗВАНИЙ.\n"
+" Аргументы:\n"
+" НАЗВАНИЕ\t\tвсе НАЗВАНИЯ ищутся в $PATH и добавляются в список\n"
+" \t\tзапомненных команд.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех при условии, что КОМАНДА была найдена или был указан допустимый параметр."
#: builtins.c:809
msgid ""
" PATTERN\tPattern specifiying a help topic\n"
" \n"
" Exit Status:\n"
-" Returns success unless PATTERN is not found or an invalid option is "
-"given."
+" Returns success unless PATTERN is not found or an invalid option is given."
msgstr ""
+"Вывод информации о встроенных командах.\n"
+" \n"
+" Показывает краткую справку о встроенных командах. Если указан\n"
+" ШАБЛОН, выводит подробную справку по всем командам, удовлетворяющим ШАБЛОНУ.\n"
+" В противном случае выводится список разделов справки.\n"
+" \n"
+" Параметры:\n"
+" -d\tвывести краткое описание каждого раздела\n"
+" -m\tпоказать справку по использованию в псевдоформате man\n"
+" -s\tпоказать только краткую справку по использованию для каждого\n"
+" \tраздела, соответствующего ШАБЛОНУ\n"
+" \n"
+" Аргументы:\n"
+" ШАБЛОН\tшаблон, определяющий раздел справки\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех при условии, что ШАБЛОН был найдена или был указан допустимый параметр."
#: builtins.c:833
msgid ""
" \n"
" If the $HISTTIMEFORMAT variable is set and not null, its value is used\n"
" as a format string for strftime(3) to print the time stamp associated\n"
-" with each displayed history entry. No time stamps are printed "
-"otherwise.\n"
+" with each displayed history entry. No time stamps are printed otherwise.\n"
" \n"
" Exit Status:\n"
" Returns success unless an invalid option is given or an error occurs."
msgstr ""
+"Отображение или изменение журнала команд.\n"
+" \n"
+" Выводит список команд с номерами строк, добавив «*» перед каждой\n"
+" изменённой записью. С аргументом N выводится список только последних N записей.\n"
+" \n"
+" Параметры:\n"
+" -c\tочистить журнал, удалив из него все записи\n"
+" -d смещение\tудалить запись журнала с указанным СМЕЩЕНИЕМ\n"
+" \n"
+" -a\tдобавить строки из журнала текущего сеанса в файл журнала\n"
+" -n\tпрочитать все строки журнала, которые ещё не были прочитаны из файла журнала\n"
+" -r\tпрочитать файл журнала и добавить его содержимое\n"
+" \tв журнал\n"
+" -w\tзаписать текущий журнал в файл журнала\n"
+" \tи добавить записи в журнал\n"
+" \n"
+" -p\tдобавить в журнал указанные АРГУМЕНТЫ и показать результат,\n"
+" \tне сохраняя его в журнал\n"
+" -s\tдобавить АРГУМЕНТЫ в журнал как одну запись\n"
+" \n"
+" Если указан ФАЙЛ, он используется как файл журнала. В противном случае\n"
+" если $HISTFILE имеет значение, используется этот файл, иначе — ~/.bash_history.\n"
+" \n"
+" Если переменная $HISTTIMEFORMAT задана и не является пустой, её значение\n"
+" используется как строка формата для strftime(3) для вывода временной\n"
+" метки, связанной с каждой показанной записью журнала. В противном случае временные метки не будут показаны.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:869
msgid ""
" \n"
" Options:\n"
" -l\tlists process IDs in addition to the normal information\n"
-" -n\tlists only processes that have changed status since the last\n"
+" -n\tlist only processes that have changed status since the last\n"
" \tnotification\n"
" -p\tlists process IDs only\n"
" -r\trestrict output to running jobs\n"
" Returns success unless an invalid option is given or an error occurs.\n"
" If -x is used, returns the exit status of COMMAND."
msgstr ""
+"Отображение состояния заданий.\n"
+" \n"
+" Выводит список активных заданий. Если указан номер задания, выводится только это задание.\n"
+" Если не указать параметры, будет показано состояние всех активных заданий.\n"
+" \n"
+" Параметры:\n"
+" -l\tпоказать идентификаторы процессов в дополнение к обычной информации\n"
+" -n\tпоказать только те процессы, у которых изменилось состояние\n"
+" \tс момента после последнего уведомления\n"
+" -p\tпоказать только идентификаторы процессов\n"
+" -r\tпоказать только запущенные задания\n"
+" -s\tпоказать только остановленные задания\n"
+" \n"
+" Если указан параметр -x, команда выполняется после замены всех номеров\n"
+" заданий, указанных в аргументах, на идентификатор процесса\n"
+" лидера группы процессов задания.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка.\n"
+" Если указан параметр -x, возвращает состояние выхода команды."
#: builtins.c:896
msgid ""
" Exit Status:\n"
" Returns success unless an invalid option or JOBSPEC is given."
msgstr ""
+"Удаление заданий из текущего командного процессора.\n"
+" \n"
+" Удаляет все указанные номера заданий из таблицы активных заданий. Если\n"
+" номер задания не указан, командный процессор использует запись текущего задания.\n"
+" \n"
+" Параметры:\n"
+" -a\tудалить все задания, если номер задания не указан\n"
+" -h\tпометить все задания, чтобы им не отправлялся сигнал SIGHUP,\n"
+" \tесли командный процессор получает сигнал SIGHUP\n"
+" -r\tудалить только запущенные задания\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или номер задания."
#: builtins.c:915
msgid ""
" Exit Status:\n"
" Returns success unless an invalid option is given or an error occurs."
msgstr ""
+"Отправка сигнала заданию.\n"
+" \n"
+" Отправляет процессу с указанным идентификатором или номером задания\n"
+" сигнал согласно его названию или номеру. Если номер или название сигнала\n"
+" не указаны, отправляется сигнал SIGTERM.\n"
+" \n"
+" Параметры:\n"
+" -s сигнал\tназвание сигнала\n"
+" -n сигнал\tномер сигнала\n"
+" -l\t\tвыводит названия сигналов; если после аргументов указан «-l»,\n"
+" \tони считаются номерами сигналов, для которых необходимо вывести названия\n"
+" \n"
+" kill — это встроенная команда, предназначенная для двух задач: использовать\n"
+" номера заданий вместо идентификаторов процессов и убивать процессы\n"
+" при достижении предельного числа процессов.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:938
msgid ""
" Evaluate each ARG as an arithmetic expression. Evaluation is done in\n"
" fixed-width integers with no check for overflow, though division by 0\n"
" is trapped and flagged as an error. The following list of operators is\n"
-" grouped into levels of equal-precedence operators. The levels are "
-"listed\n"
+" grouped into levels of equal-precedence operators. The levels are listed\n"
" in order of decreasing precedence.\n"
" \n"
" \tid++, id--\tvariable post-increment, post-decrement\n"
" Exit Status:\n"
" If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise."
msgstr ""
+"Расчёт математических выражений.\n"
+" \n"
+" Рассчитывает все АРГУМЕНТЫ в математическом выражении. Расчёт выполняется\n"
+" для целых чисел фиксированной ширины с без проверки на переполнение.\n"
+" Однако деление на 0 перехватывается и выдаётся ошибка. Указанные ниже операторы объединены\n"
+" в группы с одинаковым приоритетом. Группы перечислены\n"
+" в порядке уменьшения приоритета.\n"
+" \n"
+" \tid++, id--\tпоследующее увеличение и уменьшение переменной\n"
+" \t++id, --id\tпредварительное увеличение и уменьшение переменной\n"
+" \t-, +\t\tунарный минус и плюс\n"
+" \t!, ~\t\tлогическое и побитовое отрицание\n"
+" \t**\t\tвозведение в степень\n"
+" \t*, /, %\t\tумножение, деление, остаток\n"
+" \t+, -\t\tсложение, вычитание\n"
+" \t<<, >>\t\tбитовые сдвиги влево или вправо\n"
+" \t<=, >=, <, >\tсравнение\n"
+" \t==, !=\t\tравенство, неравенство\n"
+" \t&\t\tпобитовое И\n"
+" \t^\t\tпобитовое исключающее ИЛИ\n"
+" \t|\t\tпобитовое ИЛИ\n"
+" \t&&\t\tлогическое И\n"
+" \t||\t\tлогические ИЛИ\n"
+" \tвыражение ? выражение : выражение\n"
+" \t\t\tусловный оператор\n"
+" \t=, *=, /=, %=,\n"
+" \t+=, -=, <<=, >>=,\n"
+" \t&=, ^=, |=\tприсвоение\n"
+" \n"
+" в качестве операндов можно использовать переменные командного процессора. Название переменной\n"
+" заменяется её значением (приводится к целому числу фиксированной ширины)\n"
+" в выражении. У переменной не должен быть включён атрибут integer,\n"
+" чтобы её можно было использовать в выражении.\n"
+" \n"
+" Операторы вычисляются в порядке старшинства. Вложенные выражения в\n"
+" скобках вычисляются первыми и могут переопределить правила\n"
+" старшинства выше.\n"
+" \n"
+" Состояние выхода:\n"
+" Если последний АРГУМЕНТ имеет значение 0, let возвращает 1. В противном случае let возвращает 0."
#: builtins.c:983
msgid ""
"Read a line from the standard input and split it into fields.\n"
" \n"
" Reads a single line from the standard input, or from file descriptor FD\n"
-" if the -u option is supplied. The line is split into fields as with "
-"word\n"
+" if the -u option is supplied. The line is split into fields as with word\n"
" splitting, and the first word is assigned to the first NAME, the second\n"
" word to the second NAME, and so on, with any leftover words assigned to\n"
-" the last NAME. Only the characters found in $IFS are recognized as "
-"word\n"
+" the last NAME. Only the characters found in $IFS are recognized as word\n"
" delimiters.\n"
" \n"
-" If no NAMEs are supplied, the line read is stored in the REPLY "
-"variable.\n"
+" If no NAMEs are supplied, the line read is stored in the REPLY variable.\n"
" \n"
" Options:\n"
" -a array\tassign the words read to sequential indices of the array\n"
" -n nchars\treturn after reading NCHARS characters rather than waiting\n"
" \t\tfor a newline, but honor a delimiter if fewer than NCHARS\n"
" \t\tcharacters are read before the delimiter\n"
-" -N nchars\treturn only after reading exactly NCHARS characters, "
-"unless\n"
+" -N nchars\treturn only after reading exactly NCHARS characters, unless\n"
" \t\tEOF is encountered or read times out, ignoring any delimiter\n"
" -p prompt\toutput the string PROMPT without a trailing newline before\n"
" \t\tattempting to read\n"
" -r\t\tdo not allow backslashes to escape any characters\n"
" -s\t\tdo not echo input coming from a terminal\n"
-" -t timeout\ttime out and return failure if a complete line of input "
-"is\n"
+" -t timeout\ttime out and return failure if a complete line of input is\n"
" \t\tnot read within TIMEOUT seconds. The value of the TMOUT\n"
" \t\tvariable is the default timeout. TIMEOUT may be a\n"
" \t\tfractional number. If TIMEOUT is 0, read returns immediately,\n"
" -u fd\t\tread from file descriptor FD instead of the standard input\n"
" \n"
" Exit Status:\n"
-" The return code is zero, unless end-of-file is encountered, read times "
-"out\n"
-" (in which case it's greater than 128), a variable assignment error "
-"occurs,\n"
+" The return code is zero, unless end-of-file is encountered, read times out\n"
+" (in which case it's greater than 128), a variable assignment error occurs,\n"
" or an invalid file descriptor is supplied as the argument to -u."
msgstr ""
+"Чтение строки со стандартного ввода и разделение её на поля.\n"
+" \n"
+" Читает одну строку со стандартного ввода или из файлового дескриптора,\n"
+" если указан параметр -u. Строка разделяется на поля по словам.\n"
+" Первое слово присваивается первому НАЗВАНИЮ, второе слово — второму\n"
+" НАЗВАНИЮ и так далее.\n"
+" Оставшиеся слова присваиваются последнему НАЗВАНИЮ. В качестве разделителей слов признаются только символы\n"
+" из переменной $IFS.\n"
+" \n"
+" Если НАЗВАНИЯ не указаны, прочитанная строка сохраняется в переменной REPLY.\n"
+" \n"
+" Параметры:\n"
+" -a массив\tприсвоить прочитанные слова последовательным индексам\n"
+" \t\tпеременной массива, начиная с нуля\n"
+" -d разделитель\tпродолжить до первого разделителя,\n"
+" \t\tа не до новой строки\n"
+" -e\t\tс помощью Readline получить строку в интерактивном командном процессоре\n"
+" -i текст\tиспользовать текст в качестве исходного для Readline\n"
+" -n число_знаков\tвыполнить возврат после прочтения числа знаков, а не ждать\n"
+" \t\tновой строки; учитывать разделитель, если до него было прочитано\n"
+" \t\tменьше указанного числа знаков\n"
+" -N число_знаков\tвыполнить возврат только после прочтения указанного числа знаков,\n"
+" \t\tесли только не был получен конец строки или не истекло время ожидания, игнорируя все разделители\n"
+" -p приглашение\tвывести приглашение без символа новой строки в конце\n"
+" \t\tперед тем как читать\n"
+" -r\t\tне выполнять экранирование символами косой черты\n"
+" -s\t\tне показывать данные, полученные из терминала\n"
+" -t тайм-аут\tпрекратить ожидание и вывести ошибку, если полная входная\n"
+" \t\tстрока не была прочитана за указанное число секунд В переменной TMOUT хранится\n"
+" \t\tзначение тайм-аута по умолчанию. Время ожидания\n"
+" \t\tможет быть дробным числом. Если тайм-аут равен 0, read немедленно выполняет возврат,\n"
+" \t\tне пытаясь прочитать никакие данные. Успех возвращается,\n"
+" \t\tтолько если входные данные доступны по указанному файловому дескриптору. \n"
+" \t\tСостояние выхода больше 128, если время ожидания было превышено.\n"
+" -u файловый_дескриптор\tчитать из файлового дескриптора, а не со стандартного входа\n"
+" \n"
+" Состояние выхода:\n"
+" Состояние выхода будет нулевым, если не был встречен конец файла, не истекло время ожидания\n"
+" (в этом случае состояние выхода будет больше 128), не возникла ошибка присвоения переменной\n"
+" или не был указан недопустимый файловый дескриптор как аргумент для -u."
#: builtins.c:1028
msgid ""
" Exit Status:\n"
" Returns N, or failure if the shell is not executing a function or script."
msgstr ""
+"Возврат из функции командного процессора.\n"
+" \n"
+" Выполняет выход из функции или исходного скрипта со значением возврата,\n"
+" указанным как N. Если N не указан, используется состояние возврата\n"
+" последней команды, выполненной в функции или скрипте.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает N или ошибку, если командный процессор не выполняет функцию или скрипт."
#: builtins.c:1041
msgid ""
" physical same as -P\n"
" pipefail the return value of a pipeline is the status of\n"
" the last command to exit with a non-zero status,\n"
-" or zero if no command exited with a non-zero "
-"status\n"
+" or zero if no command exited with a non-zero status\n"
" posix change the behavior of bash where the default\n"
" operation differs from the Posix standard to\n"
" match the standard\n"
" Exit Status:\n"
" Returns success unless an invalid option is given."
msgstr ""
+"Присвоение или удаление значений параметров командного процессора и позиционных параметров.\n"
+" \n"
+" Изменяет значение атрибутов командного процессора и позиционных параметров или\n"
+" выводит названия и значения переменных командного процессора.\n"
+" \n"
+" Параметры:\n"
+" -a пометить переменные, которые были изменены или созданы для экспорта\n"
+" -b немедленно уведомить о завершении задания\n"
+" -e немедленно выйти, если команда выполняет выход с ненулевым состоянием\n"
+" -f отключить генерацию имён файлов (подстановка)\n"
+" -h запомнить расположение команд, как они выглядели ранее\n"
+" -k поместить в окружение для команды все аргументы присвоения,\n"
+" а не только те, что были указаны перед командой\n"
+" -m включено управление заданиями\n"
+" -n прочитать команды, но не выполнять их\n"
+" -o название-параметра\n"
+" Задаёт переменную, соответствующую названию параметра:\n"
+" allexport эквивалент -a\n"
+" braceexpand эквивалент -B\n"
+" emacs использовать стиль emacs для редактирования строк\n"
+" errexit эквивалент -e\n"
+" errtrace эквивалент -E\n"
+" functrace эквивалент -T\n"
+" hashall эквивалент -h\n"
+" histexpand эквивалент -H\n"
+" history включить журнал команд\n"
+" ignoreeof не закрывать командный процессор после получения конца файла\n"
+" interactive-comments\n"
+" разрешить показан комментариев в интерактивных командах\n"
+" keyword эквивалент -k\n"
+" monitor эквивалент -m\n"
+" noclobber эквивалент -C\n"
+" noexec эквивалент -n\n"
+" noglob эквивалент -f\n"
+" nolog допускается, но игнорируется\n"
+" notify эквивалент -b\n"
+" nounset эквивалент -u\n"
+" onecmd эквивалент -t\n"
+" physical эквивалент -P\n"
+" pipefail возвращаемое значение конвейера является состоянием\n"
+" последней команды, завершившейся с ненулевым состоянием,\n"
+" или нулём, если не было команды, завершившейся с ненулевым состоянием\n"
+" posix изменить поведение bash там, где операции\n"
+" по умолчанию отличаются от стандарта Posix, чтобы\n"
+" соответствовать этому стандарту\n"
+" privileged эквивалент -p\n"
+" verbose эквивалент -v\n"
+" vi использовать стиль vi для редактирования строк\n"
+" xtrace эквивалент -x\n"
+" -p Включён, когда реальный и эффективный идентификаторы пользователя не совпадают.\n"
+" Отключает обработку файла $ENV и импорт функций командного\n"
+" процессора. Если отключить этот параметр, эффективные UID и GID\n"
+" будут назначены реальным UID и GID.\n"
+" -t Выйти после прочтения и выполнения одной команды.\n"
+" -u Считать незаданные переменные ошибкой при замене.\n"
+" -v Выводить входные строки на экран по мере их чтения.\n"
+" -x Выводить команды и их аргументы во время их выполнения.\n"
+" -B Командный процессор расширит скобки.\n"
+" -C Если задано, запретить перезапись существующих обычных файлов\n"
+" вследствие перенаправления вывода.\n"
+" -E Если задано, ловушка ERR наследуется функциями командного процессора.\n"
+" -H Включить замену журнала с использованием !. По умолчанию этот флаг\n"
+" установлен, если командный процессор интерактивный.\n"
+" -P Если задано, не разрешать символьные ссылки при выполнении команд,\n"
+" таких как cd, которые изменяют текущий каталог.\n"
+" -T Если задано, ловушка DEBUG наследуется функциями командного процессора.\n"
+" -- Назначить все оставшиеся аргументы позиционным параметрам.\n"
+" Если аргументов не осталось, позиционные параметры\n"
+" удаляются.\n"
+" - Назначить все оставшиеся аргументы позиционным параметрам.\n"
+" Параметры -x и -v выключены.\n"
+" \n"
+" Если вместо - указать +, флаги будут выключены. \n"
+" Флаги также можно использовать до вызова командного процессора. Текущий\n"
+" набор флагов можно просмотреть в $-. Оставшиеся n аргументов являются позиционными\n"
+" параметрами и назначаются в порядке $1, $2, .. $n. Если\n"
+" аргументы не указаны, выводятся все переменные командного процессора.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр."
#: builtins.c:1126
msgid ""
" -n\ttreat each NAME as a name reference and unset the variable itself\n"
" \trather than the variable it references\n"
" \n"
-" Without options, unset first tries to unset a variable, and if that "
-"fails,\n"
+" Without options, unset first tries to unset a variable, and if that fails,\n"
" tries to unset a function.\n"
" \n"
" Some variables cannot be unset; also see `readonly'.\n"
" Exit Status:\n"
" Returns success unless an invalid option is given or a NAME is read-only."
msgstr ""
+"Удаление значений и атрибутов переменных и функций командного процессора.\n"
+" \n"
+" Для каждого названия удаляет соответствующую переменную или функцию.\n"
+" \n"
+" Параметры:\n"
+" -f\tсчитать каждое НАЗВАНИЕ функцией командного процессора\n"
+" -v\tсчитать каждое НАЗВАНИЕ переменной командного процессора\n"
+" -n\tсчитать каждое НАЗВАНИЕ ссылкой на название и удалить саму переменную,\n"
+" \tа не переменную, на которую указывает ссылка\n"
+" \n"
+" Без параметров unset сначала пытается удалить переменную. Если это не удаётся,\n"
+" пытается удалить функцию.\n"
+" \n"
+" Некоторые переменные нельзя удалить. См. также «readonly».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или НАЗВАНИЕ доступно для записи."
#: builtins.c:1148
msgid ""
"Set export attribute for shell variables.\n"
" \n"
" Marks each NAME for automatic export to the environment of subsequently\n"
-" executed commands. If VALUE is supplied, assign VALUE before "
-"exporting.\n"
+" executed commands. If VALUE is supplied, assign VALUE before exporting.\n"
" \n"
" Options:\n"
" -f\trefer to shell functions\n"
" Exit Status:\n"
" Returns success unless an invalid option is given or NAME is invalid."
msgstr ""
+"Установка атрибута экспорта для переменных командного процессора.\n"
+" \n"
+" Помечает все имена для автоматического экспорта в среду для\n"
+" последующих выполняемых команд. Если указано значение, перед экспортом присваивает это значение.\n"
+" \n"
+" Параметры:\n"
+" -f\tссылаться на функции командного процессора\n"
+" -n\tудалить свойство экспорта изо всех имён\n"
+" -p\tвывести список всех экспортированных переменных и функций\n"
+" \n"
+" Аргумент «--» отключает дальнейшую обработку параметров.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или имя."
#: builtins.c:1167
msgid ""
" -a\trefer to indexed array variables\n"
" -A\trefer to associative array variables\n"
" -f\trefer to shell functions\n"
-" -p\tdisplay a list of all readonly variables or functions, depending "
-"on\n"
+" -p\tdisplay a list of all readonly variables or functions, depending on\n"
" whether or not the -f option is given\n"
" \n"
" An argument of `--' disables further option processing.\n"
" Exit Status:\n"
" Returns success unless an invalid option is given or NAME is invalid."
msgstr ""
-
-#: builtins.c:1189
-msgid ""
+"Запрет изменения переменных командного процессора.\n"
+" \n"
+" Делает каждое имя доступным только чтения. Значения этих имён нельзя\n"
+" будет изменить в будущем. Если указано значение, присваивает это значение\n"
+" перед тем, как сделать его доступным только для чтения.\n"
+" \n"
+" Параметры:\n"
+" -a\tссылаться на переменные индексированного массива\n"
+" -A\tссылаться на переменные ассоциативного массива\n"
+" -f\tссылаться на функции командного процессора\n"
+" -p\tвывести список всех переменных или функций, доступных только для чтения,\n"
+" в зависимости от того, указан ли параметр -f\n"
+" \n"
+" Аргумент «--» отключает дальнейшую обработку параметров.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или имя."
+
+#: builtins.c:1189
+msgid ""
"Shift positional parameters.\n"
" \n"
" Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is\n"
" Exit Status:\n"
" Returns success unless N is negative or greater than $#."
msgstr ""
+"Сдвиг позиционных параметров.\n"
+" \n"
+" Переименовывает позиционные параметры $N+1,$N+2,.. в $1,$2,..\n"
+" Если N не указан, он считается равным 1.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если N положительный или меньше $#."
#: builtins.c:1201 builtins.c:1216
msgid ""
" Returns the status of the last command executed in FILENAME; fails if\n"
" FILENAME cannot be read."
msgstr ""
+"Выполнение команд из файла в текущем командном процессоре.\n"
+" \n"
+" Читает и выполняет команды из указанного файла в текущем командном процессоре. \n"
+" Файла ищется в каталогах, указанных в переменной $PATH.\n"
+" Если указаны аргументы, они становятся позиционными параметрами\n"
+" при выполнении файла.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды из файла. Возвращает ошибку,\n"
+" если файл не удаётся прочитать."
#: builtins.c:1232
msgid ""
" Exit Status:\n"
" Returns success unless job control is not enabled or an error occurs."
msgstr ""
+"Приостановка работы командного процессора.\n"
+" \n"
+" Приостанавливает работу текущего командного процессора до получения сигнала SIGCONT.\n"
+" Работу командных процессоров login можно приостановить только в принудительном режиме.\n"
+" \n"
+" Параметры:\n"
+" -f\tпринудительно приостановить работу, даже если командный процессор — login\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если не включено управление заданиями или не произошла ошибка."
#: builtins.c:1248
msgid ""
" -x FILE True if the file is executable by you.\n"
" -O FILE True if the file is effectively owned by you.\n"
" -G FILE True if the file is effectively owned by your group.\n"
-" -N FILE True if the file has been modified since it was last "
-"read.\n"
+" -N FILE True if the file has been modified since it was last read.\n"
" \n"
" FILE1 -nt FILE2 True if file1 is newer than file2 (according to\n"
" modification date).\n"
" STRING1 != STRING2\n"
" True if the strings are not equal.\n"
" STRING1 < STRING2\n"
-" True if STRING1 sorts before STRING2 "
-"lexicographically.\n"
+" True if STRING1 sorts before STRING2 lexicographically.\n"
" STRING1 > STRING2\n"
" True if STRING1 sorts after STRING2 lexicographically.\n"
" \n"
" \n"
" -o OPTION True if the shell option OPTION is enabled.\n"
" -v VAR\t True if the shell variable VAR is set\n"
-" -R VAR\t True if the shell variable VAR is set and is a name "
-"reference.\n"
+" -R VAR\t True if the shell variable VAR is set and is a name reference.\n"
" ! EXPR True if expr is false.\n"
" EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.\n"
" EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.\n"
" Returns success if EXPR evaluates to true; fails if EXPR evaluates to\n"
" false or an invalid argument is given."
msgstr ""
+"Расчёт условного выражения.\n"
+" \n"
+" Возвращает состояние 0 (истина) или 1 (ложь) после\n"
+" расчёта выражения. Выражения могут быть унарными или бинарными. Унарные\n"
+" выражения часто используются для определения состояния файла. Также\n"
+" доступны стоковые операторы и операторы сравнения чисел.\n"
+" \n"
+" Поведение команды test зависит от количества аргументов. Полное\n"
+" описание см. в странице руководства bash.\n"
+" \n"
+" Операторы работы с файлами:\n"
+" \n"
+" -a ФАЙЛ Истина, если файл существует.\n"
+" -b ФАЙЛ Истина, если файл представляет блочное устройство.\n"
+" -c ФАЙЛ Истина, если файл представляет символьное устройство.\n"
+" -d ФАЙЛ Истина, если файл является каталогом.\n"
+" -e ФАЙЛ Истина, если файл существует.\n"
+" -f ФАЙЛ Истина, если файл существует и является обычным файлом.\n"
+" -g ФАЙЛ Истина, если для файла установлен бит SGID.\n"
+" -h ФАЙЛ Истина, если файл является символьной ссылкой.\n"
+" -L ФАЙЛ Истина, если файл является символьной ссылкой.\n"
+" -k ФАЙЛ Истина, если для файла установлен sticky-бит.\n"
+" -p ФАЙЛ Истина, если файл является именованным конвейером.\n"
+" -r ФАЙЛ Истина, если вы можете прочитать файл.\n"
+" -s ФАЙЛ Истина, если файл существует и не является пустым.\n"
+" -S ФАЙЛ Истина, если файл является сокетом.\n"
+" -t ФД Истина, если файловый дескриптор ФД открыт в терминале.\n"
+" -u ФАЙЛ Истина, если для файла установлен бит SUID.\n"
+" -w ФАЙЛ Истина, если вы можете выполнить запись в файл.\n"
+" -x ФАЙЛ Истина, если вы можете выполнить файл.\n"
+" -O ФАЙЛ Истина, если вы являетесь эффективным владельцем файла.\n"
+" -G ФАЙЛ Истина, если ваша группа является эффективным владельцем файла.\n"
+" -N ФАЙЛ Истина, если файл был изменён после последнего чтения.\n"
+" \n"
+" ФАЙЛ1 -nt ФАЙЛ2 Истина, если файл1 новее файла2 (согласно\n"
+" дате изменения).\n"
+" \n"
+" ФАЙЛ1 -ot ФАЙЛ2 Истина, если файл1 старее файла2.\n"
+" \n"
+" ФАЙЛ1 -ef ФАЙЛ2 Истина, если файл1 является жёсткой ссылкой на файл2.\n"
+" \n"
+" Строковые операторы:\n"
+" \n"
+" -z СТРОКА Истина, если строка является пустой.\n"
+" \n"
+" -n СТРОКА\n"
+" СТРОКА Истина, если строка не является пустой.\n"
+" \n"
+" СТРОКА1 = СТРОКА2\n"
+" Истина, если строки совпадают.\n"
+" СТРОКА1 != СТРОКА2\n"
+" Истина, если строки не совпадают.\n"
+" СТРОКА1 < СТРОКА2\n"
+" Истина, если СТРОКА1 сортируется до СТРОКИ2 лексикографически.\n"
+" СТРОКА1 > СТРОКА2\n"
+" Истина, если СТРОКА1 сортируется после СТРОКИ2 лексикографически.\n"
+" \n"
+" Остальные операторы:\n"
+" \n"
+" -o ПАРАМЕТР Истина, если включён ПАРАМЕТР командного процессора.\n"
+" -v ПЕР\t Истина, если задана ПЕРЕМЕННАЯ командного процессора\n"
+" -R ПЕР\t Истина, если ПЕРЕМЕННАЯ командного процессора задана и является именованной ссылкой.\n"
+" ! ВЫРАЖ Истина, если ВЫРАЖЕНИЕ возвращает ложь.\n"
+" ВЫРАЖ1 -a ВЫРАЖ2 Истина, если оба выражения возвращают истину.\n"
+" ВЫРАЖ1 -o ВЫРАЖ2 Истина, если хотя бы одно из выражений возвращает истину.\n"
+" \n"
+" арг1 ОП арг2 Математические проверки. ОП может быть одним из следующих: -eq, -ne,\n"
+" -lt, -le, -gt или -ge.\n"
+" \n"
+" Математические бинарные операторы возвращают истину, если АРГУМЕНТ1 равен, не равен,\n"
+" меньше, меньше или равен либо больше или равен\n"
+" АРГУМЕНТУ2.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если ВЫРАЖЕНИЕ истинно, или ошибку, если ВЫРАЖЕНИЕ ложно\n"
+" или указан недопустимый аргумент."
#: builtins.c:1329
msgid ""
" This is a synonym for the \"test\" builtin, but the last argument must\n"
" be a literal `]', to match the opening `['."
msgstr ""
+"Расчёт условного выражения.\n"
+" \n"
+" Это синоним встроенной команды «test», но последним аргументом должна\n"
+" быть скобка «]», соответствующая открывающей «[»."
#: builtins.c:1338
msgid ""
"Display process times.\n"
" \n"
-" Prints the accumulated user and system times for the shell and all of "
-"its\n"
+" Prints the accumulated user and system times for the shell and all of its\n"
" child processes.\n"
" \n"
" Exit Status:\n"
" Always succeeds."
msgstr ""
+"Отображение времени процесса.\n"
+" \n"
+" Выводит объединённые значения времени пользователя и системы для командного\n"
+" процессора и всех его дочерних процессов.\n"
+" \n"
+" Состояние выхода:\n"
+" Всегда возвращает успех."
#: builtins.c:1350
msgid ""
"Trap signals and other events.\n"
" \n"
-" Defines and activates handlers to be run when the shell receives "
-"signals\n"
+" Defines and activates handlers to be run when the shell receives signals\n"
" or other conditions.\n"
" \n"
" ARG is a command to be read and executed when the shell receives the\n"
" value. If ARG is the null string each SIGNAL_SPEC is ignored by the\n"
" shell and by the commands it invokes.\n"
" \n"
-" If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell. "
-"If\n"
-" a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command. "
-"If\n"
-" a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or "
-"a\n"
-" script run by the . or source builtins finishes executing. A "
-"SIGNAL_SPEC\n"
-" of ERR means to execute ARG each time a command's failure would cause "
-"the\n"
+" If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell. If\n"
+" a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command. If\n"
+" a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or a\n"
+" script run by the . or source builtins finishes executing. A SIGNAL_SPEC\n"
+" of ERR means to execute ARG each time a command's failure would cause the\n"
" shell to exit when the -e option is enabled.\n"
" \n"
-" If no arguments are supplied, trap prints the list of commands "
-"associated\n"
+" If no arguments are supplied, trap prints the list of commands associated\n"
" with each signal.\n"
" \n"
" Options:\n"
" -l\tprint a list of signal names and their corresponding numbers\n"
" -p\tdisplay the trap commands associated with each SIGNAL_SPEC\n"
" \n"
-" Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal "
-"number.\n"
+" Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal number.\n"
" Signal names are case insensitive and the SIG prefix is optional. A\n"
" signal may be sent to the shell with \"kill -signal $$\".\n"
" \n"
" Exit Status:\n"
-" Returns success unless a SIGSPEC is invalid or an invalid option is "
-"given."
+" Returns success unless a SIGSPEC is invalid or an invalid option is given."
msgstr ""
+"Захват сигналов и других событий.\n"
+" \n"
+" Определяет и активирует обработчики, которые будут выполняться, когда\n"
+" командный процессор получает сигналы или при других условиях.\n"
+" \n"
+" Аргумент — это команда, которая считывается и выполняется, когда\n"
+" командный процессор получает сигнал(ы) SIGNAL_SPEC. Если аргумент отсутствует (и указан один SIGNAL_SPEC)\n"
+" или указано «-», для всех указанных сигналов восстанавливаются\n"
+" исходные значения. Если аргумент — пустая строка, все SIGNAL_SPEC игнорируются\n"
+" командным процессором и вызываемыми им командами.\n"
+" \n"
+" Если SIGNAL_SPEC = EXIT (0), аргумент выполняется при выходе из командного процессора. Если\n"
+" SIGNAL_SPEC = DEBUG, аргумент выполняется перед каждой простой командой. Если\n"
+" SIGNAL_SPEC = RETURN, аргумент выполняется каждый раз, когда функция\n"
+" или скрипт выполняется в . или исходные встроенные команды завершают свою работу. Сигнал SIGNAL_SPEC =\n"
+" ERR означает выполнение аргумента каждый раз, когда ошибка команды приведёт\n"
+" к выходу из командного процессора, когда включён параметр -e.\n"
+" \n"
+" Если аргументы не указаны, trap выводит список команд, связанных\n"
+" с каждом сигналом.\n"
+" \n"
+" Параметры:\n"
+" -l\tвывести список названий сигналов и их номера\n"
+" -p\tпоказать команды trap, связанные с каждым SIGNAL_SPEC\n"
+" \n"
+" SIGNAL_SPEC — это название сигнала в <signal.h> или номер сигнала.\n"
+" Названия сигналов не зависят от регистра, а префикс SIG не является обязательным. \n"
+" Сигнал можно отправить в командный процессор командой \"kill -signal $$\".\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех при условии, что было указан допустимый SIGSPEC или параметр."
#: builtins.c:1386
msgid ""
" NAME\tCommand name to be interpreted.\n"
" \n"
" Exit Status:\n"
-" Returns success if all of the NAMEs are found; fails if any are not "
-"found."
-msgstr ""
+" Returns success if all of the NAMEs are found; fails if any are not found."
+msgstr ""
+"Вывод информации о типе команды.\n"
+" \n"
+" Для каждого НАЗВАНИЯ показывает, как оно будет интерпретировано при\n"
+" использовании в качестве названия команды.\n"
+" \n"
+" Параметры:\n"
+" -a\tпоказать все местоположения, где есть исполняемый файл НАЗВАНИЕ,\n"
+" \tвключая псевдонимы, встроенные команды и функции, а также при условии\n"
+" \tчто не используется параметр «-p»\n"
+" -f\tне искать функции командного процессора\n"
+" -P\tпринудительно искать в PATH все НАЗВАНИЯ, даже если это псевдоним,\n"
+" \tвстроенная команда или функция, и возвращать название файла на диске,\n"
+" \tкоторый будет запущен\n"
+" -p\tвозвращает название файла на диске, который будет запущен,\n"
+" \tили ничего, если «type -t NAME» не возвращает «file».\n"
+" -t\tвывести одно из слов «alias», «keyword»,\n"
+" \t«function», «builtin», «file» или «», если НАЗВАНИЕ является, соответственно,\n"
+" \tпсевдонимом, зарезервированным словом, функцией, встроенной командой\n"
+" \tкомандного процессора, файлом на диске или НАЗВАНИЕ не найдено\n"
+" \n"
+" Аргументы:\n"
+" НАЗВАНИЕ\tназвание интерпретируемой команды\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если все НАЗВАНИЯ были найдены, или ошибку в противном случае."
#: builtins.c:1417
msgid ""
"Modify shell resource limits.\n"
" \n"
-" Provides control over the resources available to the shell and "
-"processes\n"
+" Provides control over the resources available to the shell and processes\n"
" it creates, on systems that allow such control.\n"
" \n"
" Options:\n"
" Exit Status:\n"
" Returns success unless an invalid option is supplied or an error occurs."
msgstr ""
+"Изменение ограничений ресурсов командного процессора.\n"
+" \n"
+" Позволяет контролировать ресурсы, доступные командному процессору и создаваемым\n"
+" им процессам, в системах, где возможен такой контроль.\n"
+" \n"
+" Параметры:\n"
+" -S\tиспользовать «мягкое» ограничение ресурсов\n"
+" -H\tиспользовать «жёсткое» ограничение ресурсов\n"
+" -a\tпоказать все текущие ограничения\n"
+" -b\tразмер буфера сокета\n"
+" -c\tмаксимальный размер создаваемых core-файлов\n"
+" -d\tмаксимальный размер сегмента данных процесса\n"
+" -e\tмаксимальный приоритет планирования («nice»)\n"
+" -f\tмаксимальный размер файлов, записываемых командным процессором и его дочерними процессами\n"
+" -i\tмаксимальное число ожидающих сигналов\n"
+" -l\tмаксимальный объём, который процесс может заблокировать в памяти\n"
+" -m\tмаксимальный объём резидентной памяти\n"
+" -n\tмаксимальное число открытых файловых дескрипторов\n"
+" -p\tразмер буфера конвейера\n"
+" -q\tмаксимальное число байт в очередях сообщений POSIX\n"
+" -r\tмаксимальный приоритет планирования в реальном времени\n"
+" -s\tмаксимальный размер стека\n"
+" -t\tмаксимальный объём процессорного времени в секундах\n"
+" -u\tмаксимальное количество пользовательских процессов\n"
+" -v\tобъём виртуальной памяти\n"
+" -x\tмаксимальное число блокировок файлов\n"
+" -T максимальное количество потоков\n"
+" \n"
+" Не все параметры доступны на всех платформах.\n"
+" \n"
+" Если указано ограничение, оно является новым значением для указанного ресурса.\n"
+" Специальные значения «soft», «hard» и «unlimited» означают,\n"
+" соответственно, текущее мягкое ограничение, текущее жёсткое ограничение и отсутствие ограничения.\n"
+" В противном случае выводится текущее значение указанного ресурса. Если\n"
+" параметр не указан, подразумевается использование параметра -f.\n"
+" \n"
+" Значения задаются с шагом 1024 байт, кроме параметра -t с шагом в секундах,\n"
+" параметра -p с шагом 512 байт и параметра -u, представляющего\n"
+" количество процессов.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:1465
msgid ""
" Exit Status:\n"
" Returns success unless MODE is invalid or an invalid option is given."
msgstr ""
+"Отображение или указание маски режима для файлов.\n"
+" \n"
+" Задаёт маску РЕЖИМ для файлов, создаваемых пользователем. Если РЕЖИМ не указан,\n"
+" выводит текущее значение маски.\n"
+" \n"
+" Если РЕЖИМ начинается с цифры, он интерпретируется как восьмеричное число.\n"
+" В противном случае он считается символьной строкой как для команды chmod(1).\n"
+" \n"
+" Параметры:\n"
+" -p\tесли РЕЖИМ не указан, вывести маску, пригодную для повторного использования\n"
+" -S\tвывести маску в символьном виде, в противном случае выводится восьмеричное число\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех при условии, что был указан допустимый РЕЖИМ или параметр."
#: builtins.c:1485
msgid ""
"Wait for job completion and return exit status.\n"
" \n"
-" Waits for each process identified by an ID, which may be a process ID or "
-"a\n"
+" Waits for each process identified by an ID, which may be a process ID or a\n"
" job specification, and reports its termination status. If ID is not\n"
" given, waits for all currently active child processes, and the return\n"
-" status is zero. If ID is a a job specification, waits for all "
-"processes\n"
+" status is zero. If ID is a a job specification, waits for all processes\n"
" in that job's pipeline.\n"
" \n"
" If the -n option is supplied, waits for the next job to terminate and\n"
" Returns the status of the last ID; fails if ID is invalid or an invalid\n"
" option is given."
msgstr ""
+"Ожидание завершения задания и возврат состояния выхода.\n"
+" \n"
+" Ожидает завершения всех процессов, заданных идентификаторами\n"
+" (идентификатор процесса или номер задания), и возвращает их состояние выхода. Если код идентификатор\n"
+" не указан, ожидает завершения всех активных дочерних процессов\n"
+" и возвращает нулевое состояние выхода. Если идентификатор не является номером задания, ожидает завершения\n"
+" всех процессов в конвейере данного задания.\n"
+" \n"
+" Если указан параметр -n, ожидает завершения следующего задания\n"
+" возвращает его состояние выхода.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последнего идентификатора. Возвращает ошибку, если\n"
+" указан недопустимый идентификатор или параметр."
#: builtins.c:1506
msgid ""
"Wait for process completion and return exit status.\n"
" \n"
-" Waits for each process specified by a PID and reports its termination "
-"status.\n"
+" Waits for each process specified by a PID and reports its termination status.\n"
" If PID is not given, waits for all currently active child processes,\n"
" and the return status is zero. PID must be a process ID.\n"
" \n"
" Exit Status:\n"
-" Returns the status of the last PID; fails if PID is invalid or an "
-"invalid\n"
+" Returns the status of the last PID; fails if PID is invalid or an invalid\n"
" option is given."
msgstr ""
+"Ожидание завершения процесса и возврат состояния выхода.\n"
+" \n"
+" Ожидает завершения всех процессов, заданных идентификаторами (PID), и возвращает их состояние выхода.\n"
+" Если идентификатор процесса не указан, ожидает завершения всех активных\n"
+" дочерних процессов и возвращает нулевое состояние выхода. PID должен быть идентификатором процесса.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последнего идентификатора. Возвращает ошибку, если\n"
+" указан недопустимый идентификатор или параметр."
#: builtins.c:1521
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выполнение команд для всех элементов списка.\n"
+" \n"
+" Цикл «for» выполняет последовательность команд для каждого элемента\n"
+" списка. Если операнд «in СЛОВА ...;» отсутствует, подразумевается\n"
+" операнд «in \"$@\"». Каждому элементу в списке СЛОВА присваивается ИМЯ и для него\n"
+" выполняются КОМАНДЫ.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1535
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Математические операции в циклах.\n"
+" \n"
+" Эквивалентно\n"
+" \t(( ВЫРАЖ1))\n"
+" \twhile (( ВЫРАЖ2 )); do\n"
+" \t\tКОМАНДЫ\n"
+" \t\t(( ВЫРАЖ3 ))\n"
+" \tdone\n"
+" ВЫРАЖ1, ВЫРАЖ2 и ВЫРАЖ3 — это математические выражения. Если любое из выражений\n"
+" опущено, считается, что оно возвращает 1.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1553
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выбор слов из списка и выполнение команд.\n"
+" \n"
+" СЛОВА разворачиваются, формируя список слов. \n"
+" Набор развёрнутых слов выводится в поток ошибок с номерами\n"
+" в начале строк. Если операнд «in СЛОВА ...;» отсутствует, подразумевается\n"
+" операнд «in \"$@\"». Затем выводится приглашение PS3 и со стандартного ввода\n"
+" считывается строка. Если строка состоит из номера,\n"
+" соответствующего одному из показанных слов, этому слову\n"
+" присваивается ИМЯ. Если строка пустая, будут повторно показаны СЛОВА\n"
+" и приглашение. Если прочитан символ конца файла, команда завершает свою работу. Если прочитаны\n"
+" любые другие значения, ИМЕНИ присваивается пустое значение. Прочитанная строка\n"
+" сохраняется в переменную REPLY. Команды выполняются после каждой выборки,\n"
+" пока не будет выполнена команда прерывания.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1574
msgid ""
" Exit Status:\n"
" The return status is the return status of PIPELINE."
msgstr ""
+"Вывод времени, потраченного на выполнение конвейера.\n"
+" \n"
+" Выполняет КОНВЕЙЕР и выводит значения реального времени, пользовательского времени\n"
+" и системного времени ЦП, потраченного на выполнения КОНВЕЙЕРА.\n"
+" \n"
+" Параметры:\n"
+" -p\tпоказать значения времени в формате Posix\n"
+" \n"
+" Для форматирования выходных данных используется значение переменной TIMEFORMAT.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращаемое состояние соответствует состоянию выхода КОНВЕЙЕРА."
#: builtins.c:1591
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выполнение команд согласно шаблону.\n"
+" \n"
+" Выполняет команды, когда слово соответствует шаблону. \n"
+" Для разделения шаблонов используется знак «|».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1603
msgid ""
"Execute commands based on conditional.\n"
" \n"
-" The `if COMMANDS' list is executed. If its exit status is zero, then "
-"the\n"
-" `then COMMANDS' list is executed. Otherwise, each `elif COMMANDS' list "
-"is\n"
+" The `if COMMANDS' list is executed. If its exit status is zero, then the\n"
+" `then COMMANDS' list is executed. Otherwise, each `elif COMMANDS' list is\n"
" executed in turn, and if its exit status is zero, the corresponding\n"
-" `then COMMANDS' list is executed and the if command completes. "
-"Otherwise,\n"
-" the `else COMMANDS' list is executed, if present. The exit status of "
-"the\n"
-" entire construct is the exit status of the last command executed, or "
-"zero\n"
+" `then COMMANDS' list is executed and the if command completes. Otherwise,\n"
+" the `else COMMANDS' list is executed, if present. The exit status of the\n"
+" entire construct is the exit status of the last command executed, or zero\n"
" if no condition tested true.\n"
" \n"
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выполнение команд в зависимости от условий.\n"
+" \n"
+" Выполняется список «if КОМАНДЫ». Если состояние выхода нулевое,\n"
+" выполняется список «then КОМАНДЫ». В противном случае выполняется по очереди\n"
+" все списки «elif КОМАНДЫ», и если их состояние выхода будет нулевым,\n"
+" выполнится список «then КОМАНДЫ», и команда if завершится. В противном случае\n"
+" выполнится список «else КОМАНДЫ», если он присутствует. Состояние выхода всей\n"
+" конструкции является состоянием выхода последней выполненной команды или нулём,\n"
+" если ни одна проверка условия не возвратила истину.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1620
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выполнение команд до тех пор, пока проверка условия возвращает истину.\n"
+" \n"
+" Разворачивает и выполняет команды до тех пор, пока последняя команда в\n"
+" командах «while» завершается с нулевым состоянием.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1632
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Выполнение команд до тех пор, пока проверка условия не возвращает истину.\n"
+" \n"
+" Разворачивает и выполняет команды до тех пор, пока последняя команда в\n"
+" командах «until» завершается с ненулевым состоянием.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1644
msgid ""
" Exit Status:\n"
" Returns the exit status of COMMAND."
msgstr ""
+"Создание дополнительного процесса с указанным именем.\n"
+" \n"
+" Выполняет команду асинхронно, когда стандартный вывод и стандартный\n"
+" вход команды подключены через конвейер к дескрипторам файлов, которые назначены\n"
+" указателям 0 и 1 массива переменных ИМЯ в активном командном процессоре.\n"
+" Имя по умолчанию — «COPROC».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние выхода команды."
#: builtins.c:1658
msgid ""
"Define shell function.\n"
" \n"
" Create a shell function named NAME. When invoked as a simple command,\n"
-" NAME runs COMMANDs in the calling shell's context. When NAME is "
-"invoked,\n"
+" NAME runs COMMANDs in the calling shell's context. When NAME is invoked,\n"
" the arguments are passed to the function as $1...$n, and the function's\n"
" name is in $FUNCNAME.\n"
" \n"
" Exit Status:\n"
" Returns success unless NAME is readonly."
msgstr ""
+"Определение функции командного процессора.\n"
+" \n"
+" Создаёт функцию командного процессора с названием ИМЯ. При запуске в качестве простой команды\n"
+" ИМЯ выполняет КОМАНДЫ в контексте вызывающего их командного процессора. При вызове ИМЕНИ\n"
+" аргументы передаются в функцию как $1...$n, а функция получает\n"
+" название $FUNCNAME.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если ИМЯ доступно для записи."
#: builtins.c:1672
msgid ""
" Exit Status:\n"
" Returns the status of the last command executed."
msgstr ""
+"Группировка команд.\n"
+" \n"
+" Выполняет набор команд, объединённых в группу. Это единственный способ перенаправления\n"
+" всего набора команд.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние последней выполненной команды."
#: builtins.c:1684
msgid ""
" Exit Status:\n"
" Returns the status of the resumed job."
msgstr ""
+"Возобновление работы задания в интерактивном режиме.\n"
+" \n"
+" Аналогично аргументу JOB_SPEC для команды «fg». Возобновляет\n"
+" работу остановленного или фонового задания. Через JOB_SPEC можно задать название\n"
+" или номер задания. Если после номера задания указать «&», задание будет переведено\n"
+" в фоновый режим, как если бы идентификатор задания был указан как\n"
+" аргумент для команды «bg».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает состояние возобновлённого задания."
#: builtins.c:1699
msgid ""
" Exit Status:\n"
" Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise."
msgstr ""
+"Расчёт арифметического выражения.\n"
+" \n"
+" Выражение рассчитывается по правилам для математических\n"
+" выражений. Аналогично «let выражение».\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает 1, если выражение равно 0, в противном случае возвращает 0."
#: builtins.c:1711
msgid ""
"Execute conditional command.\n"
" \n"
-" Returns a status of 0 or 1 depending on the evaluation of the "
-"conditional\n"
-" expression EXPRESSION. Expressions are composed of the same primaries "
-"used\n"
-" by the `test' builtin, and may be combined using the following "
-"operators:\n"
+" Returns a status of 0 or 1 depending on the evaluation of the conditional\n"
+" expression EXPRESSION. Expressions are composed of the same primaries used\n"
+" by the `test' builtin, and may be combined using the following operators:\n"
" \n"
" ( EXPRESSION )\tReturns the value of EXPRESSION\n"
" ! EXPRESSION\t\tTrue if EXPRESSION is false; else false\n"
" Exit Status:\n"
" 0 or 1 depending on value of EXPRESSION."
msgstr ""
+"Выполнение условной команды.\n"
+" \n"
+" Возвращает состояние 0 или 1 в зависимости от результата расчёта\n"
+" условного выражения. Выражения составляются из тех же примитивов, которые используются\n"
+" во встроенной команде «test». Их можно объединить с помощью следующих операторов:\n"
+" \n"
+" ( выражение )\tВозвращает значение выражения\n"
+" ! выражение\tВозвращает истину, если выражение ложно, в противном случае возвращает ложь\n"
+" ВЫРАЖ1 && ВЫРАЖ2\tВозвращает истину, если оба выражения истинны, в противном случае возвращает ложь\n"
+" ВЫРАЖ1 || ВЫРАЖ2\tВозвращает истину, если хотя бы одно из выражений истинно, в противном случае возвращает ложь\n"
+" \n"
+" Если используются операторы «==» и «!=», строка справа от\n"
+" оператора используется как шаблон, и выполняется сопоставление по шаблону.\n"
+" Если используется оператор «=~», строка справа от оператора\n"
+" оценивается как регулярное выражение.\n"
+" \n"
+" Операторы && и || не рассчитывают ВЫРАЖ2, если ВЫРАЖ1 достаточно для\n"
+" определения значения выражения.\n"
+" \n"
+" Состояние выхода:\n"
+" 0 или 1 в зависимости от значения выражения."
#: builtins.c:1737
msgid ""
" HISTIGNORE\tA colon-separated list of patterns used to decide which\n"
" \t\tcommands should be saved on the history list.\n"
msgstr ""
+"Стандартные имена переменных командного процессора и их использование.\n"
+" \n"
+" BASH_VERSION\tСведения о версии Bash.\n"
+" CDPATH\tСписок каталогов, разделённых двоеточиями, для поиска\n"
+" \t\tв ник каталогов, указанных как аргументы для «cd».\n"
+" GLOBIGNORE\tСписок шаблонов, разделённых двоеточиями и описывающих имена файлов,\n"
+" \t\tкоторые будут игнорироваться при раскрытии пути.\n"
+" HISTFILE\t\tИмя файла, в котором хранится журнал команд..\n"
+" HISTFILESIZE\tРазмер файл журнала в строках.\n"
+" HISTSIZE\t\tЧисло строк журнала, к которым может\n"
+" \t\tполучить доступ командный процессор.\n"
+" HOME\tПолный путь к вашему домашнему каталогу.\n"
+" HOSTNAME\t\tИмя данного узла.\n"
+" HOSTTYPE\t\tТип процессора, на котором работает данная версия Bash.\n"
+" IGNOREEOF\tУправляет действием командного процессора при получении символа\n"
+" \t\tсимвола конца файла в качестве единственных входных данных. Если задана, тогда значение\n"
+" \t\tявляется числом символов EOF, которые могут быть\n"
+" \t\tпрочитаны подряд в пустой строке, после чего командный процессор будет закрыт\n"
+" \t\t(по умолчанию — 10). Если не задана, EOF означает конец входных данных.\n"
+" MACHTYPE\t\tСтрока с описанием текущей системы, в которой запущен Bash.\n"
+" MAILCHECK\tКак часто (в секундах) Bash проверяет наличие новой почты.\n"
+" MAILPATH\t\tСписок имён файлов, разделённых двоеточиями, в которых Bash\n"
+" \t\tищет почту.\n"
+" OSTYPE\tВерсия Unix, в которой запущена данная версия Bash.\n"
+" PATH\tСписок каталогов, разделённых двоеточиями, для поиска\n"
+" \t\tвыполняемых команд.\n"
+" PROMPT_COMMAND\tКоманда, выполняемая перед выводом каждого\n"
+" \t\tосновного приглашения.\n"
+" PS1\t\tОсновная строка приглашения.\n"
+" PS2\t\tДополнительная строка приглашения.\n"
+" PWD\t\tПолный путь текущего каталога.\n"
+" SHELLOPTS\tСписок включённых параметров командного процессора, разделённых двоеточиями.\n"
+" TERM\tНазвание текущего типа терминала.\n"
+" TIMEFORMAT\tФормат вывода статистических данных о времени, отображаемых\n"
+" \t\tкомандой «time».\n"
+" auto_resume\tНепустое значение означает слово в строке запуска команды,\n"
+" \t\tкоторое сначала ищется в списке\n"
+" \t\tостановленных заданий. Если команда найдена, задание переводится в интерактивный режим.\n"
+" \t\tЗначение «exact» означает, что слово команды должно\n"
+" \t\tточно совпадать с командой в списке остановленных заданий. \n"
+" \t\tЗначение «substring» означает, что слово команды\n"
+" \t\tдолжно быть частью строки задания. Все другие значения означают,\n"
+" \t\tчто команда должна быть префиксом остановленного задания.\n"
+" histchars\tСимволы, управляющие расширением журнала\n"
+" \t\tи быстрой подстановкой. Первый символ означает\n"
+" \t\tподстановку журнала. Обычно это «!». Второй символ\n"
+" \t\tозначает «быструю подстановку». Обычно это «^». \n"
+" \t\tТретий символ означает примечание журнала. Обычно это «#».\n"
+" HISTIGNORE\tСписок шаблонов, разделённых двоеточиями и описывающих команды,\n"
+" \t\tкоторые должны быть сохранены в журнале.\n"
#: builtins.c:1794
msgid ""
" Returns success unless an invalid argument is supplied or the directory\n"
" change fails."
msgstr ""
+"Добавление каталогов в стек.\n"
+" \n"
+" Добавляет каталог в начало стека каталогов или выполняет\n"
+" ротацию стека, помещая в начало стека текущий рабочий\n"
+" каталог. Если аргументы не указаны, меняет местами два первых каталога.\n"
+" \n"
+" Параметры:\n"
+" -n\tпредотвращает обычное изменение каталога при добавлении\n"
+" \tкаталогов в стек, чтобы действия выполнялись только над стеком.\n"
+" \n"
+" Аргументы:\n"
+" +N\tвыполняет ротацию стека, чтобы N-й каталог (слева\n"
+" \tв списке, показанного командой «dirs», начиная с нуля)\n"
+" \tстал первым в стеке.\n"
+" \n"
+" -N\tвыполняет ротацию стека, чтобы N-й каталог (справа\n"
+" \tв списке, показанного командой «dirs», начиная с нуля)\n"
+" \tстал первым в стеке.\n"
+" \n"
+" dir\tдобавляет КАТАЛОГ в начало стека каталогов, делая его\n"
+" \tновым текущим каталогом.\n"
+" \n"
+" Встроенная команда «dirs» выводит стек каталогов.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или удалось\n"
+" перейти в каталог."
#: builtins.c:1828
msgid ""
" Returns success unless an invalid argument is supplied or the directory\n"
" change fails."
msgstr ""
+"Удаление каталогов из стека.\n"
+" \n"
+" Удаляет записи из стека каталогов. Если аргументы не указаны,\n"
+" первый каталог из стека и назначает новый новый первый каталог.\n"
+" \n"
+" Параметры:\n"
+" -n\tпредотвращает обычное изменение каталога при удалении\n"
+" \tкаталогов из стека, чтобы действия выполнялись только над стеком.\n"
+" \n"
+" Аргументы:\n"
+" +N\tудаляет N-ю слева в списке каталогов запись,\n"
+" \tпоказанного командой «dirs», начиная с нуля. Пример: «popd +0»\n"
+" \tудаляет первый каталог, «popd +1» — второй каталог.\n"
+" \n"
+" -N\tудаляет N-ю справа в списке каталогов запись,\n"
+" \tпоказанного командой «dirs», начиная с нуля. Пример: «popd -0»\n"
+" \tудаляет последний каталог, «popd -1» — предпоследний каталог.\n"
+" \n"
+" Встроенная команда «dirs» выводит стек каталогов.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или удалось\n"
+" перейти в каталог."
#: builtins.c:1858
msgid ""
" \twith its position in the stack\n"
" \n"
" Arguments:\n"
-" +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+" +N\tDisplays the Nth entry counting from the left of the list shown by\n"
" \tdirs when invoked without options, starting with zero.\n"
" \n"
-" -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+" -N\tDisplays the Nth entry counting from the right of the list shown by\n"
" \tdirs when invoked without options, starting with zero.\n"
" \n"
" Exit Status:\n"
" Returns success unless an invalid option is supplied or an error occurs."
msgstr ""
+"Отображение стека каталогов.\n"
+" \n"
+" Выводит список запомненных на данный момент каталогов. Каталоги\n"
+" помещаются в список командой «pushd». Чтобы очистить\n"
+" список, используйте команду «popd».\n"
+" \n"
+" Параметры:\n"
+" -c\tочистить стек каталогов, удалив из него все элементы\n"
+" -l\tне выводить каталоги, начинающиеся с тильды (~),\n"
+" \tкоторая означает домашний каталог\n"
+" -p\tвывести стек по одному каталогу в строке\n"
+" -v\tвывести стек по одному каталогу в строке\n"
+" \tи с позицией в стеке\n"
+" \n"
+" Аргументы:\n"
+" +N\tпоказать N-ю слева в списке каталогов запись,\n"
+" \tпоказанного при вызове без параметров, начиная с нуля.\n"
+" \n"
+" -N\tпоказать N-ю справа в списке каталогов запись,\n"
+" \tпоказанного при вызове без параметров, начиная с нуля.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:1887
msgid ""
"Set and unset shell options.\n"
" \n"
" Change the setting of each shell option OPTNAME. Without any option\n"
-" arguments, list all shell options with an indication of whether or not "
-"each\n"
+" arguments, list all shell options with an indication of whether or not each\n"
" is set.\n"
" \n"
" Options:\n"
" Returns success if OPTNAME is enabled; fails if an invalid option is\n"
" given or OPTNAME is disabled."
msgstr ""
+"Установка и удаление параметров командного процессора.\n"
+" \n"
+" Изменяет настройки каждого параметра OPTNAME командного процессора. Если не указать\n"
+" аргумент с параметром, выводит все параметры командного процессора, показывая\n"
+" какой из них установлен, а какой нет.\n"
+" \n"
+" Параметры:\n"
+" -o\tограничить OPTNAME до тех, что заданы с помощью «set -o»\n"
+" -p\tвывести все параметры командного процессора и их состояние\n"
+" -q\tничего не выводить\n"
+" -s\tвключить (set) все OPTNAME\n"
+" -u\tотключить (unset) все OPTNAME\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, OPTNAME включён. Возвращает ошибку, если был указан\n"
+" недопустимый параметр или OPTNAME отключён."
#: builtins.c:1908
msgid ""
" -v var\tassign the output to shell variable VAR rather than\n"
" \t\tdisplay it on the standard output\n"
" \n"
-" FORMAT is a character string which contains three types of objects: "
-"plain\n"
-" characters, which are simply copied to standard output; character "
-"escape\n"
+" FORMAT is a character string which contains three types of objects: plain\n"
+" characters, which are simply copied to standard output; character escape\n"
" sequences, which are converted and copied to the standard output; and\n"
-" format specifications, each of which causes printing of the next "
-"successive\n"
+" format specifications, each of which causes printing of the next successive\n"
" argument.\n"
" \n"
-" In addition to the standard format specifications described in "
-"printf(1),\n"
+" In addition to the standard format specifications described in printf(1),\n"
" printf interprets:\n"
" \n"
" %b\texpand backslash escape sequences in the corresponding argument\n"
" %q\tquote the argument in a way that can be reused as shell input\n"
-" %(fmt)T output the date-time string resulting from using FMT as a "
-"format\n"
+" %(fmt)T output the date-time string resulting from using FMT as a format\n"
" string for strftime(3)\n"
" \n"
" The format is re-used as necessary to consume all of the arguments. If\n"
" there are fewer arguments than the format requires, extra format\n"
-" specifications behave as if a zero value or null string, as "
-"appropriate,\n"
+" specifications behave as if a zero value or null string, as appropriate,\n"
" had been supplied.\n"
" \n"
" Exit Status:\n"
-" Returns success unless an invalid option is given or a write or "
-"assignment\n"
+" Returns success unless an invalid option is given or a write or assignment\n"
" error occurs."
msgstr ""
+"Форматирует и выводит АРГУМЕНТЫ согласно ФОРМАТУ.\n"
+" \n"
+" Параметры:\n"
+" -v VAR\tназначить вывод переменной VAR, а не\n"
+" \t\tвывести её на стандартный вывод\n"
+" \n"
+" ФОРМАТ — это символьная строка, содержащая три типа объектов: простые\n"
+" символы, которые копируются на стандартный вывод, экранирующие\n"
+" последовательности, которые преобразовываются и копируются на стандартный\n"
+" вывод, и спецификации, которые активируют вывод следующего успешного\n"
+" аргумента.\n"
+" \n"
+" В дополнение к стандартным спецификациям формата, описанным в printf(1),\n"
+" printf интерпретирует:\n"
+" \n"
+" %b\tразвёртывание экранирующих последовательностей с обратной косой чертой в соответствующий аргумент;\n"
+" %q\tзаключение аргумента в кавычки, чтобы его можно было повторно использовать в качестве входных данных для командного процессора;\n"
+" %(fmt)T вывод строки дата-время, полученной после использования FMT в качестве\n"
+" строки форматирования для strftime(3)\n"
+" \n"
+" Если необходимо задействовать все аргументы, формат используется повторно. Если\n"
+" аргументов меньше, чем требуется для форматирования, дополнительные\n"
+" спецификации форматирования интерпретируются как содержащие нулевое\n"
+" или пустое значение.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка\n"
+" записи или присвоения."
#: builtins.c:1942
msgid ""
"Specify how arguments are to be completed by Readline.\n"
" \n"
-" For each NAME, specify how arguments are to be completed. If no "
-"options\n"
-" are supplied, existing completion specifications are printed in a way "
-"that\n"
+" For each NAME, specify how arguments are to be completed. If no options\n"
+" are supplied, existing completion specifications are printed in a way that\n"
" allows them to be reused as input.\n"
" \n"
" Options:\n"
" Exit Status:\n"
" Returns success unless an invalid option is supplied or an error occurs."
msgstr ""
+"Определение количества аргументов, завершаемых функцией readline.\n"
+" \n"
+" Для каждого имени нужно указать количество завершаемых аргументов. Если параметры\n"
+" не указаны, выводятся существующие спецификации завершения формате\n"
+" для повторного использования.\n"
+" \n"
+" Параметры:\n"
+" -p\tвывести существующие спецификации завершения в формате для повторного использования\n"
+" -r\tудалить спецификации завершения для каждого имени или,\n"
+" \tесли имена не указаны, все спецификации\n"
+" -D\tприменить завершения и действия как стандартные для команд,\n"
+" \tдля которых не определены завершения\n"
+" -E\tприменить завершения и действия к «пустым» командам —\n"
+" \tзавершение применяется к пустой строке\n"
+" \n"
+" Когда применяется завершение, действия выполняются в алфавитном порядке\n"
+" перечисленных выше параметров. Параметр -D имеет более\n"
+" высокий приоритет, чем -E.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:1970
-#, fuzzy
msgid ""
"Display possible completions depending on the options.\n"
" \n"
" Intended to be used from within a shell function generating possible\n"
-" completions. If the optional WORD argument is supplied, matches "
-"against\n"
+" completions. If the optional WORD argument is supplied, matches against\n"
" WORD are generated.\n"
" \n"
" Exit Status:\n"
" Returns success unless an invalid option is supplied or an error occurs."
msgstr ""
-"ðÏËÁÚÙ×ÁÅÔ ×ÏÚÍÏÖÎÙÅ ÄÏÐÏÌÎÅÎÉÑ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÐÃÉÊ. ðÒÅÄÐÏÌÁÇÁÅÔÓÑ,\n"
-" ÞÔÏ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ×ÎÕÔÒÉ ÆÕÎËÃÉÊ ËÏÍÁÎÄÎÏÇÏ ÉÎÔÅÒÐÒÅÔÁÔÏÒÁ, "
-"ÇÅÎÅÒÉÒÕÀÝÅÊ ×ÏÚÍÏÖÎÙÅ ÄÏÐÏÌÎÅÎÉÑ.\n"
-" åÓÌÉ ÎÅÏÂÑÚÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ óìï÷ï ÂÙÌ ÉÓÐÏÌØÚÏ×ÁÎ, ÔÏ ÂÕÄÕÔ "
-"ÓÇÅÎÅÒÉÒÏ×ÁÎÙ ÔÏÌØËÏ ÓÏ×ÐÁÄÅÎÉÑ Ó óìï÷ï."
+"Вывод возможных завершений в зависимости от параметров.\n"
+" \n"
+" compgen предназначен для использования в функциях bash, генерирующих\n"
+" возможные завершения. Если указан необязательный аргумент слово, выполняет\n"
+" сопоставление со сгенерированным словом.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или не возникла ошибка."
#: builtins.c:1985
msgid ""
"Modify or display completion options.\n"
" \n"
-" Modify the completion options for each NAME, or, if no NAMEs are "
-"supplied,\n"
-" the completion currently being executed. If no OPTIONs are given, "
-"print\n"
-" the completion options for each NAME or the current completion "
-"specification.\n"
+" Modify the completion options for each NAME, or, if no NAMEs are supplied,\n"
+" the completion currently being executed. If no OPTIONs are given, print\n"
+" the completion options for each NAME or the current completion specification.\n"
" \n"
" Options:\n"
" \t-o option\tSet completion option OPTION for each NAME\n"
" Returns success unless an invalid option is supplied or NAME does not\n"
" have a completion specification defined."
msgstr ""
+"Изменение или вывод параметров завершения.\n"
+" \n"
+" Изменяет параметры завершения для каждого имени или, если имена\n"
+" не указаны, для текущего завершения. Если параметры не указаны, выводит\n"
+" параметры завершения для каждого имени или текущую спецификацию завершения.\n"
+" \n"
+" Параметры:\n"
+" \t-o параметр\tзадать параметр завершения для каждого имени\n"
+" \t-D\t\tизменить параметры для завершения команды «по умолчанию»\n"
+" \t-E\t\tизменить параметры для завершения «пустой» команды\n"
+" \n"
+" Использование «+o» вместо «-o» отключает указанный параметр.\n"
+" \n"
+" Аргументы:\n"
+" \n"
+" Каждое имя ссылается на команду, для которой уже должна быть определена\n"
+" спецификация завершения с помощью встроенной команды «complete». Если имена\n"
+" не указаны, функция, которая сейчас генерирует завершения, должна вызвать\n"
+" compopt, и должны измениться параметры для текущего\n"
+" генератора завершения.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или для имени\n"
+" определена спецификация завершения."
#: builtins.c:2015
msgid ""
"Read lines from the standard input into an indexed array variable.\n"
" \n"
-" Read lines from the standard input into the indexed array variable "
-"ARRAY, or\n"
-" from file descriptor FD if the -u option is supplied. The variable "
-"MAPFILE\n"
+" Read lines from the standard input into the indexed array variable ARRAY, or\n"
+" from file descriptor FD if the -u option is supplied. The variable MAPFILE\n"
" is the default ARRAY.\n"
" \n"
" Options:\n"
-" -n count\tCopy at most COUNT lines. If COUNT is 0, all lines are "
-"copied.\n"
-" -O origin\tBegin assigning to ARRAY at index ORIGIN. The default "
-"index is 0.\n"
+" -n count\tCopy at most COUNT lines. If COUNT is 0, all lines are copied.\n"
+" -O origin\tBegin assigning to ARRAY at index ORIGIN. The default index is 0.\n"
" -s count \tDiscard the first COUNT lines read.\n"
" -t\t\tRemove a trailing newline from each line read.\n"
-" -u fd\t\tRead lines from file descriptor FD instead of the standard "
-"input.\n"
+" -u fd\t\tRead lines from file descriptor FD instead of the standard input.\n"
" -C callback\tEvaluate CALLBACK each time QUANTUM lines are read.\n"
-" -c quantum\tSpecify the number of lines read between each call to "
-"CALLBACK.\n"
+" -c quantum\tSpecify the number of lines read between each call to CALLBACK.\n"
" \n"
" Arguments:\n"
" ARRAY\t\tArray variable name to use for file data.\n"
" element to be assigned and the line to be assigned to that element\n"
" as additional arguments.\n"
" \n"
-" If not supplied with an explicit origin, mapfile will clear ARRAY "
-"before\n"
+" If not supplied with an explicit origin, mapfile will clear ARRAY before\n"
" assigning to it.\n"
" \n"
" Exit Status:\n"
-" Returns success unless an invalid option is given or ARRAY is readonly "
-"or\n"
+" Returns success unless an invalid option is given or ARRAY is readonly or\n"
" not an indexed array."
msgstr ""
+"Чтение строк со стандартного ввода в переменную индексированного массива.\n"
+" \n"
+" Читает строки со стандартного ввода в переменную индексированного массива МАССИВ\n"
+" или из файлового дескриптора FD, если указан параметр -u. Переменная MAPFILE\n"
+" является по умолчанию массивом.\n"
+" \n"
+" Параметры:\n"
+" -n число\tкопировать указанное число строк Если ЧИСЛО равно 0, копируются все строки.\n"
+" -O начало\tначать присвоение массиву, начиная с заданного указателя По умолчанию указатель равен 0.\n"
+" -s число \tотбросить указанное число первых строк\n"
+" -t\t\tудалить завершающие переводы строки изо всех прочитанных строк\n"
+" -u fd\t\tчитать строки из файлового дескриптора, а не со стандартного входа\n"
+" -C callback\tоценивать CALLBACK при чтении каждой строки QUANTUM\n"
+" -c quantum\tчисло строк, читаемых от каждого вызова до CALLBACK\n"
+" \n"
+" Аргументы:\n"
+" ARRAY\t\tназвание переменной массива, используемой для данных файла\n"
+" \n"
+" Если параметр -C указан без -c, quantum по умолчанию равен 5000. Когда\n"
+" оценивается CALLBACK, он представляет указатель на следующий присваиваемый\n"
+" элемента массива и на строку, присваиваемую этому элементу,\n"
+" в качестве дополнительных аргументов.\n"
+" \n"
+" Если явно не указано начало, mapfile очистит массив до\n"
+" выполнения присвоения.\n"
+" \n"
+" Состояние выхода:\n"
+" Возвращает успех, если был указан допустимый параметр или массив доступен для записи\n"
+" и является индексированным."
#: builtins.c:2049
msgid ""
" \n"
" A synonym for `mapfile'."
msgstr ""
+"Чтение строк из файла в переменную массива.\n"
+" \n"
+" Синоним команды «mapfile»."
+
+#~ msgid "Missing `}'"
+#~ msgstr "Пропущен символ `}'"
+
+#~ msgid "brace_expand> "
+#~ msgstr "brace_expand> "
+
+#~ msgid "Attempt to free unknown command type `%d'.\n"
+#~ msgstr "Попытка освободить память структуры команды неизвестного типа `%d'.\n"
+
+#~ msgid "Report this to %s\n"
+#~ msgstr "Сообщите об этом по адресу %s\n"
+
+#~ msgid "Stopping myself..."
+#~ msgstr "Прекращение работы..."
+
+#~ msgid "Tell %s to fix this someday.\n"
+#~ msgstr "Скажите %s, чтобы он исправил это.\n"
-#~ msgid "Without EXPR, returns returns \"$line $filename\". With EXPR,"
-#~ msgstr "âÅÚ ÷ùòáö ×ÏÚ×ÒÁÝÁÅÔ \"$ÓÔÒÏËÁ $ÉÍÑÆÁÊÌÁ\". ó ÷ùòáö,"
+#~ msgid "execute_command: bad command type `%d'"
+#~ msgstr "execute_command: неверный тип команды '%d'"
-#~ msgid "returns \"$line $subroutine $filename\"; this extra information"
+#~ msgid "real\t"
+#~ msgstr "реальное\t"
+
+#~ msgid "user\t"
+#~ msgstr "пользователя\t"
+
+#~ msgid "sys\t"
+#~ msgstr "системное\t"
+
+#~ msgid ""
+#~ "real\t0m0.00s\n"
+#~ "user\t0m0.00s\n"
+#~ "sys\t0m0.00s\n"
#~ msgstr ""
-#~ "÷ÏÚ×ÒÁÝÁÅÔ \"$ÓÔÒÏËÁ $ÐÒÏÃÅÄÕÒÁ $ÉÍÑÆÁÊÌÁ\"; ÜÔÁ ÄÏÐÏÌÎÉÔÅÌØÎÁÑ "
-#~ "ÉÎÆÏÒÍÁÃÉÑ "
+#~ "реальное\t0m0.00s\n"
+#~ "пользователя\t0m0.00s\n"
+#~ "системное\t0m0.00s\n"
-#~ msgid "can be used used to provide a stack trace."
-#~ msgstr "ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÁ ÄÌÑ ÓÏÚÄÁÎÉÑ `stack trace'"
+#~ msgid "cannot duplicate fd %d to fd 1: %s"
+#~ msgstr "невозможно скопировать файловый дескриптор %d в 1: %s"
-#~ msgid "bug: unknown operation"
-#~ msgstr "ÏÛÉÂËÁ: ÎÅÉÚ×ÅÓÔÎÁÑ ÏÐÅÒÁÃÉÑ"
+#~ msgid "%s: output redirection restricted"
+#~ msgstr "%s: перенаправление вывода запрещено (ограниченный режим)"
-#, fuzzy
-#~ msgid "Return a successful result."
-#~ msgstr "÷ÏÚ×ÒÁÝÁÅÔ ÒÅÚÕÌØÔÁÔ: ×ÓÅ ÈÏÒÏÛÏ."
+#~ msgid "Out of memory!"
+#~ msgstr "Недостаточно памяти!"
-#, fuzzy
-#~ msgid "Obsolete. See `declare'."
-#~ msgstr " ÷ÙÛÅÌ ÉÚ ÕÐÏÔÒÅÂÌÅÎÉÑ. óÍ. `declare'."
+#~ msgid "You have already added item `%s'\n"
+#~ msgstr "Элемент `%s' уже добавлен\n"
+
+#~ msgid "You have entered %d (%d) items. The distribution is:\n"
+#~ msgstr "Создано %d (%d) элементов. Распределение:\n"
+
+#~ msgid "slot %3d: "
+#~ msgstr "слот %3d: "
+
+#~ msgid "<unknown>"
+#~ msgstr "<неизв>"
+
+#~ msgid "%s: bg background job?"
+#~ msgstr "%s: задача уже фоновая"
-#, fuzzy
-#~ msgid "Logout of a login shell."
+#~ msgid ""
+#~ "Redirection instruction from yyparse () '%d' is\n"
+#~ "out of range in make_redirection ()."
#~ msgstr ""
-#~ "úÁ×ÅÒÛÅÎÉÑ ÓÅÁÎÓÁ ËÏÍÁÎÄÎÏÇÏ ÉÎÔÅÒÐÒÅÔÁÔÏÒÁ ÚÁÐÕÝÅÎÎÏÇÏ ÐÏÓÌÅ ×ÈÏÄÁ × "
-#~ "ÓÉÓÔÅÍÕ."
+#~ "Инструкция перенаправления yyparse () `%d'\n"
+#~ "не может быть обработана make_redirection ()."
+
+#~ msgid "clean_simple_command () got a command with type %d."
+#~ msgstr "функции clean_simple_command () передана команда типа %d."
+
+#~ msgid "got errno %d while waiting for %d"
+#~ msgstr "ошибка %d при ожидании %d"
+
+#~ msgid "syntax error near unexpected token `%c'"
+#~ msgstr "синтаксическая ошибка около неожиданной лексемы `%c'"
+
+#~ msgid "print_command: bad command type `%d'"
+#~ msgstr "print_command: неверный тип команды `%d'"
+
+#~ msgid "cprintf: bad `%%' argument (%c)"
+#~ msgstr "cprintf: неверный спецификатор после `%%' (%c)"
+
+#~ msgid "option `%s' requires an argument"
+#~ msgstr "параметр `%s' должен использоваться с аргументом"
+
+#~ msgid "%s: unrecognized option"
+#~ msgstr "%s: неизвестный параметр"
+
+#~ msgid "`-c' requires an argument"
+#~ msgstr "`-c' должен использоваться с аргументом"
+
+#~ msgid "%s: cannot execute directories"
+#~ msgstr "%s: каталоги не могут запускаться как исполняемые файлы"
+
+#~ msgid "Bad code in sig.c: sigprocmask"
+#~ msgstr "Неверный код в sig.c: sigprocmask"
+
+#~ msgid "can't make pipes for process substitution: %s"
+#~ msgstr "невозможно создать каналы для подстановки: %s"
+
+#~ msgid "reading"
+#~ msgstr "чтения"
+
+#~ msgid "writing"
+#~ msgstr "записи"
+
+#~ msgid "process substitution"
+#~ msgstr "подстановка процессов"
+
+#~ msgid "command substitution"
+#~ msgstr "подстановка команд"
+
+#~ msgid "Can't reopen pipe to command substitution (fd %d): %s"
+#~ msgstr "Невозможно вновь открыть канал для подстановки команд (файловый дексриптор %d): %s"
+
+#~ msgid "$%c: unbound variable"
+#~ msgstr "$%c: не заданы границы"
+
+#~ msgid "%s: bad arithmetic substitution"
+#~ msgstr "%s: неверная арифметическая подстановка"
+
+#~ msgid "-%s: binary operator expected"
+#~ msgstr "-%s: ожидается бинарная операция"
+
+#~ msgid "%s[%s: bad subscript"
+#~ msgstr "%s[%s: неверный индекс"
+
+#~ msgid "[%s: bad subscript"
+#~ msgstr "[%s: неверный индекс"
+
+#~ msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+#~ msgstr "xmalloc: невозможно заново выделить %lu байтов (выделено %lu байтов)"
+
+#~ msgid "digits occur in two different argv-elements.\n"
+#~ msgstr "цифры встречаются в двух разных элементах argv.\n"
+
+#~ msgid "option %c\n"
+#~ msgstr "параметр %c\n"
+
+#~ msgid "option a\n"
+#~ msgstr "параметр a\n"
+
+#~ msgid "option b\n"
+#~ msgstr "параметр b\n"
+
+#~ msgid "option c with value `%s'\n"
+#~ msgstr "параметр c со значением `%s'\n"
+
+#~ msgid "?? sh_getopt returned character code 0%o ??\n"
+#~ msgstr "?? sh_getopt вернула код символа 0%o ??\n"
+
+#~ msgid "non-option ARGV-elements: "
+#~ msgstr "элементы ARGV, не являющиеся параметрами: "
+
+#~ msgid "%s: Unknown flag %s.\n"
+#~ msgstr "%s: Неизвестный флаг %s.\n"
+
+#~ msgid "Unknown directive `%s'"
+#~ msgstr "Неизвестная директива `%s'"
+
+#~ msgid "%s must be inside of a $BUILTIN block"
+#~ msgstr "%s должно быть внутри блока $BUILTIN"
+
+#~ msgid "%s found before $END"
+#~ msgstr "%s обнаружено раньше $END"
+
+#~ msgid "%s already has a function (%s)"
+#~ msgstr "В %s уже есть функция (%s)"
+
+#~ msgid "%s already had a docname (%s)"
+#~ msgstr "В %s уже есть название документации (%s)"
+
+#~ msgid "%s already has short documentation (%s)"
+#~ msgstr "В %s уже есть короткая документация (%s)"
+
+#~ msgid "%s already has a %s definition"
+#~ msgstr "В %s уже есть определение %s"
+
+#~ msgid "mkbuiltins: Out of virtual memory!\n"
+#~ msgstr "mkbuiltins: Не хватает виртуальной памяти!\n"
+
+#~ msgid "read [-r] [-p prompt] [-a array] [-e] [name ...]"
+#~ msgstr "read [-r] [-p приглашение] [-a массив] [-e] [имя ...]"
+
+#~ msgid "%[DIGITS | WORD] [&]"
+#~ msgstr "%[ЦИФРЫ | СЛОВО] [&]"
+
+#~ msgid "variables - Some variable names and meanings"
+#~ msgstr "variables -- Имена и смысл некоторых переменных"
+
+#~ msgid "`alias' with no arguments or with the -p option prints the list"
+#~ msgstr "`alias' без аргументов или с параметром -p выводит на стандартный"
+
+#~ msgid "of aliases in the form alias NAME=VALUE on standard output."
+#~ msgstr "вывод список псевдокоманд в виде ИМЯ=ЗНАЧЕНИЕ. В противном"
+
+#~ msgid "Otherwise, an alias is defined for each NAME whose VALUE is given."
+#~ msgstr "случае, для каждого ИМЕНИ определяется псевдокоманда со ЗНАЧЕНИЕМ."
+
+#~ msgid "A trailing space in VALUE causes the next word to be checked for"
+#~ msgstr "Если на конце ЗНАЧЕНИЯ есть пробелы, при разворачивании псевдокоманды"
+
+#~ msgid "alias substitution when the alias is expanded. Alias returns"
+#~ msgstr "следующее слово проверяется на подстановку псевдокоманд. Alias"
+
+#~ msgid "true unless a NAME is given for which no alias has been defined."
+#~ msgstr "возвращает true, если только не задано ИМЯ, для которого нет псевдокоманд."
+
+#~ msgid "Remove NAMEs from the list of defined aliases. If the -a option is given,"
+#~ msgstr "Удаляет ИМЕНА из списка определённых псевдокоманд. Если задан параметр -a,"
+
+#~ msgid "then remove all alias definitions."
+#~ msgstr "удаляет все определения псевдокоманд."
+
+#~ msgid "Bind a key sequence to a Readline function, or to a macro. The"
+#~ msgstr "Связывает последовательность клавиш с функцией Readline или с макросом."
+
+#~ msgid "syntax is equivalent to that found in ~/.inputrc, but must be"
+#~ msgstr "Синтаксис тот же, что и в ~/.inputrc, но должен передаваться"
+
+#~ msgid "passed as a single argument: bind '\"\\C-x\\C-r\": re-read-init-file'."
+#~ msgstr "одним аргументом: bind '\"\\C-x\\C-r\": re-read-init-file'."
+
+#~ msgid "Arguments we accept:"
+#~ msgstr "Принимаемые аргументы:"
+
+#~ msgid " -m keymap Use `keymap' as the keymap for the duration of this"
+#~ msgstr " -m раскладка Использовать во время работы программы указанную"
+
+#~ msgid " command. Acceptable keymap names are emacs,"
+#~ msgstr " раскладку. Допустимые имена раскладок: emacs,"
+
+#~ msgid " emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+#~ msgstr " emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+
+#~ msgid " vi-command, and vi-insert."
+#~ msgstr " vi-command и vi-insert."
+
+#~ msgid " -l List names of functions."
+#~ msgstr " -l Вывести список имён функций."
+
+#~ msgid " -P List function names and bindings."
+#~ msgstr " -P Вывести список имён функций и связей."
+
+#~ msgid " -p List functions and bindings in a form that can be"
+#~ msgstr " -p Вывести список имён функций и связей в виде,"
+
+#~ msgid " reused as input."
+#~ msgstr " который можно использовать на входе."
+
+#~ msgid " -r keyseq Remove the binding for KEYSEQ."
+#~ msgstr " -r послед_клавиш Удалить связь для `послед_клавиш'."
+
+#~ msgid " -f filename Read key bindings from FILENAME."
+#~ msgstr " -f имя_файла Прочесть связи из файла."
+
+#~ msgid " -q function-name Query about which keys invoke the named function."
+#~ msgstr " -q имя_функции Запрос, какие клавиши вызовут указанную функцию."
+
+#~ msgid " -V List variable names and values"
+#~ msgstr " -V Вывести список имён и значений переменных."
+
+#~ msgid " -v List variable names and values in a form that can"
+#~ msgstr " -v Вывести список имён и значений переменных в виде,"
+
+#~ msgid " be reused as input."
+#~ msgstr " который можно использовать на входе"
+
+#~ msgid " -S List key sequences that invoke macros and their values"
+#~ msgstr " -S Вывести список последовательностей клавиш, вызывающих макросы и их значений."
+
+#~ msgid " -s List key sequences that invoke macros and their values in"
+#~ msgstr " -s Вывести список последовательностей клавиш, вызывающих макросы"
+
+#~ msgid " a form that can be reused as input."
+#~ msgstr " и их значений в виде, который можно использовать на входе"
+
+#~ msgid "Exit from within a FOR, WHILE or UNTIL loop. If N is specified,"
+#~ msgstr "Выйти из цикла FOR, WHILE или UNTIL. Если указано N,"
+
+#~ msgid "break N levels."
+#~ msgstr "выйти из N вложенных уровней."
+
+#~ msgid "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+#~ msgstr "Перейти к следующей итерации цикла FOR, WHILE или UNTIL."
+
+#~ msgid "If N is specified, resume at the N-th enclosing loop."
+#~ msgstr "Если задано N, перейти к N-му обрамляющему циклу."
+
+#~ msgid "Run a shell builtin. This is useful when you wish to rename a"
+#~ msgstr "Выполнить встроенную команду оболочки. Это полезно, если вы хотите"
+
+#~ msgid "shell builtin to be a function, but need the functionality of the"
+#~ msgstr "создать функцию с именем встроенной команды, но хотите сохранить"
+
+#~ msgid "builtin within the function itself."
+#~ msgstr "возможность использования команды из самой функции"
+
+#~ msgid "Change the current directory to DIR. The variable $HOME is the"
+#~ msgstr "Изменить текущий каталог на заданный. Переменная $HOME содержит"
+
+#~ msgid "default DIR. The variable $CDPATH defines the search path for"
+#~ msgstr "каталог по умолчанию. Переменная $CDPATH определяет путь, в котором"
+
+#~ msgid "the directory containing DIR. Alternative directory names in CDPATH"
+#~ msgstr "ищется каталог, содержащий КАТАЛОГ. Альтернативные каталоги в CDPATH"
+
+#~ msgid "are separated by a colon (:). A null directory name is the same as"
+#~ msgstr "разделяются точкой с запятой (:). Пустое имя каталога -- то же самое,"
+
+#~ msgid "the current directory, i.e. `.'. If DIR begins with a slash (/),"
+#~ msgstr "что текущий каталог, т.е. `.'. Если КАТАЛОГ начинается с дроби (/),"
+
+#~ msgid "then $CDPATH is not used. If the directory is not found, and the"
+#~ msgstr "$CDPATh не используется. Если каталог не найден, и установлен параметр"
+
+#~ msgid "shell option `cdable_vars' is set, then try the word as a variable"
+#~ msgstr "оболочки `cdable_vars', делается попытка интерпретировать это слово как имя"
+
+#~ msgid "name. If that variable has a value, then cd to the value of that"
+#~ msgstr "переменной. Если эта переменная имеет значение, каталог меняется на это"
+
+#~ msgid "variable. The -P option says to use the physical directory structure"
+#~ msgstr "значение. Параметр -P указывает использовать физическую структуру каталогов,"
+
+#~ msgid "instead of following symbolic links; the -L option forces symbolic links"
+#~ msgstr "а не следовать символчиеским ссылкам, параметр -L заставляет следовать"
+
+#~ msgid "to be followed."
+#~ msgstr "символическим ссылкам."
+
+#~ msgid "Print the current working directory. With the -P option, pwd prints"
+#~ msgstr "Вывести имя текущего рабочего каталога. С параметром -P pwd выводит"
+
+#~ msgid "the physical directory, without any symbolic links; the -L option"
+#~ msgstr "физический каталог, без символических ссылок, параметр -L заставляет"
+
+#~ msgid "makes pwd follow symbolic links."
+#~ msgstr "pwd следовать символическим ссылкам."
+
+#~ msgid "Runs COMMAND with ARGS ignoring shell functions. If you have a shell"
+#~ msgstr "Выполняет КОМАНДУ с АРГУМЕНТАМИ, игнорируя функции оболочки. Если у вас есть"
+
+#~ msgid "function called `ls', and you wish to call the command `ls', you can"
+#~ msgstr "функция оболочки `ls', а вы хотите вызвать команду `ls', можно использовать"
+
+#~ msgid "say \"command ls\". If the -p option is given, a default value is used"
+#~ msgstr "\"command ls\". Если задан параметр -p, используется значение $PATH"
+
+#~ msgid "for PATH that is guaranteed to find all of the standard utilities. If"
+#~ msgstr "по умолчанию, что гарантирует отыскание стандартных утилит. Если"
+
+#~ msgid "the -V or -v option is given, a string is printed describing COMMAND."
+#~ msgstr "задан параметр -V или -v, выводится строка, описывающая КОМАНДУ."
+
+#~ msgid "The -V option produces a more verbose description."
+#~ msgstr "Параметр -V создаёт более подробное описание."
+
+#~ msgid "Declare variables and/or give them attributes. If no NAMEs are"
+#~ msgstr "Объявляет переменные и/или придаёт им атрибуты. Если не заданы ИМЕНА,"
+
+#~ msgid "given, then display the values of variables instead. The -p option"
+#~ msgstr "выводит вместо этого значения переменных. Параметр -p выведет"
+
+#~ msgid "will display the attributes and values of each NAME."
+#~ msgstr "атрибуты и значения каждого ИМЕНИ."
+
+#~ msgid "The flags are:"
+#~ msgstr "Флаги:"
+
+#~ msgid " -a\tto make NAMEs arrays (if supported)"
+#~ msgstr " -a\tсчитать ИМЕНА массивами (если поддерживаются)"
+
+#~ msgid " -f\tto select from among function names only"
+#~ msgstr " -f\tискать только среди имён функций"
+
+#~ msgid " -F\tto display function names without definitions"
+#~ msgstr " -F\tпоказать имена функций без определений"
+
+#~ msgid " -r\tto make NAMEs readonly"
+#~ msgstr " -r\tсделать ИМЕНА переменными только для чтения"
+
+#~ msgid " -x\tto make NAMEs export"
+#~ msgstr " -x\tпозволить экспорт ИМЁН"
+
+#~ msgid " -i\tto make NAMEs have the `integer' attribute set"
+#~ msgstr " -i\tпридать ИМЕНАМ набор атрибутов `integer' (целочисленный)"
+
+#~ msgid "Variables with the integer attribute have arithmetic evaluation (see"
+#~ msgstr "Для переменных с атрибутом `integer' арифметические вычисления (см."
+
+#~ msgid "`let') done when the variable is assigned to."
+#~ msgstr "`let') выполняются при присвоении переменной значения."
+
+#~ msgid "When displaying values of variables, -f displays a function's name"
+#~ msgstr "При выводе значений переменных -f выводит имя и определение"
+
+#~ msgid "and definition. The -F option restricts the display to function"
+#~ msgstr "функции. Параметр -F ограничивает вывод именем"
+
+#~ msgid "name only."
+#~ msgstr "функции."
+
+#~ msgid "Using `+' instead of `-' turns off the given attribute instead. When"
+#~ msgstr "Использование `+' вместо `-' выключает заданный атрибут. При"
+
+#~ msgid "used in a function, makes NAMEs local, as with the `local' command."
+#~ msgstr "использовании в функции делает ИМЕНа локальными, как команда `local'."
+
+#~ msgid "Obsolete. See `declare'."
+#~ msgstr "Устарела. См. `declare'."
+
+#~ msgid "Create a local variable called NAME, and give it VALUE. LOCAL"
+#~ msgstr "Создать локальную переменную ИМЯ и придать ей ЗНАЧЕНИЕ. LOCAL"
+
+#~ msgid "have a visible scope restricted to that function and its children."
+#~ msgstr "область видимости ИМЕНИ этой функцией и её потомками."
+
+#~ msgid "Output the ARGs. If -n is specified, the trailing newline is"
+#~ msgstr "Выводит АРГУМЕНТЫ. Если задано -n, подавляется завершающий переход"
+
+#~ msgid "suppressed. If the -e option is given, interpretation of the"
+#~ msgstr "на новую строку. Если задан параметр -e, интерпретируются следующие"
+
+#~ msgid "following backslash-escaped characters is turned on:"
+#~ msgstr "экранированные символы:"
+
+#~ msgid "\t\\a\talert (bell)"
+#~ msgstr "\t\\a\tпредупреждение (звонок)"
+
+#~ msgid "\t\\b\tbackspace"
+#~ msgstr "\t\\b\tзабой (откат)"
+
+#~ msgid "\t\\c\tsuppress trailing newline"
+#~ msgstr "\t\\c\tподавить завершающий переход на новую строку"
+
+#~ msgid "\t\\E\tescape character"
+#~ msgstr "\t\\E\tэкранировать символ"
+
+#~ msgid "\t\\f\tform feed"
+#~ msgstr "\t\\f\tсдвиг на следующую строку"
+
+#~ msgid "\t\\n\tnew line"
+#~ msgstr "\t\\n\tновая строка"
+
+#~ msgid "\t\\r\tcarriage return"
+#~ msgstr "\t\\r\tвозврат каретки"
+
+#~ msgid "\t\\t\thorizontal tab"
+#~ msgstr "\t\\t\tгоризонтальная табуляция"
+
+#~ msgid "\t\\v\tvertical tab"
+#~ msgstr "\t\\v\tвертикальная табуляция"
+
+#~ msgid "\t\\\\\tbackslash"
+#~ msgstr "\t\\\\\tобратная косая черта"
+
+#~ msgid "\t\\num\tthe character whose ASCII code is NUM (octal)."
+#~ msgstr "\t\\число\tсимвол, восьмеричный ASCII-код которого равен ЧИСЛУ"
+
+#~ msgid "You can explicitly turn off the interpretation of the above characters"
+#~ msgstr "Вы можете явно выключить интерпретацию вышеприведённых символов"
+
+#~ msgid "with the -E option."
+#~ msgstr "параметром -E."
+
+#~ msgid "Output the ARGs. If -n is specified, the trailing newline is suppressed."
+#~ msgstr "Выводит АРГУМЕНТЫ. Если задано -n, подавляется завершающий переход на новую строку."
+
+#~ msgid "Enable and disable builtin shell commands. This allows"
+#~ msgstr "Включает и блокирует встроенные команды оболочки. Это позволяет"
+
+#~ msgid "you to use a disk command which has the same name as a shell"
+#~ msgstr "использовать внешние команды с теми же именами, что команды"
+
+#~ msgid "builtin. If -n is used, the NAMEs become disabled; otherwise"
+#~ msgstr "оболочки. При использовании -n ИМЕНА блокируются, в противном случае"
+
+#~ msgid "NAMEs are enabled. For example, to use the `test' found on your"
+#~ msgstr "включаются. Например, чтобы использовать файл `test', а не встроенную"
+
+#~ msgid "path instead of the shell builtin version, type `enable -n test'."
+#~ msgstr "в оболочку версию, введите enable -n test'. На системах,"
+
+#~ msgid "On systems supporting dynamic loading, the -f option may be used"
+#~ msgstr "поддерживающих динамическую загрузку можно использовать параметр -f"
+
+#~ msgid "to load new builtins from the shared object FILENAME. The -d"
+#~ msgstr "чтобы загрузить новые встроенные команды из разделяемого объекта ФАЙЛ."
+
+#~ msgid "option will delete a builtin previously loaded with -f. If no"
+#~ msgstr "Параметр -d удаляет команды, загруженные -f. Если имена, кроме"
+
+#~ msgid "non-option names are given, or the -p option is supplied, a list"
+#~ msgstr "как в параметрах, не заданы, или если задан параметр -p, выводится"
+
+#~ msgid "of builtins is printed. The -a option means to print every builtin"
+#~ msgstr "список встроенных команд. Параметр -a требует вывести все встроенные"
+
+#~ msgid "with an indication of whether or not it is enabled. The -s option"
+#~ msgstr "команды с информацией, блокированы ли они. Параметр -s выводит"
+
+#~ msgid "restricts the output to the Posix.2 `special' builtins. The -n"
+#~ msgstr "только `специальные' команды Posix.2. Параметр -n выводит список"
+
+#~ msgid "option displays a list of all disabled builtins."
+#~ msgstr "всех блокированных встроенных команд."
+
+#~ msgid "Read ARGs as input to the shell and execute the resulting command(s)."
+#~ msgstr "Читает АРГУМЕНТЫ как входной текст оболочки и выполняет полученные команды."
+
+#~ msgid "Getopts is used by shell procedures to parse positional parameters."
+#~ msgstr "Getopts используется процедурами оболочки для анализа параметров командной"
+
+#~ msgid "OPTSTRING contains the option letters to be recognized; if a letter"
+#~ msgstr "строки. СТРОКА_ПАРАМЕТРОВ содержит буквы параметров, которые нужно"
+
+#~ msgid "is followed by a colon, the option is expected to have an argument,"
+#~ msgstr "распознать. Если за буквой следует двоеточие, параметр должен иметь"
+
+#~ msgid "which should be separated from it by white space."
+#~ msgstr "аргумент, отделённый от него промежутком."
+
+#~ msgid "Each time it is invoked, getopts will place the next option in the"
+#~ msgstr "При каждом вызове getopts помещает следующий параметр в переменную"
+
+#~ msgid "shell variable $name, initializing name if it does not exist, and"
+#~ msgstr "оболочки $имя, инициализируя имя, если оно не существует, а индекс"
+
+#~ msgid "the index of the next argument to be processed into the shell"
+#~ msgstr "следующего аргумента в переменную оболочки OPTIND. OPTIND"
+
+#~ msgid "variable OPTIND. OPTIND is initialized to 1 each time the shell or"
+#~ msgstr "принимает значение 1 при каждом вызове оболочки или скрипта оболочки."
+
+#~ msgid "a shell script is invoked. When an option requires an argument,"
+#~ msgstr "Если параметр требует аргумента, getopts помещает этот аргумент"
+
+#~ msgid "getopts places that argument into the shell variable OPTARG."
+#~ msgstr "в переменную оболочки OPTARG."
+
+#~ msgid "getopts reports errors in one of two ways. If the first character"
+#~ msgstr "getopts сообщает об ошибках одним из двух способов. Если первый символ"
+
+#~ msgid "of OPTSTRING is a colon, getopts uses silent error reporting. In"
+#~ msgstr "OPTSTRING -- двоеточие, getopts использует бесшумный способ. В этом"
+
+#~ msgid "this mode, no error messages are printed. If an illegal option is"
+#~ msgstr "случае сообщения об ошибках не выводятся. Если найден недопустимый"
+
+#~ msgid "seen, getopts places the option character found into OPTARG. If a"
+#~ msgstr "параметр, getopts помещает найденный символ в OPTARG. Если не найден"
+
+#~ msgid "required argument is not found, getopts places a ':' into NAME and"
+#~ msgstr "требуемый аргумент, getopts помещает в ИМЯ ':', а в OPTARG --"
+
+#~ msgid "sets OPTARG to the option character found. If getopts is not in"
+#~ msgstr "найденный символ. Если getopts работает не в бесшумном режиме"
+
+#~ msgid "silent mode, and an illegal option is seen, getopts places '?' into"
+#~ msgstr "и обнаружен недопустимый параметр, getopts помещает в ИМЯ '?', и"
+
+#~ msgid "NAME and unsets OPTARG. If a required option is not found, a '?'"
+#~ msgstr "сбрасывает OPTARG. Если не найден требуемый параметр, в ИМЯ"
+
+#~ msgid "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+#~ msgstr "помещается '?', OPTARG сбрасывается, и выводится диагностическое"
+
+#~ msgid "printed."
+#~ msgstr "сообщение."
+
+#~ msgid "If the shell variable OPTERR has the value 0, getopts disables the"
+#~ msgstr "Если переменная оболочки OPTERR имеет значение 0, getopts блокирует"
+
+#~ msgid "printing of error messages, even if the first character of"
+#~ msgstr "вывод сообщений об ошибках, даже если первый символ OPTSTRING"
+
+#~ msgid "OPTSTRING is not a colon. OPTERR has the value 1 by default."
+#~ msgstr "не двоеточие. По умолчанию OPTERR имеет значение 1."
+
+#~ msgid "Getopts normally parses the positional parameters ($0 - $9), but if"
+#~ msgstr "Getopts обычно разбирает позиционные параметры ($0 - $9), но если"
+
+#~ msgid "more arguments are given, they are parsed instead."
+#~ msgstr "заданы дополнительные аргументы, вместо этого разбираются они"
+
+#~ msgid "Exec FILE, replacing this shell with the specified program."
+#~ msgstr "Запустить ФАЙЛ, замещая эту копию оболочки указанной программой."
+
+#~ msgid "If FILE is not specified, the redirections take effect in this"
+#~ msgstr "Если ФАЙЛ не задан, могут быть переназначены файловые дескрипторы."
+
+#~ msgid "shell. If the first argument is `-l', then place a dash in the"
+#~ msgstr "Если первый аргумент `-l', в начало нулевого аргумента, переданного"
+
+#~ msgid "zeroth arg passed to FILE, as login does. If the `-c' option"
+#~ msgstr "ФАЙЛУ, добавляется `-', как при работе login. Если задан параметр"
+
+#~ msgid "is supplied, FILE is executed with a null environment. The `-a'"
+#~ msgstr "`-c', ФАЙЛ выполняется в пустой среде. Параметр `-a' устанавливает"
+
+#~ msgid "option means to make set argv[0] of the executed process to NAME."
+#~ msgstr "argv[0] запущенного процесса в ИМЯ."
+
+#~ msgid "If the file cannot be executed and the shell is not interactive,"
+#~ msgstr "Если файл не может быть запущен, а оболочка не интерактивна,"
+
+#~ msgid "then the shell exits, unless the variable \"no_exit_on_failed_exec\""
+#~ msgstr "производится выход из оболочки, если только не установлена переменная"
+
+#~ msgid "is set."
+#~ msgstr "\"no_exit_on_failed_exec\""
+
+#~ msgid "is that of the last command executed."
+#~ msgstr "завершения будет таким же, как у последней выполненной команды."
+
+#~ msgid "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+#~ msgstr "ПЕРВАЯ и ПОСЛЕДНЯЯ могут быть числами, ограничивающими диапазон, или"
+
+#~ msgid "string, which means the most recent command beginning with that"
+#~ msgstr "же ПЕРВАЯ может быть строкой, означающей самую недавнюю команду,"
+
+#~ msgid "string."
+#~ msgstr "начинающуюся с этой строки."
+
+#~ msgid " -e ENAME selects which editor to use. Default is FCEDIT, then EDITOR,"
+#~ msgstr " -e ИМЯ_РЕДАКТОРА выбирает используемый редактор. По умолчанию FCEDIT,"
+
+#~ msgid " then the editor which corresponds to the current readline editing"
+#~ msgstr " затем EDITOR, затем редактор, соответствуюший текущему режиму"
+
+#~ msgid " mode, then vi."
+#~ msgstr " редактирования readline, затем vi."
+
+#~ msgid " -l means list lines instead of editing."
+#~ msgstr " -l вывести, а не редактировать строки."
+
+#~ msgid " -n means no line numbers listed."
+#~ msgstr " -n не выводить номера строк."
+
+#~ msgid " -r means reverse the order of the lines (making it newest listed first)."
+#~ msgstr " -r вывести строки в обратном порядке (в начале самые новые)."
+
+#~ msgid "With the `fc -s [pat=rep ...] [command]' format, the command is"
+#~ msgstr "В формате `fc -s [шаблон=замена] [команда] команда выполняется заново"
+
+#~ msgid "re-executed after the substitution OLD=NEW is performed."
+#~ msgstr "после того, как произведена подстановка."
+
+#~ msgid "A useful alias to use with this is r='fc -s', so that typing `r cc'"
+#~ msgstr "Полезная псевдокоманда -- r='fc -s', так `r cc' выполняет последнюю"
+
+#~ msgid "runs the last command beginning with `cc' and typing `r' re-executes"
+#~ msgstr "команду, начинающуюся с `cc', а `r' заново выполняет последнюю"
+
+#~ msgid "Place JOB_SPEC in the foreground, and make it the current job. If"
+#~ msgstr "Возвращает задачу с указанным номером из фонового режима и делает её"
+
+#~ msgid "JOB_SPEC is not present, the shell's notion of the current job is"
+#~ msgstr "текущей задачей. Если номер не задан, используется представление"
+
+#~ msgid "used."
+#~ msgstr "оболочки о текущей задаче."
+
+#~ msgid "Place JOB_SPEC in the background, as if it had been started with"
+#~ msgstr "Переводит задачу с указанным номером в фоновый режим, как если бы она"
+
+#~ msgid "`&'. If JOB_SPEC is not present, the shell's notion of the current"
+#~ msgstr "была запущена с `&'. Если номер не задан, используется представление"
+
+#~ msgid "job is used."
+#~ msgstr "оболочки о текущей задаче."
+
+#~ msgid "For each NAME, the full pathname of the command is determined and"
+#~ msgstr "Для каждого ИМЕНИ определяются и запоминаются полные пути команды."
+
+#~ msgid "remembered. If the -p option is supplied, PATHNAME is used as the"
+#~ msgstr "Если задан параметр -p, в качестве пути используется заданный, а"
+
+#~ msgid "full pathname of NAME, and no path search is performed. The -r"
+#~ msgstr "поиск не выполняется. Параметр -r заставляет оболочку очистить"
+
+#~ msgid "option causes the shell to forget all remembered locations. If no"
+#~ msgstr "список положений в памяти. Если аргументы не заданы, выводится"
+
+#~ msgid "arguments are given, information about remembered commands is displayed."
+#~ msgstr "информация о запомненных командах."
+
+#~ msgid "Display helpful information about builtin commands. If PATTERN is"
+#~ msgstr "Вывести полезную информацию о встроенных командах. Если задан ШАБЛОН,"
+
+#~ msgid "specified, gives detailed help on all commands matching PATTERN,"
+#~ msgstr "вывести подробную справку по всем командам, соответствующим ШАБЛОНУ,"
+
+#~ msgid "otherwise a list of the builtins is printed."
+#~ msgstr "в противном случае вывести список встроенных команд."
+
+#~ msgid "Display the history list with line numbers. Lines listed with"
+#~ msgstr "Вывести историю команд в виде списка с номерами строк. Изменённые"
+
+#~ msgid "with a `*' have been modified. Argument of N says to list only"
+#~ msgstr "строки помечаются символом `*'. Аргумент N указывает выводить только"
+
+#~ msgid "the last N lines. The -c option causes the history list to be"
+#~ msgstr "последние N строк. Параметр -c очищает историю команд, удаляя"
+
+#~ msgid "cleared by deleting all of the entries. The `-w' option writes out the"
+#~ msgstr "все строки. Параметр `-w' записывает текущую историю в указанный"
+
+#~ msgid "current history to the history file; `-r' means to read the file and"
+#~ msgstr "файл; `-r' читает такой файл и дополняет его содержимым историю"
+
+#~ msgid "append the contents to the history list instead. `-a' means"
+#~ msgstr "команд. `-a' добавляет историю этой сессии к файлу истории"
+
+#~ msgid "to append history lines from this session to the history file."
+#~ msgstr "команд. Аргумент `-n' читает из файла истории все строки, не"
+
+#~ msgid "Argument `-n' means to read all history lines not already read"
+#~ msgstr "прочитанные ранее, и добавляет их к истории. Если задан ФАЙЛ,"
+
+#~ msgid "from the history file and append them to the history list. If"
+#~ msgstr "в качестве файла истории команд используется он, иначе, если"
+
+#~ msgid "FILENAME is given, then that is used as the history file else"
+#~ msgstr "переменной $HISTFILE присвоено значение, используется оно, иначе"
+
+#~ msgid "if $HISTFILE has a value, that is used, else ~/.bash_history."
+#~ msgstr "используется ~/.bash_history. Если задан параметр -s, АРГУМЕНТЫ,"
+
+#~ msgid "If the -s option is supplied, the non-option ARGs are appended to"
+#~ msgstr "являющиеся параметрами, добавляются к истории как один элемент."
+
+#~ msgid "the history list as a single entry. The -p option means to perform"
+#~ msgstr "Параметр -p выполняет развёртывание каждого АРГУМЕНТА и выводит"
+
+#~ msgid "history expansion on each ARG and display the result, without storing"
+#~ msgstr "результат, не сохраняя ничего в списке истории команд."
+
+#~ msgid "anything in the history list."
+#~ msgstr " "
+
+#~ msgid "Lists the active jobs. The -l option lists process id's in addition"
+#~ msgstr "Выводит список активных задач. Параметр -l выводит, кроме того,"
+
+#~ msgid "to the normal information; the -p option lists process id's only."
+#~ msgstr "идентификаторы процессов: параметр -p выодит только идентификаторы."
+
+#~ msgid "If -n is given, only processes that have changed status since the last"
+#~ msgstr "Если задано -n, выводятся только процессы, статус которых изменился"
+
+#~ msgid "notification are printed. JOBSPEC restricts output to that job. The"
+#~ msgstr "со времени последнего уведомления. Если задан номер задачи, выводится"
+
+#~ msgid "-r and -s options restrict output to running and stopped jobs only,"
+#~ msgstr "только она. Параметры -r и -s выводит только работающие или только"
+
+#~ msgid "respectively. Without options, the status of all active jobs is"
+#~ msgstr "остановленные задачи соответственно. Без параметров выодится статус"
+
+#~ msgid "printed. If -x is given, COMMAND is run after all job specifications"
+#~ msgstr "всех активных задач. Если задано -x, в КОМАНДЕ вместо всех АРГУМЕНТОВ"
+
+#~ msgid "that appear in ARGS have been replaced with the process ID of that job's"
+#~ msgstr "(номеров задач) подставляется идентификатор лидера соответствующей"
+
+#~ msgid "process group leader."
+#~ msgstr "группы процессов, и КОМАНДА выполняется."
+
+#~ msgid "Removes each JOBSPEC argument from the table of active jobs."
+#~ msgstr "Удаляет все задачи, заданные спецификациями в аргументе, из таблицы задач."
+
+#~ msgid "Send the processes named by PID (or JOB) the signal SIGSPEC. If"
+#~ msgstr "Посылает указанным процессам (заданным PID или спецификацией) сигнал"
+
+#~ msgid "SIGSPEC is not present, then SIGTERM is assumed. An argument of `-l'"
+#~ msgstr "SIGSPEC. Если отсутствует SIGSPEC, посылается SIGTERM. Аргументом"
+
+#~ msgid "lists the signal names; if arguments follow `-l' they are assumed to"
+#~ msgstr "параметра `-l' служит список сигналов. Если он присутствует, выводятся"
+
+#~ msgid "be signal numbers for which names should be listed. Kill is a shell"
+#~ msgstr "названия сигналов с этими номерами. Kill является встроенной командой"
+
+#~ msgid "builtin for two reasons: it allows job IDs to be used instead of"
+#~ msgstr "оболочки по двум причинам: она позволяет использовать номера задач,"
+
+#~ msgid "process IDs, and, if you have reached the limit on processes that"
+#~ msgstr "а не процессов, и если вы исчерпаете лимит созданных процессов,"
+
+#~ msgid "you can create, you don't have to start a process to kill another one."
+#~ msgstr "вы не сможете запустить новый процесс, уничтожающий один из старых."
+
+#~ msgid "Each ARG is an arithmetic expression to be evaluated. Evaluation"
+#~ msgstr "Каждый аргумент рассматривается как арифметическое выражение."
+
+#~ msgid "is done in long integers with no check for overflow, though division"
+#~ msgstr "Вычисление производится над длинными целыми без контроля переполнения,"
+
+#~ msgid "by 0 is trapped and flagged as an error. The following list of"
+#~ msgstr "хотя деление на ноль отслеживается и считается ошибкой. Операции в"
+
+#~ msgid "operators is grouped into levels of equal-precedence operators."
+#~ msgstr "следующем списке сгруппированы по уровням равного приоритета."
+
+#~ msgid "The levels are listed in order of decreasing precedence."
+#~ msgstr "Уровни перечислены в порядке уменьшения приоритета."
+
+#~ msgid "\t-, +\t\tunary minus, plus"
+#~ msgstr "\t-, +\t\tунарный минус, унарный плюс"
+
+#~ msgid "\t!, ~\t\tlogical and bitwise negation"
+#~ msgstr "\t!, ~\t\tлогическое и побитовое отрицание"
+
+#~ msgid "\t*, /, %\t\tmultiplication, division, remainder"
+#~ msgstr "\t*, /, %\t\tумножение, деление, взятие остатка"
+
+#~ msgid "\t+, -\t\taddition, subtraction"
+#~ msgstr "\t+, -\t\tсложение, вычитание"
+
+#~ msgid "\t<<, >>\t\tleft and right bitwise shifts"
+#~ msgstr "\t<<, >>\t\tлевый и правый побитовый сдвиг"
+
+#~ msgid "\t<=, >=, <, >\tcomparison"
+#~ msgstr "\t<=, >=, <, >\tсравнение"
+
+#~ msgid "\t==, !=\t\tequality, inequality"
+#~ msgstr "\t==, !=\t\tравенство, неравенство"
+
+#~ msgid "\t&\t\tbitwise AND"
+#~ msgstr "\t&\t\tпобитовое И"
+
+#~ msgid "\t^\t\tbitwise XOR"
+#~ msgstr "\t^\t\tпобитовое ИСКЛЮЧАЮЩЕЕ ИЛИ"
+
+#~ msgid "\t|\t\tbitwise OR"
+#~ msgstr "\t|\t\tпобитовое ИЛИ"
+
+#~ msgid "\t&&\t\tlogical AND"
+#~ msgstr "\t&&\t\tлогическое И"
+
+#~ msgid "\t||\t\tlogical OR"
+#~ msgstr "\t||\t\tлогическое ИЛИ"
+
+#~ msgid "\texpr ? expr : expr"
+#~ msgstr "\texpt ? expr : expr"
+
+#~ msgid "\t\t\tconditional expression"
+#~ msgstr "\t\t\tусловное выражение"
+
+#~ msgid "\t=, *=, /=, %=,"
+#~ msgstr "\t=, *=, /=, %=,"
+
+#~ msgid "\t+=, -=, <<=, >>=,"
+#~ msgstr "\t+=, -=, <<=, >>=,"
+
+#~ msgid "\t&=, ^=, |=\tassignment"
+#~ msgstr "\t&=, ^=, |=\tприсваивание"
+
+#~ msgid "is replaced by its value (coerced to a long integer) within"
+#~ msgstr "переменной заменяется её значение (преобразованным в длинное"
+
+#~ msgid "an expression. The variable need not have its integer attribute"
+#~ msgstr "целое). Для использования в выражении переменная не обязана иметь"
+
+#~ msgid "turned on to be used in an expression."
+#~ msgstr "установленный целочисленный атрибут."
+
+#~ msgid "Operators are evaluated in order of precedence. Sub-expressions in"
+#~ msgstr "Операции обрабатываются в порядке приоритета. Подвыражения в"
+
+#~ msgid "parentheses are evaluated first and may override the precedence"
+#~ msgstr "скобках вычисляются вначале, что может не соответствовать правилам"
+
+#~ msgid "rules above."
+#~ msgstr "приоритета."
+
+#~ msgid "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+#~ msgstr "Если вычисление последнего аргумента дало 0, let возвращает 1,"
+
+#~ msgid "otherwise."
+#~ msgstr "иначе 0."
+
+#~ msgid "One line is read from the standard input, and the first word is"
+#~ msgstr "Со стандартного ввода считывается одна строка, первое её слово"
+
+#~ msgid "assigned to the first NAME, the second word to the second NAME, and so"
+#~ msgstr "становится значением первого ИМЕНИ, второе -- второго ИМЕНИ и т.д."
+
+#~ msgid "on, with leftover words assigned to the last NAME. Only the characters"
+#~ msgstr "Последнему ИМЕНИ присваивается весь остаток строки. Разделителями слов"
+
+#~ msgid "found in $IFS are recognized as word delimiters. The return code is"
+#~ msgstr "считаются только символы, входящие в $IFS. Код возврата равен нулю,"
+
+#~ msgid "zero, unless end-of-file is encountered. If no NAMEs are supplied, the"
+#~ msgstr "за исключением случая, если встретился конец файла. Если ИМЕНА не"
+
+#~ msgid "line read is stored in the REPLY variable. If the -r option is given,"
+#~ msgstr "заданы, прочитанная строка помещается в переменную REPLY. Если задан"
+
+#~ msgid "this signifies `raw' input, and backslash escaping is disabled. If"
+#~ msgstr "параметр -r, это означает `сырой' ввод, т.е. символ \\ не экранирует"
+
+#~ msgid "the `-p' option is supplied, the string supplied as an argument is"
+#~ msgstr "символы. Если задано `-p', перед чтением на вывод в качестве аргумента"
+
+#~ msgid "output without a trailing newline before attempting to read. If -a is"
+#~ msgstr "подаётся заданная строка (без завершающего символа перевода строки)."
+
+#~ msgid "supplied, the words read are assigned to sequential indices of ARRAY,"
+#~ msgstr "Если задано -a, прочитанные слова становятся значениями элементов"
+
+#~ msgid "starting at zero. If -e is supplied and the shell is interactive,"
+#~ msgstr "МАССИВА, начиная с нулевого. Если задано -c и оболочка интерактивна,"
+
+#~ msgid "readline is used to obtain the line."
+#~ msgstr "чтобы получить строку используется readline."
+
+#~ msgid "Causes a function to exit with the return value specified by N. If N"
+#~ msgstr "Заставляет функцию завершить работу с кодом возврата, заданным N."
+
+#~ msgid "is omitted, the return status is that of the last command."
+#~ msgstr "Если N опущено, им становится код возврата последней команды."
+
+#~ msgid " -a Mark variables which are modified or created for export."
+#~ msgstr " -a Экспортировать переменные, которые изменялись или создавались."
+
+#~ msgid " -b Notify of job termination immediately."
+#~ msgstr " -b Немедленно выводить сообщения о завершении задач."
+
+#~ msgid " -e Exit immediately if a command exits with a non-zero status."
+#~ msgstr " -e Завершить работу, если команд возврата команды не равен 0."
+
+#~ msgid " -f Disable file name generation (globbing)."
+#~ msgstr " -f Прекратить расширение имён файлов (globbing)."
+
+#~ msgid " -h Remember the location of commands as they are looked up."
+#~ msgstr " -h Запоминать расположение обработанных команд."
+
+#~ msgid " -i Force the shell to be an \"interactive\" one. Interactive shells"
+#~ msgstr " -i Сделать оболочку \"интерактивной\". Интерактивные оболочки"
+
+#~ msgid " always read `~/.bashrc' on startup."
+#~ msgstr " читают `~/.bashrc' при каждом запуске."
+
+#~ msgid " -k All assignment arguments are placed in the environment for a"
+#~ msgstr " -k В среду команды помещаются все аргументы присваивания,"
+
+#~ msgid " command, not just those that precede the command name."
+#~ msgstr " а не только предшествующие её имени."
+
+#~ msgid " -m Job control is enabled."
+#~ msgstr " -m Включить управление задачами."
+
+#~ msgid " -n Read commands but do not execute them."
+#~ msgstr " -n Считывать команды, но не выполнять их."
+
+#~ msgid " -o option-name"
+#~ msgstr " -o имя_параметра"
+
+#~ msgid " Set the variable corresponding to option-name:"
+#~ msgstr " Установить режим в соответствии с заданным именем:"
+
+#~ msgid " allexport same as -a"
+#~ msgstr " allexport то же, что -a"
+
+#~ msgid " braceexpand same as -B"
+#~ msgstr " braceexpand то же, что -B"
+
+#~ msgid " emacs use an emacs-style line editing interface"
+#~ msgstr " emacs использовать стиль редактирования строк emacs"
+
+#~ msgid " errexit same as -e"
+#~ msgstr " errexit то же, что -e"
+
+#~ msgid " hashall same as -h"
+#~ msgstr " hashall то же, что -h"
+
+#~ msgid " histexpand same as -H"
+#~ msgstr " histexpand то же, что -H"
+
+#~ msgid " ignoreeof the shell will not exit upon reading EOF"
+#~ msgstr " ignoreeof при чтении EOF оболочка не завершит работу"
+
+#~ msgid " interactive-comments"
+#~ msgstr " interactive-comments"
+
+#~ msgid " allow comments to appear in interactive commands"
+#~ msgstr " допускает комментарии в интерактивных командах"
+
+#~ msgid " keyword same as -k"
+#~ msgstr " keyword то же, что -k"
+
+#~ msgid " monitor same as -m"
+#~ msgstr " monitor то же, что -m"
+
+#~ msgid " noclobber same as -C"
+#~ msgstr " noclobber то же, что -C"
+
+#~ msgid " noexec same as -n"
+#~ msgstr " noexec то же, что -n"
+
+#~ msgid " noglob same as -f"
+#~ msgstr " noglob то же, что -f"
+
+#~ msgid " notify save as -b"
+#~ msgstr " notify то же, что -b"
+
+#~ msgid " nounset same as -u"
+#~ msgstr " nounset то же, что -u"
+
+#~ msgid " onecmd same as -t"
+#~ msgstr " onecmd то же, что -t"
+
+#~ msgid " physical same as -P"
+#~ msgstr " physical то же, что -P"
+
+#~ msgid " posix change the behavior of bash where the default"
+#~ msgstr " posix привести поведение bash, по умолчанию не"
+
+#~ msgid " operation differs from the 1003.2 standard to"
+#~ msgstr " соответствующее стандарту 1003.2, в"
+
+#~ msgid " match the standard"
+#~ msgstr " соответствие с ним"
+
+#~ msgid " privileged same as -p"
+#~ msgstr " privileged то же, что -p"
+
+#~ msgid " verbose same as -v"
+#~ msgstr " verbose то же, что -v"
+
+#~ msgid " vi use a vi-style line editing interface"
+#~ msgstr " vi использовать стиль редактирования строк vi"
+
+#~ msgid " xtrace same as -x"
+#~ msgstr " xtrace то же, что -x"
+
+#~ msgid " -p Turned on whenever the real and effective user ids do not match."
+#~ msgstr " -p Если реальный и эффективный uid не совпадают, включается всегда."
+
+#~ msgid " Disables processing of the $ENV file and importing of shell"
+#~ msgstr " Отключает обработку файла $ENV и импорт функций оболочки."
+
+#~ msgid " functions. Turning this option off causes the effective uid and"
+#~ msgstr " При выключении этого параметра эффективные uid и gid становятся"
+
+#~ msgid " gid to be set to the real uid and gid."
+#~ msgstr " равными реальным."
+
+#~ msgid " -t Exit after reading and executing one command."
+#~ msgstr " -t Завершить работу после чтения и выполнения одной команды."
+
+#~ msgid " -u Treat unset variables as an error when substituting."
+#~ msgstr " -u При подстановке считать не установленные переменные ошибками."
+
+#~ msgid " -v Print shell input lines as they are read."
+#~ msgstr " -v Выводить прочитанные строки входного текста оболочки."
+
+#~ msgid " -x Print commands and their arguments as they are executed."
+#~ msgstr " -x Выводить по мере исполнения команд и их аргументы."
+
+#~ msgid " -B the shell will perform brace expansion"
+#~ msgstr " -B оболочка будет производить подстановку скобок"
+
+#~ msgid " -H Enable ! style history substitution. This flag is on"
+#~ msgstr " -H Включить !-стиль подстановки истории. Включено"
+
+#~ msgid " by default."
+#~ msgstr " по умолчанию."
+
+#~ msgid " -C If set, disallow existing regular files to be overwritten"
+#~ msgstr " -C Если установлен, запретить перезапись существующих"
+
+#~ msgid " by redirection of output."
+#~ msgstr " обычных файлов при перенаправлении вывода."
+
+#~ msgid " -P If set, do not follow symbolic links when executing commands"
+#~ msgstr " -P Не следовать символическим ссылкам при выполнении таких команд,"
+
+#~ msgid " such as cd which change the current directory."
+#~ msgstr " как cd, т.е. изменяющих текущий каталог."
+
+#~ msgid "Using + rather than - causes these flags to be turned off. The"
+#~ msgstr "Использование + вместо - отключает флаг. Эти флаги могут также"
+
+#~ msgid "flags can also be used upon invocation of the shell. The current"
+#~ msgstr "использоваться при запуске оболочки. Текущий набор флагов содержится"
+
+#~ msgid "set of flags may be found in $-. The remaining n ARGs are positional"
+#~ msgstr "в $-. Остальные n аргументов -- позиционные параметры, и им, по"
+
+#~ msgid "parameters and are assigned, in order, to $1, $2, .. $n. If no"
+#~ msgstr "порядку, присваиваются значения $1, $2, ..., $n. Если аргументы"
+
+#~ msgid "ARGs are given, all shell variables are printed."
+#~ msgstr "не заданы, выводятся все переменные оболочки."
+
+#~ msgid "For each NAME, remove the corresponding variable or function. Given"
+#~ msgstr "Для каждого ИМЕНИ удаляет соответствующую переменную или функцию."
+
+#~ msgid "the `-v', unset will only act on variables. Given the `-f' flag,"
+#~ msgstr "Если задано -v, unset влияет только на переменные, если -f -- только"
+
+#~ msgid "unset will only act on functions. With neither flag, unset first"
+#~ msgstr "на функции. Без флагов unset в первую очередь пытается удалить"
+
+#~ msgid "tries to unset a variable, and if that fails, then tries to unset a"
+#~ msgstr "переменную, если это не удаётся -- функцию. Некоторые переменные"
+
+#~ msgid "function. Some variables (such as PATH and IFS) cannot be unset; also"
+#~ msgstr "(такие как PATH и IFS) не могут быть удалены. См."
+
+#~ msgid "see readonly."
+#~ msgstr "также readonly."
+
+#~ msgid "NAMEs are marked for automatic export to the environment of"
+#~ msgstr "ИМЕНА автоматически экспортируются в среду выполняемых"
+
+#~ msgid "subsequently executed commands. If the -f option is given,"
+#~ msgstr "впоследствии команд. Если задан параметр -f, ИМЕНА"
+
+#~ msgid "the NAMEs refer to functions. If no NAMEs are given, or if `-p'"
+#~ msgstr "обозначают функции. Если ИМЕНа не заданы, или если задано -p,"
+
+#~ msgid "is given, a list of all names that are exported in this shell is"
+#~ msgstr "выводится список всех имён, экспортированных в эту оболочку."
+
+#~ msgid "printed. An argument of `-n' says to remove the export property"
+#~ msgstr "Аргумент -n указывает убрать заданные имена из списка"
+
+#~ msgid "from subsequent NAMEs. An argument of `--' disables further option"
+#~ msgstr "экспортируемых. Аргумент -- отключает дальнейшую обработку"
+
+#~ msgid "processing."
+#~ msgstr "параметров."
+
+#~ msgid "The given NAMEs are marked readonly and the values of these NAMEs may"
+#~ msgstr "Заданные ИМЕНА помечаются только для чтения, и значения этих ИМЁН не"
+
+#~ msgid "not be changed by subsequent assignment. If the -f option is given,"
+#~ msgstr "могут изменяться в последующих присваиваниях. Если задан параметр -f,"
+
+#~ msgid "then functions corresponding to the NAMEs are so marked. If no"
+#~ msgstr "так помечаются функции с соответствующими ИМЕНАМИ. Если аргументы"
+
+#~ msgid "arguments are given, or if `-p' is given, a list of all readonly names"
+#~ msgstr "не заданы, или если задано `-p', выводится список имён только для"
+
+#~ msgid "is printed. An argument of `-n' says to remove the readonly property"
+#~ msgstr "чтения. Аргумент `-n' указывает снять свойство `только для чтения'"
+
+#~ msgid "from subsequent NAMEs. The `-a' option means to treat each NAME as"
+#~ msgstr "с указанных ИМЁН. Параметр `-a' заставляет рассматривать каждое ИМЯ"
+
+#~ msgid "an array variable. An argument of `--' disables further option"
+#~ msgstr "как массив. Аргумент `--' прекращает дальнейшую обработку"
+
+#~ msgid "The positional parameters from $N+1 ... are renamed to $1 ... If N is"
+#~ msgstr "Позиционные параметры начиная с $N+1 переобозначаются как $1,... Если"
+
+#~ msgid "not given, it is assumed to be 1."
+#~ msgstr "N не задано, оно предполагается равным 1."
+
+#~ msgid "Read and execute commands from FILENAME and return. The pathnames"
+#~ msgstr "Читает и выполняет команды из файла с заданным именем и завершает"
+
+#~ msgid "in $PATH are used to find the directory containing FILENAME."
+#~ msgstr "работу. Файл ищется в каталогах, перечисленных в $PATH."
+
+#~ msgid "Suspend the execution of this shell until it receives a SIGCONT"
+#~ msgstr "Приостанавливает работу оболочки до получения сигнала"
+
+#~ msgid "signal. The `-f' if specified says not to complain about this"
+#~ msgstr "SIGCONT. `-f', если задан, указывает приостановить работу, даже"
+
+#~ msgid "being a login shell if it is; just suspend anyway."
+#~ msgstr "если это оболочка сессии"
+
+#~ msgid "Exits with a status of 0 (trueness) or 1 (falseness) depending on"
+#~ msgstr "Завершает работу со статусом 0 (истина) или 1 (ложь) в зависимости"
+
+#~ msgid "the evaluation of EXPR. Expressions may be unary or binary. Unary"
+#~ msgstr "от значения ВЫРАЖЕНИЯ. Выражения могут быть унарными или бинарными."
+
+#~ msgid "expressions are often used to examine the status of a file. There"
+#~ msgstr "Унарные выражения часто используются для проверки состояния файла."
+
+#~ msgid "are string operators as well, and numeric comparison operators."
+#~ msgstr "Допустимы операции как строкового, так и численного сравнения."
+
+#~ msgid "File operators:"
+#~ msgstr "Файловые операции:"
+
+#~ msgid " -b FILE True if file is block special."
+#~ msgstr " -b ФАЙЛ Истина, если файл -- специальный блочный файл."
+
+#~ msgid " -c FILE True if file is character special."
+#~ msgstr " -c ФАЙл Истина, если файл -- специальный символьный файл."
+
+#~ msgid " -d FILE True if file is a directory."
+#~ msgstr " -d ФАЙЛ Истина, если файл -- каталог."
+
+#~ msgid " -e FILE True if file exists."
+#~ msgstr " -e ФАЙЛ Истина, если файл существует."
+
+#~ msgid " -f FILE True if file exists and is a regular file."
+#~ msgstr " -f ФАЙЛ Истина, если файл существует и является обычным файлом."
+
+#~ msgid " -g FILE True if file is set-group-id."
+#~ msgstr " -g ФАЙЛ Истина, если у файла установлен атрибут SGID."
+
+#~ msgid " -h FILE True if file is a symbolic link. Use \"-L\"."
+#~ msgstr " -h ФАЙЛ Истина, если файл -- символическая ссылка. Используйте \"-L\"."
+
+#~ msgid " -L FILE True if file is a symbolic link."
+#~ msgstr " -L ФАЙЛ Истина, если файл -- символическая ссылка."
+
+#~ msgid " -k FILE True if file has its \"sticky\" bit set."
+#~ msgstr " -k ФАЙЛ Истина, если у файла устанолвен \"бит привязчивости\"."
+
+#~ msgid " -p FILE True if file is a named pipe."
+#~ msgstr " -p ФАЙЛ Истина, если файл -- именованный канал."
+
+#~ msgid " -r FILE True if file is readable by you."
+#~ msgstr " -r ФАЙЛ Истина, если файл доступен вам для чтения."
+
+#~ msgid " -s FILE True if file exists and is not empty."
+#~ msgstr " -s ФАЙЛ Истина, если файл существует и не пуст."
+
+#~ msgid " -S FILE True if file is a socket."
+#~ msgstr " -S ФАЙЛ Истина, если файл -- сокет."
+
+#~ msgid " -t FD True if FD is opened on a terminal."
+#~ msgstr " -t FD Истина, если файл с дескриптором FD связан с терминалом."
+
+#~ msgid " -u FILE True if the file is set-user-id."
+#~ msgstr " -u ФАЙЛ Истина, если у файла установлен атрибут SUID."
+
+#~ msgid " -w FILE True if the file is writable by you."
+#~ msgstr " -w ФАЙЛ Истина, если файл доступен вам для записи"
+
+#~ msgid " -x FILE True if the file is executable by you."
+#~ msgstr " -x ФАЙЛ Истина, если файл доступен вам для выполнения."
+
+#~ msgid " -O FILE True if the file is effectively owned by you."
+#~ msgstr " -O ФАЙЛ Истина, если вы -- эффективный владелец файла."
+
+#~ msgid " -G FILE True if the file is effectively owned by your group."
+#~ msgstr " -G ФАЙЛ Истина, если ваша группа -- эффективная группа файла."
+
+#~ msgid " FILE1 -nt FILE2 True if file1 is newer than (according to"
+#~ msgstr " ФАЙЛ1 -nt ФАЙЛ2 Истина, если файл1 более новый (по дате последнего"
+
+#~ msgid " modification date) file2."
+#~ msgstr " изменения), чем файл2."
+
+#~ msgid " FILE1 -ot FILE2 True if file1 is older than file2."
+#~ msgstr " ФАЙЛ1 -ot ФАЙЛ2 Истина, если файл1 более старый, чем файл2."
+
+#~ msgid " FILE1 -ef FILE2 True if file1 is a hard link to file2."
+#~ msgstr " ФАЙЛ1 -ef ФАЙЛ2 Истина, если файл1 -- жёсткая ссылка на файл2."
+
+#~ msgid "String operators:"
+#~ msgstr "Строковые операции:"
+
+#~ msgid " -z STRING True if string is empty."
+#~ msgstr " -z СТРОКА Истина, если строка пуста."
+
+#~ msgid " -n STRING"
+#~ msgstr " -n СТРОКА"
+
+#~ msgid " STRING True if string is not empty."
+#~ msgstr " СТРОКА Истина, если стркоа не пуста."
+
+#~ msgid " STRING1 = STRING2"
+#~ msgstr " СТРОКА1 = СТРОКА2"
+
+#~ msgid " True if the strings are equal."
+#~ msgstr " Истина, если строки равны."
+
+#~ msgid " STRING1 != STRING2"
+#~ msgstr " СТРОКА1 != СТРОКА2"
+
+#~ msgid " True if the strings are not equal."
+#~ msgstr " Истина, если строки не равны."
+
+#~ msgid " STRING1 < STRING2"
+#~ msgstr " СТРОКА1 < СТРОКА2"
+
+#~ msgid " True if STRING1 sorts before STRING2 lexicographically"
+#~ msgstr " Истина, если СТРОКА1 лексикографически стоит раньше СТРОКИ2"
+
+#~ msgid " STRING1 > STRING2"
+#~ msgstr " СТРОКА1 > СТРОКА2"
+
+#~ msgid " True if STRING1 sorts after STRING2 lexicographically"
+#~ msgstr " Истина, если СТРОКА1 лексикографически стоит позже СТРОКИ2"
+
+#~ msgid "Other operators:"
+#~ msgstr "Прочие операции:"
+
+#~ msgid " ! EXPR True if expr is false."
+#~ msgstr " ! ВЫРАЖЕНИЕ Истина, если выражение ложно."
+
+#~ msgid " EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+#~ msgstr " ВЫР1 -a ВЫР2 Истина, если истинны оба выражения."
+
+#~ msgid " EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+#~ msgstr " ВЫР1 -o ВЫР2 Истина, если истинно хотя бы одно из выражений."
+
+#~ msgid " arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,"
+#~ msgstr " арг1 ОП арг2 Арифметическая проверка. ОП -- один из -eq, -ne,"
+
+#~ msgid " -lt, -le, -gt, or -ge."
+#~ msgstr " -lt, -le, -gt или -ge."
+
+#~ msgid "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+#~ msgstr "Бинарные арифметические операции возвращают истину, если АРГ1 равен,"
+
+#~ msgid "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+#~ msgstr "не равен, меньше, меньше или равен, больше или больше или равен"
+
+#~ msgid "than ARG2."
+#~ msgstr "АРГ2."
+
+#~ msgid "This is a synonym for the \"test\" builtin, but the last"
+#~ msgstr "Это синоним встроенной команды \"test\", но последним аргументом"
+
+#~ msgid "argument must be a literal `]', to match the opening `['."
+#~ msgstr "должен быть литерал ']'. соответствующий открывающей `['."
+
+#~ msgid "Print the accumulated user and system times for processes run from"
+#~ msgstr "Вывести пользовательское и системное время работы процессов,"
+
+#~ msgid "the shell."
+#~ msgstr "запущенных из оболочки."
+
+#~ msgid "The command ARG is to be read and executed when the shell receives"
+#~ msgstr "Команда АРГ должна быть прочитана и выполнена при получении оболочкой"
+
+#~ msgid "signal(s) SIGNAL_SPEC. If ARG is absent all specified signals are"
+#~ msgstr "указанного(ых) сигнала(ов). Если АРГ не задан, все указанные сигналы"
+
+#~ msgid "reset to their original values. If ARG is the null string each"
+#~ msgstr "обрабатываются обработчиками по умолчанию. Если АРГ -- пустая строка,"
+
+#~ msgid "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+#~ msgstr "все указанные сигналы будут игнорироваться оболочкой и вызываемыми ей"
+
+#~ msgid "If SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+#~ msgstr "командами. Если задан сигнал EXIT (0), команда АРГ выполняется при"
+
+#~ msgid "the shell. If SIGNAL_SPEC is DEBUG, ARG is executed after every"
+#~ msgstr "выходе из оболочки, если DEBUG, АРГ выполняется при выполнении каждой"
+
+#~ msgid "command. If ARG is `-p' then the trap commands associated with"
+#~ msgstr "команды. Если АРГ -- `-p', выводятся команды, связанные с заданными"
+
+#~ msgid "each SIGNAL_SPEC are displayed. If no arguments are supplied or if"
+#~ msgstr "сигналами. Если аргументы не заданы или если задано только `-p',"
+
+#~ msgid "only `-p' is given, trap prints the list of commands associated with"
+#~ msgstr "trap выводит список команд, связанных со всеми сигналами. Сигнал"
+
+#~ msgid "each signal number. SIGNAL_SPEC is either a signal name in <signal.h>"
+#~ msgstr "задаётся либо своим именем в <signal.h>, либо номером. `trap -l'"
+
+#~ msgid "or a signal number. `trap -l' prints a list of signal names and their"
+#~ msgstr "выводит список имён сигналов и соответствующих им номеров."
+
+#~ msgid "corresponding numbers. Note that a signal can be sent to the shell"
+#~ msgstr "Заметьте, что оболочке можно послать сигнал командой"
+
+#~ msgid "with \"kill -signal $$\"."
+#~ msgstr "\"kill -signal $$\"."
+
+#~ msgid "For each NAME, indicate how it would be interpreted if used as a"
+#~ msgstr "Для каждого ИМЕНИ определяет, как оно будет обрабатываться"
+
+#~ msgid "If the -t option is used, returns a single word which is one of"
+#~ msgstr "Если задан параметр -t, возвращает слово -- `alias', `keyword',"
+
+#~ msgid "`alias', `keyword', `function', `builtin', `file' or `', if NAME is an"
+#~ msgstr "`function', `builtin', `file' или `' -- если, соответственно, ИМЯ"
+
+#~ msgid "alias, shell reserved word, shell function, shell builtin, disk file,"
+#~ msgstr "является псевдокомандой, зарезервированным словом, функцией, или"
+
+#~ msgid "or unfound, respectively."
+#~ msgstr "встроенной командой оболочки, дисковым файлом или не найдено."
+
+#~ msgid "If the -p flag is used, either returns the name of the disk file"
+#~ msgstr "При использовании флага -p либо возвращается имя выполняемого дискового файла,"
+
+#~ msgid "that would be executed, or nothing if -t would not return `file'."
+#~ msgstr "либо ничего, если -t вернуло бы значение, отличное от `file'"
+
+#~ msgid "If the -a flag is used, displays all of the places that contain an"
+#~ msgstr "При использовании флага -a выводится расположение всех исполняемых файлов"
+
+#~ msgid "executable named `file'. This includes aliases and functions, if and"
+#~ msgstr "с указанным именем. Если одновременно не используется флаг -p и только"
+
+#~ msgid "only if the -p flag is not also used."
+#~ msgstr "тогда, выводятся также псевдокоманды и функции."
+
+#~ msgid "Type accepts -all, -path, and -type in place of -a, -p, and -t,"
+#~ msgstr "Вместо -a, -p и -t можно использовать, соответственно, -all,"
+
+#~ msgid "respectively."
+#~ msgstr "-path и -type."
+
+#~ msgid "Ulimit provides control over the resources available to processes"
+#~ msgstr "ulimit позволяет управлять ресурсами, доступными запущенным"
+
+#~ msgid "started by the shell, on systems that allow such control. If an"
+#~ msgstr "оболочкой процессам (на системах, допускающих такое управление)."
+
+#~ msgid "option is given, it is interpreted as follows:"
+#~ msgstr "Параметры интерпретируются следующим образом:"
+
+#~ msgid " -S\tuse the `soft' resource limit"
+#~ msgstr " -S\tиспользовать `мягкое' ограничение ресурсов"
+
+#~ msgid " -H\tuse the `hard' resource limit"
+#~ msgstr " -H\tиспользовать `жёсткое' ограничение ресурсов"
+
+#~ msgid " -a\tall current limits are reported"
+#~ msgstr " -a\tвывести информацию о всех текущих ограничениях"
+
+#~ msgid " -c\tthe maximum size of core files created"
+#~ msgstr " -c\tмаксимальный размер создаваемых файлов слепков памяти"
+
+#~ msgid " -d\tthe maximum size of a process's data segment"
+#~ msgstr " -d\tмаксимальный размер сегмента данных процесса"
+
+#~ msgid " -m\tthe maximum resident set size"
+#~ msgstr " -m\tмаксимальный размер резидентной части процесса"
+
+#~ msgid " -s\tthe maximum stack size"
+#~ msgstr " -s\tмаксимальный размер стека"
+
+#~ msgid " -t\tthe maximum amount of cpu time in seconds"
+#~ msgstr " -t\tмаксимальное процессорное время (в секундах)"
+
+#~ msgid " -f\tthe maximum size of files created by the shell"
+#~ msgstr " -f\tмаксимальный размер создаваемых оболочкой файлов"
+
+#~ msgid " -p\tthe pipe buffer size"
+#~ msgstr " -p\tразмер буфера конвейера"
+
+#~ msgid " -n\tthe maximum number of open file descriptors"
+#~ msgstr " -n\tмаксимальное количество открытых файловых дексрипторов"
+
+#~ msgid " -u\tthe maximum number of user processes"
+#~ msgstr " -u\tмаксимальное число процессов одного пользователя"
+
+#~ msgid " -v\tthe size of virtual memory"
+#~ msgstr " -v\tразмер виртуальной памяти"
+
+#~ msgid "If LIMIT is given, it is the new value of the specified resource."
+#~ msgstr "Если задано ОГРАНИЧЕНИЕ, оно задёт новое значение для указанного ресурса."
+
+#~ msgid "Otherwise, the current value of the specified resource is printed."
+#~ msgstr "В противном случае выводится текущее значение для указанного ресурса."
+
+#~ msgid "If no option is given, then -f is assumed. Values are in 1k"
+#~ msgstr "Если параметры не заданы, предполагается, что задано -f. Значения"
+
+#~ msgid "increments, except for -t, which is in seconds, -p, which is in"
+#~ msgstr "измеряются в КБ, кроме -t, измеряемого в секундах, -p, единица измерения"
+
+#~ msgid "increments of 512 bytes, and -u, which is an unscaled number of"
+#~ msgstr "которого -- 512 байтов, и -u, задающего безразмерное число"
+
+#~ msgid "processes."
+#~ msgstr "процессов."
+
+#~ msgid "The user file-creation mask is set to MODE. If MODE is omitted, or if"
+#~ msgstr "Устанавливает маску создания пользователем файлов в РЕЖИМ. Если опущен"
+
+#~ msgid "`-S' is supplied, the current value of the mask is printed. The `-S'"
+#~ msgstr "РЕЖИМ или задан параметр -S выводится текущее значение маски. Параметр"
+
+#~ msgid "option makes the output symbolic; otherwise an octal number is output."
+#~ msgstr "-S делает вывод символическим, в противном случае используется"
+
+#~ msgid "If MODE begins with a digit, it is interpreted as an octal number,"
+#~ msgstr "восьмеричое число. Если РЕЖИм начинается с цифры, он интерпретируется"
+
+#~ msgid "otherwise it is a symbolic mode string like that accepted by chmod(1)."
+#~ msgstr "как восьмеричное число, в противном случае как строка, принимаемая chmod(1)."
+
+#~ msgid "Wait for the specified process and report its termination status. If"
+#~ msgstr "Подождать завершения указанного процесса и сообщить код завершения. Если"
+
+#~ msgid "N is not given, all currently active child processes are waited for,"
+#~ msgstr "N не задано, ожидается завершение работы всех активных дочерних процессов"
+
+#~ msgid "and the return code is zero. N may be a process ID or a job"
+#~ msgstr "и код возврата равен 0. N может быть идентификатором процесса"
+
+#~ msgid "specification; if a job spec is given, all processes in the job's"
+#~ msgstr "или спецификацией задачи, если задана спецификация задачи, ожидается"
+
+#~ msgid "pipeline are waited for."
+#~ msgstr "завершение работы всех процессов конвейера задачи."
+
+#~ msgid "and the return code is zero. N is a process ID; if it is not given,"
+#~ msgstr "и код возврата равен 0. N -- идентификатор процесса, если он не задан,"
+
+#~ msgid "all child processes of the shell are waited for."
+#~ msgstr "ожидается завершение работы всех дочерних процессов оболочки."
+
+#~ msgid "The `for' loop executes a sequence of commands for each member in a"
+#~ msgstr "Цикл `for' выполняет последовательность команд для каждого члена"
+
+#~ msgid "list of items. If `in WORDS ...;' is not present, then `in \"$@\"' is"
+#~ msgstr "списка. Если отсутствует `in СЛОВА ...;', предполагается, что задано"
+
+#~ msgid "assumed. For each element in WORDS, NAME is set to that element, and"
+#~ msgstr "`in \"$@\"'. Для каждого из СЛОВ ИМЕНИ присваивается его значение"
+
+#~ msgid "the COMMANDS are executed."
+#~ msgstr "и затем выполняются КОМАНДЫ."
+
+#~ msgid "The WORDS are expanded, generating a list of words. The"
+#~ msgstr "СЛОВА разворачиваются и образуют список слов. Полученный список"
+
+#~ msgid "set of expanded words is printed on the standard error, each"
+#~ msgstr "выводится на стандартный поток ошибок, каждому приписывается спереди"
+
+#~ msgid "preceded by a number. If `in WORDS' is not present, `in \"$@\"'"
+#~ msgstr "число. Если `in СЛОВА' отсутствует, предполагается заданным"
+
+#~ msgid "is assumed. The PS3 prompt is then displayed and a line read"
+#~ msgstr "`in \"$@\"'. Затем выводится приглашение PS3 и со стандартного ввода"
+
+#~ msgid "from the standard input. If the line consists of the number"
+#~ msgstr "считывается строка. Если строка состоит из числа, соответствующего"
+
+#~ msgid "corresponding to one of the displayed words, then NAME is set"
+#~ msgstr "одному из выведенных слов, ИМЯ устанавливается равным этому"
+
+#~ msgid "to that word. If the line is empty, WORDS and the prompt are"
+#~ msgstr "слову. Если строка пуста, слова и приглашение выводятся ещё раз."
+
+#~ msgid "redisplayed. If EOF is read, the command completes. Any other"
+#~ msgstr "Если прочитан символ конца файла, выполнение команды завершается."
+
+#~ msgid "value read causes NAME to be set to null. The line read is saved"
+#~ msgstr "любое другое значение устанавливает ИМЯ в NULL. Прочитанная строка"
+
+#~ msgid "in the variable REPLY. COMMANDS are executed after each selection"
+#~ msgstr "сохраняется в переменной REPLY. После каждого выбора выполняются"
+
+#~ msgid "until a break or return command is executed."
+#~ msgstr "КОМАНДЫ до тех пор, пока не будет выполнена команда break или return."
+
+#~ msgid "Selectively execute COMMANDS based upon WORD matching PATTERN. The"
+#~ msgstr "Выполняет КОМАНДЫ в зависимости от того, какому ШАБЛОНУ соответствует"
+
+#~ msgid "`|' is used to separate multiple patterns."
+#~ msgstr "СЛОВО. Для разделения нескольких допустимых шаблонов используется `|'."
+
+#~ msgid "The if COMMANDS are executed. If the exit status is zero, then the then"
+#~ msgstr "Выполняются КОМАНДЫ, заданные в if. Если код возврата нулевой, выполняются"
+
+#~ msgid "COMMANDS are executed. Otherwise, each of the elif COMMANDS are executed"
+#~ msgstr "КОМАНДЫ then, иначе по очереди выполняются КОМАНДЫ elif, и если код"
+
+#~ msgid "in turn, and if the exit status is zero, the corresponding then COMMANDS"
+#~ msgstr "возврата нулевой, выполняются соответствующие КОМАНДЫ then и выполнение"
+
+#~ msgid "are executed and the if command completes. Otherwise, the else COMMANDS"
+#~ msgstr "команды if завершается. В противном случае выполняются КОМАНДЫ else,"
+
+#~ msgid "are executed, if present. The exit status is the exit status of the last"
+#~ msgstr "если они присутствуют. Код возврата равен коду возврата последней"
+
+#~ msgid "command executed, or zero if no condition tested true."
+#~ msgstr "выполненной команды, либо нулю, если ни одно условие не было истинным."
+
+#~ msgid "Expand and execute COMMANDS as long as the final command in the"
+#~ msgstr "Разворачивает и выполняет КОМАНДЫ до тех пор, пока последняя команда"
+
+#~ msgid "`while' COMMANDS has an exit status of zero."
+#~ msgstr "предложения `while' не завершит работу с нулевым кодом возврата."
+
+#~ msgid "`until' COMMANDS has an exit status which is not zero."
+#~ msgstr "предложения `until' не завершит работу с ненулевым кодом возврата."
+
+#~ msgid "Create a simple command invoked by NAME which runs COMMANDS."
+#~ msgstr "Создаёт простую команду, вызываемую по ИМЕНИ и выполняющую КОМАНДЫ."
+
+#~ msgid "Arguments on the command line along with NAME are passed to the"
+#~ msgstr "Аргументы командной строки, переданные ИМЕНИ, передаются в функцию"
+
+#~ msgid "function as $0 .. $n."
+#~ msgstr "как $0 .. $n."
+
+#~ msgid "Run a set of commands in a group. This is one way to redirect an"
+#~ msgstr "Выполняет набор команд. Это один из способов осуществить"
+
+#~ msgid "entire set of commands."
+#~ msgstr "перенаправление для целого набора команд."
+
+#~ msgid "This is similar to the `fg' command. Resume a stopped or background"
+#~ msgstr "Похоже на команду `fg'. Продолжает выполнение остановленной или фоновой"
+
+#~ msgid "job. If you specifiy DIGITS, then that job is used. If you specify"
+#~ msgstr "задачи. Если заданы ЦИФРЫ, использяется задача с этим номером, а если"
+
+#~ msgid "WORD, then the job whose name begins with WORD is used. Following the"
+#~ msgstr "СЛОВО -- задача, имя которой начинается с этого слова. Завершение"
+
+#~ msgid "job specification with a `&' places the job in the background."
+#~ msgstr "спецификации задачи символом & переводит задачу в фоновый режим."
+
+#~ msgid "BASH_VERSION The version numbers of this Bash."
+#~ msgstr "BASH_VERSION Номер версии Bash."
+
+#~ msgid "CDPATH A colon separated list of directories to search"
+#~ msgstr "CDPATH Разделённый запятыми список каталогов, где ищется"
+
+#~ msgid "\t\twhen the argument to `cd' is not found in the current"
+#~ msgstr "\t\tаргумент команды `cd', если он не найден в текущем"
+
+#~ msgid "\t\tdirectory."
+#~ msgstr "\t\tкаталоге."
+
+#~ msgid "HISTFILE The name of the file where your command history is stored."
+#~ msgstr "HISTFILE Имя файла, где сохраняется история команд."
+
+#~ msgid "HISTFILESIZE The maximum number of lines this file can contain."
+#~ msgstr "HISTFILESIZE Максимальное число строк в этом файле."
+
+#~ msgid "HISTSIZE The maximum number of history lines that a running"
+#~ msgstr "HISTSIZE Максимальное число строк истории команд, к которым"
+
+#~ msgid "\t\tshell can access."
+#~ msgstr "\t\tимеет доступ оболочка."
+
+#~ msgid "HOME The complete pathname to your login directory."
+#~ msgstr "HOME Полный путь к домашнему каталогу."
+
+#~ msgid "HOSTTYPE The type of CPU this version of Bash is running under."
+#~ msgstr "HOSTTYPE Тип процессора, на котором работает эта версия Bash."
+
+#~ msgid "IGNOREEOF Controls the action of the shell on receipt of an EOF"
+#~ msgstr "IGNOREEOF Управляет действиями, совершаемыми оболочкой при вводе"
+
+#~ msgid "\t\tcharacter as the sole input. If set, then the value"
+#~ msgstr "\t\tсимвола конца файла. Если установлена, её значение -- число"
+
+#~ msgid "\t\tof it is the number of EOF characters that can be seen"
+#~ msgstr "\t\tсимволов конца файла, которые могут быть встречены подряд,"
+
+#~ msgid "\t\tin a row on an empty line before the shell will exit"
+#~ msgstr "\t\tв пустой строке, после чего оболочка завершит работу"
+
+#~ msgid "\t\t(default 10). When unset, EOF signifies the end of input."
+#~ msgstr "\t\t(по умолчанию 10). Если не установлена, EOF обозначает конец ввода."
+
+#~ msgid "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+#~ msgstr "MAILCHECK\tКак часто, в секундах, Bash проверяет наличие новой почты."
+
+#~ msgid "MAILPATH\tA colon-separated list of filenames which Bash checks"
+#~ msgstr "MAILPATH\tРазделённый запятыми список имён файлов, где Bash"
+
+#~ msgid "\t\tfor new mail."
+#~ msgstr "\t\tпроверяет наличие новой почты."
+
+#~ msgid "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+#~ msgstr "OSTYPE\t\tВерсия Unix, под которой работает эта версия Bash."
+
+#~ msgid "PATH A colon-separated list of directories to search when"
+#~ msgstr "PATH Разделённый запятыми список каталогов, где ищутся"
+
+#~ msgid "\t\tlooking for commands."
+#~ msgstr "\t\tкоманды."
+
+#~ msgid "PROMPT_COMMAND A command to be executed before the printing of each"
+#~ msgstr "PROMPT_COMMAND Команда, выполняемая перед выводом каждого"
+
+#~ msgid "\t\tprimary prompt."
+#~ msgstr "\t\tпервичного приглашения."
+
+#~ msgid "PS1 The primary prompt string."
+#~ msgstr "PS1 Строка первичного приглашения."
+
+#~ msgid "PS2 The secondary prompt string."
+#~ msgstr "PS2 Строка вторичного приглашения."
+
+#~ msgid "TERM The name of the current terminal type."
+#~ msgstr "TERM Имя типа текущего терминала."
+
+#~ msgid "auto_resume Non-null means a command word appearing on a line by"
+#~ msgstr "auto_resume Ненулевые значения слов команд, встречающиеся в строке"
+
+#~ msgid "\t\titself is first looked for in the list of currently"
+#~ msgstr "\t\tотдельно, сначала ищутся в списке остановленных"
+
+#~ msgid "\t\tstopped jobs. If found there, that job is foregrounded."
+#~ msgstr "\t\tв данный момент задач. Если найдено, задача активируется."
+
+#~ msgid "\t\tA value of `exact' means that the command word must"
+#~ msgstr "\t\t`exact' значит, что команда должна в точности"
+
+#~ msgid "\t\texactly match a command in the list of stopped jobs. A"
+#~ msgstr "\t\tсоответствовать команде в списке остановленных задач."
+
+#~ msgid "\t\tvalue of `substring' means that the command word must"
+#~ msgstr "\t\t`substring' значит, что команда должна быть подстрокой"
+
+#~ msgid "\t\tmatch a substring of the job. Any other value means that"
+#~ msgstr "\t\tзадачи. Любые другие значения означают, что"
+
+#~ msgid "\t\tthe command must be a prefix of a stopped job."
+#~ msgstr "\t\tкоманда должна быть префиксом остановленной задачи."
+
+#~ msgid "command_oriented_history"
+#~ msgstr "command_oriented_history"
+
+#~ msgid " Non-null means to save multiple-line commands together on"
+#~ msgstr " Ненулевое значение означает, что многострочные команды"
+
+#~ msgid " a single history line."
+#~ msgstr " будут сохраняться в одной строке истории."
+
+#~ msgid "histchars Characters controlling history expansion and quick"
+#~ msgstr "histchars Управляющие символы расширения истории и быстрой"
+
+#~ msgid "\t\tsubstitution. The first character is the history"
+#~ msgstr "\t\tподстановки. Первый символ -- символ подстановки"
+
+#~ msgid "\t\tsubstitution character, usually `!'. The second is"
+#~ msgstr "\t\tистории, обычно `!'. Второй -- символ `быстрой"
+
+#~ msgid "\t\tthe `quick substitution' character, usually `^'. The"
+#~ msgstr "\t\tподстановки', обычно `^'. Третий -- символ `комментария"
+
+#~ msgid "\t\tthird is the `history comment' character, usually `#'."
+#~ msgstr "\t\tистории', обычно `#'."
+
+#~ msgid "HISTCONTROL\tSet to a value of `ignorespace', it means don't enter"
+#~ msgstr "HISTCONTROL\tЕсли равен `ignorespace', это означает, что строки,"
+
+#~ msgid "\t\tlines which begin with a space or tab on the history"
+#~ msgstr "\t\tначинающиеся с пробела или знака табуляции, не попадают"
+
+#~ msgid "\t\tlist. Set to a value of `ignoredups', it means don't"
+#~ msgstr "\t\tв историю. `ignoredups' означает, что строки, сопадающие"
+
+#~ msgid "\t\tenter lines which match the last entered line. Set to"
+#~ msgstr "\t\tс предыдущей, не попадают в историю. `ignoreboth' --"
+
+#~ msgid "\t\t`ignoreboth' means to combine the two options. Unset,"
+#~ msgstr "\t\tодновременное действие обоих параметров. Если не"
+
+#~ msgid "\t\tor set to any other value than those above means to save"
+#~ msgstr "\t\tустановлено, или равно другому значению, то в историю"
+
+#~ msgid "\t\tall lines on the history list."
+#~ msgstr "\t\tкоманд попадают все строки."
+
+#~ msgid "Adds a directory to the top of the directory stack, or rotates"
+#~ msgstr "Помещает каталог на вершину стека каталогов или вращает"
+
+#~ msgid "the stack, making the new top of the stack the current working"
+#~ msgstr "стек так, чтобы на вершине находился текущий каталог. Без"
+
+#~ msgid "directory. With no arguments, exchanges the top two directories."
+#~ msgstr "аргументов меняет местами два верхних каталога."
+
+#~ msgid "+N\tRotates the stack so that the Nth directory (counting"
+#~ msgstr "+N\tВращает стек так, чтобы N-й каталог (считая с левой стороны "
+
+#~ msgid "\tfrom the left of the list shown by `dirs') is at the top."
+#~ msgstr "\tсписка, выводимого `dirs') оказался на вершине стека."
+
+#~ msgid "-N\tRotates the stack so that the Nth directory (counting"
+#~ msgstr "-N\tВращает стек так, чтобы N-й каталог (считая с правой"
+
+#~ msgid "\tfrom the right) is at the top."
+#~ msgstr "\tстороны) оказался на вершине стека."
+
+#~ msgid "-n\tsuppress the normal change of directory when adding directories"
+#~ msgstr "-n\tподавляет обычную смену каталога при добавлении каталога"
+
+#~ msgid "\tto the stack, so only the stack is manipulated."
+#~ msgstr "\tв стек, так что меняется только содержимое стека."
+
+#~ msgid "dir\tadds DIR to the directory stack at the top, making it the"
+#~ msgstr "dir\tпомещает DIR на вершину стека и делает его новым"
+
+#~ msgid "You can see the directory stack with the `dirs' command."
+#~ msgstr "Просматривать стек каталогов можно командой `dirs'."
+
+#~ msgid "Removes entries from the directory stack. With no arguments,"
+#~ msgstr "Удаляет значения из стека каталогов. Без аргументов"
+
+#~ msgid "removes the top directory from the stack, and cd's to the new"
+#~ msgstr "удаляет из стека каталог на вершине и делает рабочим каталог,"
+
+#~ msgid "+N\tremoves the Nth entry counting from the left of the list"
+#~ msgstr "+N\tудаляет N-й каталог, считая с левой стороны списка,"
+
+#~ msgid "\tshown by `dirs', starting with zero. For example: `popd +0'"
+#~ msgstr "\tвыводимого `dirs', начиная с нуля. Например, `popd +0'"
+
+#~ msgid "\tremoves the first directory, `popd +1' the second."
+#~ msgstr "\tудаляет первый каталог, `popd +1' -- второй."
+
+#~ msgid "-N\tremoves the Nth entry counting from the right of the list"
+#~ msgstr "-N\tудаляет N-й каталог, считая с правой стороны списка,"
+
+#~ msgid "\tshown by `dirs', starting with zero. For example: `popd -0'"
+#~ msgstr "\tвыводимого `dirs', начиная с нуля. Например, `popd -0'"
+
+#~ msgid "\tremoves the last directory, `popd -1' the next to last."
+#~ msgstr "\tудаляет последний каталог, `popd -1' -- предпоследний."
+
+#~ msgid "-n\tsuppress the normal change of directory when removing directories"
+#~ msgstr "-n\tподавляет обычную смену каталога при удалении каталогов из"
+
+#~ msgid "\tfrom the stack, so only the stack is manipulated."
+#~ msgstr "\tстека, так что меняется только содержимое стека."
+
+#~ msgid "Display the list of currently remembered directories. Directories"
+#~ msgstr "Выводит список запомненных на данный момент каталогов. Каталоги"
+
+#~ msgid "find their way onto the list with the `pushd' command; you can get"
+#~ msgstr "попадают в список при использовании команды `pushd', вы можете забрать"
+
+#~ msgid "back up through the list with the `popd' command."
+#~ msgstr "их из списка командой `popd'."
+
+#~ msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+#~ msgstr "Флаг -l указывает, что `dirs' не должна выводит сокращённые варианты"
+
+#~ msgid "of directories which are relative to your home directory. This means"
+#~ msgstr "каталогов, заданных относительно домашнего. Это означает, что"
+
+#~ msgid "that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag"
+#~ msgstr "`~/bin' будет отображаться как `/homes/bfox/bin'. Флаг -v"
+
+#~ msgid "causes `dirs' to print the directory stack with one entry per line,"
+#~ msgstr "заставляет `dirs' выводить каталоги по одному в строке, предваряя"
+
+#~ msgid "prepending the directory name with its position in the stack. The -p"
+#~ msgstr "имя каталога номером его позиции в стеке. Флаг -p делает то же самое,"
+
+#~ msgid "flag does the same thing, but the stack position is not prepended."
+#~ msgstr "но не добавляются номера позиций. Флаг -c очищает стек каталогов,"
+
+#~ msgid "The -c flag clears the directory stack by deleting all of the elements."
+#~ msgstr "удаляя все его элементы."
+
+#~ msgid "+N\tdisplays the Nth entry counting from the left of the list shown by"
+#~ msgstr "+N\tвыводит N-й каталог, считая с левой стороны списка, выводимого"
+
+#~ msgid "\tdirs when invoked without options, starting with zero."
+#~ msgstr "\tdirs при вызове без параметров, начиная с нуля."
+
+#~ msgid "-N\tdisplays the Nth entry counting from the right of the list shown by"
+#~ msgstr "-N\tвыводит N-й каталог, считая с правой стороны списка, выводимого"
+
+#~ msgid "Toggle the values of variables controlling optional behavior."
+#~ msgstr "Меняет значение переменных, управляющих поведением оболочки."
+
+#~ msgid "The -s flag means to enable (set) each OPTNAME; the -u flag"
+#~ msgstr "Флаг -s означает включить (установить) каждое ИМЯ_ПАРАМЕТРА,"
+
+#~ msgid "unsets each OPTNAME. The -q flag suppresses output; the exit"
+#~ msgstr "флаг -u сбрасывает. Флаг -q подавляет вывод, установлен или"
+
+#~ msgid "status indicates whether each OPTNAME is set or unset. The -o"
+#~ msgstr "сброшен параметр определяется по коду возврата. Параметр -o"
+
+#~ msgid "option restricts the OPTNAMEs to those defined for use with"
+#~ msgstr "ограничивает работу параметрами, определёнными с помощью"
+
+#~ msgid "`set -o'. With no options, or with the -p option, a list of all"
+#~ msgstr "`set -o'. Без параметров или при заданном параметре -p, выводится"
+
+#~ msgid "settable options is displayed, with an indication of whether or"
+#~ msgstr "список всех установленных параметров и информация, установлены"
+
+#~ msgid "not each is set."
+#~ msgstr "они или нет."
shell_initialize ()
{
char hostname[256];
+ int should_be_restricted;
/* Line buffer output for stderr and stdout. */
if (shell_initialized == 0)
/* Initialize our interface to the tilde expander. */
tilde_initialize ();
+#if defined (RESTRICTED_SHELL)
+ should_be_restricted = shell_is_restricted (shell_name);
+#endif
+
/* Initialize internal and environment variables. Don't import shell
functions from the environment if we are running in privileged or
restricted mode or if the shell is running setuid. */
#if defined (RESTRICTED_SHELL)
- initialize_shell_variables (shell_environment, privileged_mode||restricted||running_setuid);
+ initialize_shell_variables (shell_environment, privileged_mode||restricted||should_be_restricted||running_setuid);
#else
initialize_shell_variables (shell_environment, privileged_mode||running_setuid);
#endif
running in privileged or restricted mode or if the shell is running
setuid. */
#if defined (RESTRICTED_SHELL)
- initialize_shell_options (privileged_mode||restricted||running_setuid);
- initialize_bashopts (privileged_mode||restricted||running_setuid);
+ initialize_shell_options (privileged_mode||restricted||should_be_restricted||running_setuid);
+ initialize_bashopts (privileged_mode||restricted||should_be_restricted||running_setuid);
#else
initialize_shell_options (privileged_mode||running_setuid);
initialize_bashopts (privileged_mode||running_setuid);
-BUILD_DIR=/usr/local/build/bash/bash-current
+BUILD_DIR=/usr/local/build/chet/bash/bash-current
THIS_SH=$BUILD_DIR/bash
PATH=$PATH:$BUILD_DIR
./exportfunc.tests: eval: line 30: syntax error: unexpected end of file
./exportfunc.tests: line 30: cve7169-bad2: No such file or directory
./exportfunc1.sub: line 1: maximum here-document count exceeded
-/usr/local/build/bash/bash-current/bash: warning: here-document at line 0 delimited by end-of-file (wanted `a')
./exportfunc.tests: line 51: HELLO_WORLD: No such file or directory
eval ok
./exportfunc3.sub: line 10: export: foo=bar: cannot export
status: 1
equals-1
-/usr/local/build/bash/bash-current/bash: foo=bar: command not found
bad echo
./exportfunc3.sub: line 23: export: /bin/echo: cannot export
bar
env BASH_FUNC_foo%%="() { 000(){>0;}&000(){ 0;}<<0 0" ${THIS_SH} -c foo 2>/dev/null
env BASH_FUNC_foo%%="() { 000(){>0;}&000(){ 0;}<<`perl -e '{print "A"x100000}'` 0" ${THIS_SH} -c foo 2>/dev/null
-${THIS_SH} -c "f(){ x(){ _;}; x(){ _;}<<a;}"
+${THIS_SH} -c "f(){ x(){ _;}; x(){ _;}<<a;}" 2>/dev/null
# CVE-2014-6278
foo\=bar
printenv | grep 'foo=bar'
-${THIS_SH} -c 'foo\=bar'
+${THIS_SH} -c 'foo\=bar 2>/dev/null'
function /bin/echo
{
--- /dev/null
+:; ./shx
+
+sh:
+<&$fd ok
+nlbq Mon Aug 3 02:45:00 EDT 1992
+bang geoff
+quote 712824302
+setbq defmsgid=<1992Aug3.024502.6176@host>
+bgwait sleep done... wait 6187
+
+
+bash:
+<&$fd ok
+nlbq Mon Aug 3 02:45:09 EDT 1992
+bang geoff
+quote 712824311
+setbq defmsgid=<1992Aug3.024512.6212@host>
+bgwait sleep done... wait 6223
+
+
+ash:
+<&$fd shx1: 4: Syntax error: Bad fd number
+nlbq Mon Aug 3 02:45:19 EDT 1992
+bang geoff
+quote getdate: `"now"' not a valid date
+
+setbq defmsgid=<1992Aug3.` echo 024521
+bgwait sleep done... wait 6241
+
+
+ksh:
+<&$fd ok
+nlbq ./shx: 6248 Memory fault - core dumped
+bang geoff
+quote getdate: `"now"' not a valid date
+
+setbq defmsgid=<1992Aug3.024530.6257@host>
+bgwait no such job: 6265
+wait 6265
+sleep done...
+
+zsh:
+<&$fd ok
+nlbq Mon Aug 3 02:45:36 EDT 1992
+bang shx3: event not found: /s/ [4]
+quote 712824337
+setbq defmsgid=<..6290@host>
+bgwait shx7: unmatched " [9]
+sleep done...
+:;
--- /dev/null
+#! /bin/sh
+for cmd in sh bash ash ksh zsh
+do
+ echo
+ echo $cmd:
+ for demo in shx?
+ do
+ $cmd $demo
+ done
+done