From d36d2bcf27d5f8279a1b07c95c72ca253335bae0 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Tue, 21 Oct 2014 12:06:34 -0400 Subject: [PATCH] commit bash-20141010 snapshot --- CWRU/CWRU.chlog | 26 + CWRU/CWRU.chlog~ | 6951 +++++++++++++++++++++++++++ CWRU/POSIX.NOTES.old | 82 + CWRU/old/set.def.save | 544 +++ CWRU/save/unwind_prot.h.save | 50 + builtins/setattr.def | 6 + cross-build/cygwin32.cache.old | 42 + doc/FAQ.orig | 1745 +++++++ doc/aosa-bash.pdf.old | Bin 0 -> 153472 bytes doc/bash.1 | 13 +- doc/bashref.texi | 8 +- doc/version.texi | 6 +- examples/loadables/Makefile.in.save | 238 + execute_cmd.c | 3 + execute_cmd.c~ | 5544 +++++++++++++++++++++ lib/readline/doc/Makefile.old | 76 + parse.y | 2 +- patchlevel.h | 2 +- po/ru.po | 4848 +++++++++++++++---- shell.c | 11 +- tests/RUN-ONE-TEST | 2 +- tests/exportfunc.right | 2 - tests/exportfunc.tests | 2 +- tests/exportfunc3.sub | 2 +- tests/misc/regress/log.orig | 50 + tests/misc/regress/shx.orig | 10 + 26 files changed, 19394 insertions(+), 871 deletions(-) create mode 100644 CWRU/CWRU.chlog~ create mode 100644 CWRU/POSIX.NOTES.old create mode 100644 CWRU/old/set.def.save create mode 100644 CWRU/save/unwind_prot.h.save create mode 100644 cross-build/cygwin32.cache.old create mode 100644 doc/FAQ.orig create mode 100644 doc/aosa-bash.pdf.old create mode 100644 examples/loadables/Makefile.in.save create mode 100644 execute_cmd.c~ create mode 100644 lib/readline/doc/Makefile.old create mode 100644 tests/misc/regress/log.orig create mode 100644 tests/misc/regress/shx.orig diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index a197a0e6..012aeae6 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -6931,3 +6931,29 @@ 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 + + 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 + + 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 diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~ new file mode 100644 index 00000000..84755708 --- /dev/null +++ b/CWRU/CWRU.chlog~ @@ -0,0 +1,6951 @@ + 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 + + 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 + +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 + + +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 + +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 + + + 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 + +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 + +support/shobj-conf + - add a stanza for nsk on the Tandem from Joachim Schmitz + + +{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 + + + 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 + + 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 + +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 + and Matthias Klose + +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 + - 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 + - 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 + - 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 + +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 + + 3/4 + --- +lib/readline/bind.c + - add a missing free of `names' in rl_function_dumper. Bug report + and fix from Michael Snyder + + 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 + + 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 , bug report originally + from Oleg Nesterov + + 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 + +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 + + 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 + - 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 + + 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 + + 3/26 + ---- +lib/readline/rltypedefs.h + - remove old Function/VFunction/CPFunction/CPPFunction typedefs as + suggested by Tom Tromey + +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 + + + 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 + +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 + + 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 + +lib/readline/display.c + - include 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 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 + + 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 + + 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 + +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 + + 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 + + 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 + + + 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." + + 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 + + + 5/2 + --- +doc/{bash.1,bashref.texi} + - add forward reference to `Pattern Matching' from `Pathname + Expansion', suggested by Greg Wooledge + + 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 \ 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 + + 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 + + 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 + + 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 + + 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 + + 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 + +builtins/help.def + - help_builtin: change strncmp to strcmp so that `help read' no longer + matches `readonly'. Suggested by Clark Wang + +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 + +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 + + + 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 + + +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 + + + 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 + + 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 + + +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 + + +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 + + + 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 + +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 + + + 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 + +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 + +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 + +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 + + + 6/30 + ---- +execute_cmd.c + - execute_pipeline: make sure the lastpipe code is protected by + #ifdef JOB_CONTROL. Fixes problem reported by Thomas Cort + + + 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 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 + + 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 + - _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 + + +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 + + 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 + + +builtins/printf.def + - getint: if garglist == 0, return whatever getintmax returns (0). + Fixes bug reported by Ralph Coredroy + + 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 + + 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 + + + 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 . + 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 + -- 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 + +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 + + 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 + + + 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 + + 9/19 + ---- +expr.c + - exppower: replace the simple exponentiation algorithm with an + implementation of exponentiation by squaring. Inspired by report + from Nicolas ARGYROU + +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 + +doc/{bash.1,bashref.texi},lib/readline/doc/{hsuser,rluser}.texi + - minor editorial changes inspired by suggestions from + Roger Zauner + + 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 + + - 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 + + 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 + + - 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 and Patrick Pfeifer + + - 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 + +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 + +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 + + 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 + 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 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 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 + + 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 + + + 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 + + 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 + + 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 + - 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 + + 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 + + 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 + + +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 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 + + +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 + + 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 + +builtins/read.def + - skip over NUL bytes in input, as most modern shells seem to. Bug + report by Matthew Story + +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 + + +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 + 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 + - 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 + + - 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 + - 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 + + + 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 + - 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 + + + 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 + + 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 + + + 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 + +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 + - 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 + + +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 + + 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 + + + 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 + - 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 + + +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 + + 1/18 + ---- + +{configure,config.h}.in + - new check: check for AUDIT_USER_TTY defined in , + 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 + + 1/21 + ---- + +lib/readline/readline.c: + - _rl_dispatch_subseq: add an inter-character timeout for multi-char + key sequences. Suggested by . 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 + + + 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 + + +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 + + 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 + + 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 + - _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 + + + 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 + +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 + + +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 + + +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 + + 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 + +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 + - 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 + + 2/21 + ---- +doc/{bash,builtins}.1 + - minor changes from Bjarni Ingi Gislason + +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 + + 2/22 + ---- +lib/sh/shquote.c + - sh_backslash_quote: quote tilde in places where it would be + expanded. From a report from John Kearney + + 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 + + 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 + - u32toutf16: function to convert unsigned 32-bit value (unicode) to + UTF-16. From John Kearney + - 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 + - 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 + + 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 + +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 + + 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 + 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 + + - 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 + +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 + + +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 + +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 + + 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 + + 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 + ; this prompted by report from Barry Downes + + +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 + + + 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 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 + + 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 + - 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 + + 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 , + fix from Andreas Schwab + +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 + + 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 + - 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 + +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 + + 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 + + 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 and + supplemented by Dan Douglas + +doc/{bash.1,bashref.texi} + - changes to the description of substring expansion inspired by + suggestions from Bill Gradwohl + +doc/bashref.texi + - added substring expansion examples inspired by suggestions from + Bill Gradwohl + +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 . Fix from + John E. Malmberg + + 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 + + + 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 + + - 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" + + 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 + +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 + + 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 + + + 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 + + 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 + + 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 + , fix from Andreas Schwab + - 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 + + 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 + + 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 , fix from + Andreas Schwab + - 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 + +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 + + 7/24 + ---- +configure.in + - interix: define RECYCLES_PIDS. Based on a report from Michael + Haubenwallner + + 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 + + +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 + +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 + + + 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 + +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 + + +{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 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 + + 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 + + +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 + + 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 + + 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 + +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 + + 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 + +doc/bashref.texi + - some small formatting changes from Karl Berry + + 8/27 + ---- +lib/readline/doc/{history,rlman,rluserman}.texi + - some small formatting changes from Karl Berry + +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 + and Chris F. A. Johnson + +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 + +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} + +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 and most recently by Jordan Michael + Ziegler + +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 + + + 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 + + 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 + +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 + +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 + + 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 + + 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 + +configure.ac + - HP NonStop (*-nsk*): compile --without-bash-malloc. Change from + Joachim Schmitz + + 9/16 + ---- +subst.c,execute_cmd.c,lib/glob/sm_loop.c,lib/sh/shquote.c + - minor code cleanups from Joachim Schmitz + +lib/readline/colors.h + - workaround for HP NonStop compiler issue with from + Joachim Schmitz + + 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 + +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 + + 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 + Nguyn Thái Ngc Duy + + 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 + + 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 + - 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 + + 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 + + +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 + - 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 + + 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 + +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 + - 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 + +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 + +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 + +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 + +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 + + 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 + + +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 + + + 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 + +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 + + 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 + + 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 + + + 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 + + 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 + +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 + + 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 + + 12/13 + ----- +execute_cmd.c + - execute_coproc: handle the command's exit status being inverted + (an oversight). Fixes bug reported by DJ Mills + and Andreas Schwab + + 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 + + +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 + +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 + +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 + +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 + + 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 + + - 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 , 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 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 + + - 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 + + 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 and Dan Douglas + +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 + + + 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 + + + 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 + + +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 + + 1/15 + ---- +builtins/cd.def + - cd_builtin: make sure call to internal_getopt handles -e option. + Fixes bug reported by + + 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 + + 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 [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 + + +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 + + 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 + ; 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 + + + 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 + + 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 + + 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 + +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 + +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 + + 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 + + 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" + + + 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 + + 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 + + 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 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 + - 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 + + 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 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 + + 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 + +[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 + + 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 + + + 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 + +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 + + + 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 + + 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 + +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 + +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 + + 4/13 + ---- +subst.c + - process_substitute: run the EXIT trap before exiting, as other + shells seem to. Fixes problem pointed out by Dan Douglas + + +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 + + 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 + +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 + - 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 + +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 + + 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 + + 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 + +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 + +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 + + 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 + + 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 + + +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 + +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 + + 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 + + 7/13 + ---- +doc/{bash.1,bashref.texi} + - slight change to add a description of `shopt -o' suggested by Bruce + Korb + + 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 + +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 + + 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 + + 8/3 + --- +Makefile.in + - pcomplete.o: add dependency on $(DEFDIR)/builtext.h. Suggested by + Curtis Doty + + 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 + + + 8/6 + --- +doc/{bash.1,bashref.texi},builtins/hash.def,lib/readline/doc/rluser.texi + - minor typo changes from Geir Hauge + +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 + + 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 + + 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 + + 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 + + + 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 + +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 + +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 + + +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 + + 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 + + + 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 + +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 + + + 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 + +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 + +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 + + +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 + + 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 + + + 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 + + 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 + +support/shobj-conf + - add support for Darwin 13 (Mac OS X 10.9, Mavericks). Based on a + report by Ludwig Schwardt + + 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 + + + 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 + + 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 + + + 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 + + 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 + - 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 + + +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 + + 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 + - 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 + +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 + + +Makefile.in + - install: make sure to use $(DESTDIR) when installing OTHER_DOCS. + Report and fix from Matthias Klose + +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 + + 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 + +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 + + 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 + + 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 + + 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 + +Makefile.in + - variables.o: add dependency on builtins/builtext.h; helps with + parallel builds. Report from Linda Walsh + +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 + + + 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 + + 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 + +general.c + - include trap.h for any_signals_trapped() prototype + +lib/sh/unicode.c + - include 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 + + - 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 + + 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 + +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 + + 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 + + 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 + + + 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 + +[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 + + 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 + + 2/26 + ---- +[bash-4.3 released] + + 2/27 + ---- +aclocal.m4 + - broken wcwidth check: fix typo reported by David Michael + + + 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 + +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 + + 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 + + 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 + +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 + +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 + + + 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 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 + + 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. + +doc/bash.1 + - shell-kill-word and shell-backward-kill-word should be documented + as unbound by default. Report from Oliver Hartley + + +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 + + 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 + + + 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 + + +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 + + - 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 + + 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 + - 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 + 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 + + 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 + + + 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 + - {save,restore}_parser_state: save and restore need_here_doc flag. + Rest of fix for bug reported by Jared Yanovich + + 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 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 + 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 + + 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 + + + 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 + + + 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 + - 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 + +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 + + 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 + + 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 + + + 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 + + +arrayfunc.c + - bind_array_var_internal: make sure ENTRY no longer has invisible + attribute before returning. Fixes bug reported by Geir Hauge + + + 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 + + 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 + + + 6/16 + ---- +builtins/shopt.def + - compat42: make sure the `compat42' option sets the correct variable + for compatibility level. Fixes bug reported by Ondrej Oprala + + +support/bashbug.sh + - fix typo when echoing $USAGE. Report from Shantanu Kulkarni + + +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 + + 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 + +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 + +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 + - 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 + + +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 + + +subst.c + - command_substitute: other shells do not appear to inherit the -v + option when reading and executing command substitutions. Reported + by Ondrej Oprala + + 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 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 + - {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 + + - 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 + + 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 + + + 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 + + 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 + + +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 + + +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 + +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 + + 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 + + +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 + + 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 + + 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 + + + 9/3 + --- +execute_cmd.c + - evalnest_max,sourcenest_max: initialize from EVALNEST_MAX and + SOURCENEST_MAX, respectively. Feature suggested by + + +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 + + +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 + +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 + + 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 + +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 + + 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 + +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 . 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 and Michal Zalewski + . 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 . 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 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 . 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 + 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 + + 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 + + 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 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 + + 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 + + 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 diff --git a/CWRU/POSIX.NOTES.old b/CWRU/POSIX.NOTES.old new file mode 100644 index 00000000..1707ab10 --- /dev/null +++ b/CWRU/POSIX.NOTES.old @@ -0,0 +1,82 @@ +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. diff --git a/CWRU/old/set.def.save b/CWRU/old/set.def.save new file mode 100644 index 00000000..87b78d7c --- /dev/null +++ b/CWRU/old/set.def.save @@ -0,0 +1,544 @@ +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 +#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); +} diff --git a/CWRU/save/unwind_prot.h.save b/CWRU/save/unwind_prot.h.save new file mode 100644 index 00000000..998fd72b --- /dev/null +++ b/CWRU/save/unwind_prot.h.save @@ -0,0 +1,50 @@ +/* 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 */ diff --git a/builtins/setattr.def b/builtins/setattr.def index a2233b10..93e26409 100644 --- a/builtins/setattr.def +++ b/builtins/setattr.def @@ -302,6 +302,12 @@ set_or_show_attributes (list, attribute, nodefs) 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); diff --git a/cross-build/cygwin32.cache.old b/cross-build/cygwin32.cache.old new file mode 100644 index 00000000..640390fb --- /dev/null +++ b/cross-build/cygwin32.cache.old @@ -0,0 +1,42 @@ +# 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 diff --git a/doc/FAQ.orig b/doc/FAQ.orig new file mode 100644 index 00000000..1cff3c8e --- /dev/null +++ b/doc/FAQ.orig @@ -0,0 +1,1745 @@ +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 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 $(, &>, >|, <<<, [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. diff --git a/doc/aosa-bash.pdf.old b/doc/aosa-bash.pdf.old new file mode 100644 index 0000000000000000000000000000000000000000..006a767769451694f5f25a9dfdb18282067d982b GIT binary patch literal 153472 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

t#LjeI_ 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

I(G<`;WSlMQteZ|h!? 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, subshell, temporary_env); /* don't unwind-protect for subshells */ @@ -4584,6 +4585,8 @@ execute_function (var, words, flags, fds_to_close, async, subshell) stop_pipeline (async, (COMMAND *)NULL); #endif + loop_level = 0; + fc = tc; from_return_trap = 0; diff --git a/execute_cmd.c~ b/execute_cmd.c~ new file mode 100644 index 00000000..fdd72f97 --- /dev/null +++ b/execute_cmd.c~ @@ -0,0 +1,5544 @@ +/* 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 . +*/ + +#include "config.h" + +#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX) + #pragma alloca +#endif /* _AIX && RISC6000 && !__GNUC__ */ + +#include +#include "chartypes.h" +#include "bashtypes.h" +#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H) +# include +#endif +#include "filecntl.h" +#include "posixstat.h" +#include +#if defined (HAVE_SYS_PARAM_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "posixtime.h" + +#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE) +# include +#endif + +#if defined (HAVE_SYS_TIMES_H) && defined (HAVE_TIMES) +# include +#endif + +#include + +#if !defined (errno) +extern int errno; +#endif + +#define NEED_FPURGE_DECL + +#include "bashansi.h" +#include "bashintl.h" + +#include "memalloc.h" +#include "shell.h" +#include /* 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 +#include + +#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__ */ + } +} diff --git a/lib/readline/doc/Makefile.old b/lib/readline/doc/Makefile.old new file mode 100644 index 00000000..58d4dd76 --- /dev/null +++ b/lib/readline/doc/Makefile.old @@ -0,0 +1,76 @@ +# 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 diff --git a/parse.y b/parse.y index cf874a9a..dcdca0ac 100644 --- a/parse.y +++ b/parse.y @@ -2544,7 +2544,7 @@ parser_remaining_input () 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); } diff --git a/patchlevel.h b/patchlevel.h index 96c13b39..e5dde524 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -25,6 +25,6 @@ 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_ */ diff --git a/po/ru.po b/po/ru.po index b0ad99bd..6b18f975 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,133 +1,133 @@ -# 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. -# , 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 , 2002. +# Pavel Maryanov , 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 \n" -"Language-Team: Russian \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 \n" +"Language-Team: Russian \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: первый непробельный символ не является «\"»" -#: 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: отсутствует разделитель-двоеточие" #: 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 "" @@ -135,350 +135,349 @@ msgid "" " \n" " Without EXPR, returns " msgstr "" +"Возвращает контекст вызова текущей подпрограммы.\n" +" \n" +" Без EXPR выполняет возврат " #: builtins/cd.def:319 msgid "HOME not set" -msgstr " HOME " +msgstr "Не задана переменная 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 "Не задана переменная 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: использование: " #: 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: это каталог" #: 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 "вызовы\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 @@ -491,135 +490,141 @@ msgid "" "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 "" -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 "" @@ -636,14 +641,30 @@ 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 "" @@ -669,6 +690,27 @@ 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 "" @@ -690,472 +732,488 @@ 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 "последняя команда: %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: неверный интерпретатор" -#: 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 "значение можно присвоить только переменной" #: 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 "отсутствует символ «)»" #: 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 @@ -1163,331 +1221,332 @@ msgid "" "\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:4373 +#, c-format +msgid "unexpected token `%c' in conditional command" +msgstr "неожиданный маркер «%c» в условной команде" + +#: parse.y:4376 +#, c-format +msgid "unexpected token `%s' in conditional command" +msgstr "неожиданный маркер «%s» в условной команде" #: parse.y:4380 #, c-format -msgid "unexpected token `%c' in conditional command" -msgstr "" - -#: parse.y:4383 -#, c-format -msgid "unexpected token `%s' in conditional command" -msgstr "" - -#: parse.y:4387 -#, 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 @@ -1495,806 +1554,776 @@ msgid "" "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: параметр не задан или пустой" #: 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 "ожидается аргумент" #: 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 "отсутствует символ «]»" #: 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 \n" -msgstr "" +msgid "License GPLv3+: GNU GPL version 3 or later \n" +msgstr "Лицензия GPLv3+: GNU GPL версии 3 или более поздней \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 "" @@ -2311,10 +2340,24 @@ 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 "" @@ -2325,6 +2368,12 @@ msgid "" " \n" " Return success unless a NAME is not an existing alias." msgstr "" +"Удаляет каждое имя из списка определённых псевдонимов.\n" +" \n" +" Параметры:\n" +" -a\tудаляет все определения псевдонимов\n" +" \n" +" Возвращает успех, если имя связано с существующим псевдонимом." #: builtins.c:289 msgid "" @@ -2338,24 +2387,20 @@ 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" @@ -2366,6 +2411,41 @@ msgid "" " 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 "" @@ -2377,6 +2457,13 @@ 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 "" @@ -2388,6 +2475,13 @@ 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 "" @@ -2395,13 +2489,21 @@ 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 "" @@ -2418,27 +2520,33 @@ 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" @@ -2449,20 +2557,49 @@ msgid "" " \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 "" @@ -2479,9 +2616,20 @@ 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" @@ -2490,8 +2638,12 @@ msgid "" " Exit Status:\n" " Always succeeds." msgstr "" -" - ; . " -" ." +"Пустая команда.\n" +" \n" +" Команда не выполняет никаких действий и ни на что не влияет.\n" +" \n" +" Состояние выхода:\n" +" Всегда возвращает успех." #: builtins.c:450 msgid "" @@ -2500,23 +2652,29 @@ 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" @@ -2528,6 +2686,20 @@ msgid "" " 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 "" @@ -2560,14 +2732,48 @@ 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 "" @@ -2575,6 +2781,9 @@ msgid "" " \n" " Obsolete. See `help declare'." msgstr "" +"Указание значений переменных и атрибутов.\n" +" \n" +" Устарел. См. «help declare»." #: builtins.c:535 msgid "" @@ -2590,13 +2799,23 @@ 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" @@ -2624,6 +2843,35 @@ msgid "" " 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 "" @@ -2637,6 +2885,15 @@ 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 "" @@ -2664,18 +2921,47 @@ 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 "" @@ -2717,14 +3003,50 @@ 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" @@ -2732,14 +3054,28 @@ msgid "" " -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 "" @@ -2748,29 +3084,34 @@ 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" @@ -2784,9 +3125,31 @@ msgid "" " 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 "" @@ -2799,28 +3162,41 @@ 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" @@ -2837,6 +3213,25 @@ msgid "" " 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 "" @@ -2856,9 +3251,25 @@ 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 "" @@ -2887,12 +3298,40 @@ 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 "" @@ -2903,7 +3342,7 @@ 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" @@ -2917,6 +3356,26 @@ msgid "" " 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 "" @@ -2934,6 +3393,19 @@ 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 "" @@ -2956,6 +3428,24 @@ 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 "" @@ -2964,8 +3454,7 @@ 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" @@ -3001,22 +3490,59 @@ msgid "" " 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" @@ -3028,15 +3554,13 @@ msgid "" " -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" @@ -3046,12 +3570,50 @@ msgid "" " -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 "" @@ -3064,6 +3626,14 @@ 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 "" @@ -3108,8 +3678,7 @@ 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" @@ -3149,6 +3718,86 @@ msgid "" " 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 "" @@ -3162,8 +3811,7 @@ 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" @@ -3171,14 +3819,30 @@ msgid "" " 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" @@ -3190,6 +3854,20 @@ msgid "" " 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 "" @@ -3203,8 +3881,7 @@ 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" @@ -3212,6 +3889,23 @@ msgid "" " Exit Status:\n" " Returns success unless an invalid option is given or NAME is invalid." msgstr "" +"Запрет изменения переменных командного процессора.\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 "" @@ -3223,6 +3917,13 @@ msgid "" " 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 "" @@ -3237,6 +3938,16 @@ 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 "" @@ -3251,6 +3962,16 @@ 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 "" @@ -3286,8 +4007,7 @@ 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" @@ -3308,8 +4028,7 @@ msgid "" " 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" @@ -3317,8 +4036,7 @@ msgid "" " \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" @@ -3334,6 +4052,82 @@ msgid "" " 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 "" @@ -3342,25 +4136,34 @@ 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" @@ -3369,35 +4172,58 @@ msgid "" " 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 or a signal " -"number.\n" +" Each SIGNAL_SPEC is either a signal name in 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 — это название сигнала в или номер сигнала.\n" +" Названия сигналов не зависят от регистра, а префикс SIG не является обязательным. \n" +" Сигнал можно отправить в командный процессор командой \"kill -signal $$\".\n" +" \n" +" Состояние выхода:\n" +" Возвращает успех при условии, что было указан допустимый SIGSPEC или параметр." #: builtins.c:1386 msgid "" @@ -3425,16 +4251,39 @@ 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." +" 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" @@ -3475,6 +4324,48 @@ msgid "" " 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 "" @@ -3493,17 +4384,29 @@ 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" @@ -3513,21 +4416,42 @@ msgid "" " 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 "" @@ -3541,6 +4465,15 @@ 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 "" @@ -3558,6 +4491,19 @@ 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 "" @@ -3578,6 +4524,22 @@ 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 "" @@ -3594,6 +4556,18 @@ 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 "" @@ -3605,27 +4579,41 @@ 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 "" @@ -3637,6 +4625,13 @@ msgid "" " Exit Status:\n" " Returns the status of the last command executed." msgstr "" +"Выполнение команд до тех пор, пока проверка условия возвращает истину.\n" +" \n" +" Разворачивает и выполняет команды до тех пор, пока последняя команда в\n" +" командах «while» завершается с нулевым состоянием.\n" +" \n" +" Состояние выхода:\n" +" Возвращает состояние последней выполненной команды." #: builtins.c:1632 msgid "" @@ -3648,6 +4643,13 @@ msgid "" " Exit Status:\n" " Returns the status of the last command executed." msgstr "" +"Выполнение команд до тех пор, пока проверка условия не возвращает истину.\n" +" \n" +" Разворачивает и выполняет команды до тех пор, пока последняя команда в\n" +" командах «until» завершается с ненулевым состоянием.\n" +" \n" +" Состояние выхода:\n" +" Возвращает состояние последней выполненной команды." #: builtins.c:1644 msgid "" @@ -3661,20 +4663,37 @@ 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 "" @@ -3686,6 +4705,13 @@ msgid "" " Exit Status:\n" " Returns the status of the last command executed." msgstr "" +"Группировка команд.\n" +" \n" +" Выполняет набор команд, объединённых в группу. Это единственный способ перенаправления\n" +" всего набора команд.\n" +" \n" +" Состояние выхода:\n" +" Возвращает состояние последней выполненной команды." #: builtins.c:1684 msgid "" @@ -3700,6 +4726,16 @@ 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 "" @@ -3711,17 +4747,21 @@ 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" @@ -3739,6 +4779,27 @@ msgid "" " 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 "" @@ -3793,6 +4854,56 @@ 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 "" @@ -3824,6 +4935,33 @@ 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 "" @@ -3851,6 +4989,29 @@ 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 "" @@ -3869,25 +5030,45 @@ 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" @@ -3901,6 +5082,22 @@ msgid "" " 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 "" @@ -3910,45 +5107,64 @@ 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" @@ -3967,36 +5183,55 @@ msgid "" " 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" @@ -4017,29 +5252,47 @@ msgid "" " 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" @@ -4049,15 +5302,42 @@ msgid "" " 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 "" @@ -4065,31 +5345,1903 @@ msgid "" " \n" " A synonym for `mapfile'." msgstr "" +"Чтение строк из файла в переменную массива.\n" +" \n" +" Синоним команды «mapfile»." -#~ msgid "Without EXPR, returns returns \"$line $filename\". With EXPR," -#~ msgstr " \"$ $\". ," +#~ msgid "Missing `}'" +#~ msgstr "Пропущен символ `}'" -#~ msgid "returns \"$line $subroutine $filename\"; this extra information" +#~ 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 "execute_command: bad command type `%d'" +#~ msgstr "execute_command: неверный тип команды '%d'" + +#~ 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 "Недостаточно памяти!" + +#~ 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 "" +#~ msgstr "<неизв>" + +#~ msgid "%s: bg background job?" +#~ msgstr "%s: задача уже фоновая" + +#~ 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'." -#, fuzzy #~ msgid "Obsolete. See `declare'." -#~ msgstr " . . `declare'." +#~ msgstr "Устарела. См. `declare'." -#, fuzzy -#~ msgid "Logout of a login shell." -#~ msgstr "" -#~ " " -#~ "." +#~ 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 " +#~ msgstr "задаётся либо своим именем в , либо номером. `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 "они или нет." diff --git a/shell.c b/shell.c index b743d149..9970dc43 100644 --- a/shell.c +++ b/shell.c @@ -1715,6 +1715,7 @@ static void shell_initialize () { char hostname[256]; + int should_be_restricted; /* Line buffer output for stderr and stdout. */ if (shell_initialized == 0) @@ -1753,11 +1754,15 @@ shell_initialize () /* 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 @@ -1775,8 +1780,8 @@ shell_initialize () 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); diff --git a/tests/RUN-ONE-TEST b/tests/RUN-ONE-TEST index 72ec06a2..3efcf32d 100755 --- a/tests/RUN-ONE-TEST +++ b/tests/RUN-ONE-TEST @@ -1,4 +1,4 @@ -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 diff --git a/tests/exportfunc.right b/tests/exportfunc.right index 5d889df5..96c8740c 100644 --- a/tests/exportfunc.right +++ b/tests/exportfunc.right @@ -4,13 +4,11 @@ exportfunc ok 2 ./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 diff --git a/tests/exportfunc.tests b/tests/exportfunc.tests index 85e2e96a..c2e17427 100644 --- a/tests/exportfunc.tests +++ b/tests/exportfunc.tests @@ -40,7 +40,7 @@ ${THIS_SH} ./exportfunc2.sub 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(){ _;}</dev/null # CVE-2014-6278 diff --git a/tests/exportfunc3.sub b/tests/exportfunc3.sub index 4b52d1c8..7a7aa26e 100644 --- a/tests/exportfunc3.sub +++ b/tests/exportfunc3.sub @@ -12,7 +12,7 @@ echo status: $? foo\=bar printenv | grep 'foo=bar' -${THIS_SH} -c 'foo\=bar' +${THIS_SH} -c 'foo\=bar 2>/dev/null' function /bin/echo { diff --git a/tests/misc/regress/log.orig b/tests/misc/regress/log.orig new file mode 100644 index 00000000..c1f1e199 --- /dev/null +++ b/tests/misc/regress/log.orig @@ -0,0 +1,50 @@ +:; ./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... +:; diff --git a/tests/misc/regress/shx.orig b/tests/misc/regress/shx.orig new file mode 100644 index 00000000..4b3bf2b8 --- /dev/null +++ b/tests/misc/regress/shx.orig @@ -0,0 +1,10 @@ +#! /bin/sh +for cmd in sh bash ash ksh zsh +do + echo + echo $cmd: + for demo in shx? + do + $cmd $demo + done +done