From e6e3b4442080b63cf18d1428138434900a8ea128 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Sat, 3 Dec 2011 13:33:39 -0500 Subject: [PATCH] commit bash-20040728 snapshot --- CWRU/CWRU.chlog | 37 + CWRU/changelog | 9641 +---------- CWRU/old/set.def.save | 544 + CWRU/save/unwind_prot.h.save | 50 + MANIFEST | 1 - array.c | 2 +- autom4te.cache/output.0 | 219 +- autom4te.cache/requests | 168 +- autom4te.cache/traces.0 | 14 - bashline.c | 2 +- builtins/evalfile.c | 1 + builtins/reserved.def | 5 +- doc/FAQ-2.05b | 1771 ++ doc/FAQ.orig | 1745 ++ doc/FAQ.save | 1745 ++ doc/bash.1.orig | 8583 ++++++++++ doc/bash.html | 5 +- doc/bash.pdf | Bin 572128 -> 308031 bytes doc/bash.ps | 21 +- doc/bashref.dvi | Bin 580120 -> 580108 bytes doc/bashref.html | 12 +- doc/bashref.log | 51 +- doc/bashref.pdf | Bin 528198 -> 529773 bytes doc/bashref.ps | 23814 ++++++++++++++------------ doc/bashref.texi.orig | 7105 ++++++++ doc/builtins.0 | 16 +- doc/builtins.ps | 2 +- doc/mkinstall-tmp | 44 + doc/rbash.0 | 4 +- doc/rbash.ps | 2 +- doc/texinfo.tex | 6689 +------- examples/scripts/adventure.sh.save1 | 549 + externs.h | 3 + general.c | 2 + include/memalloc.h.save | 58 + lib/malloc/malloc.c.save | 1213 ++ lib/readline/ansi_stdlib.h | 55 +- lib/readline/display.c | 4 +- lib/readline/display.c.orig | 2282 +++ lib/readline/doc/fdl.texi | 453 +- lib/readline/doc/history.dvi | Bin 79868 -> 79856 bytes lib/readline/doc/history.html | 6 +- lib/readline/doc/history.info | 52 +- lib/readline/doc/history.log | 30 +- lib/readline/doc/history.ps | 61 +- lib/readline/doc/readline.dvi | Bin 270424 -> 274068 bytes lib/readline/doc/readline.html | 1021 +- lib/readline/doc/readline.info | 170 +- lib/readline/doc/readline.ps | 1790 +- lib/readline/doc/rlman.aux | 10 +- lib/readline/doc/rlman.cp | 2 +- lib/readline/doc/rlman.cps | 2 +- lib/readline/doc/rlman.fn | 17 +- lib/readline/doc/rlman.fns | 17 +- lib/readline/doc/rlman.log | 38 +- lib/readline/doc/rlman.toc | 12 +- lib/readline/doc/rluserman.dvi | Bin 91652 -> 91852 bytes lib/readline/doc/rluserman.fn | 3 +- lib/readline/doc/rluserman.fns | 3 +- lib/readline/doc/rluserman.html | 150 +- lib/readline/doc/rluserman.info | 63 +- lib/readline/doc/rluserman.log | 18 +- lib/readline/doc/rluserman.ps | 195 +- lib/readline/posixdir.h | 62 +- lib/readline/posixjmp.h | 41 +- lib/readline/posixstat.h | 143 +- lib/readline/tilde.c | 459 +- lib/readline/tilde.h | 79 +- make_cmd.c | 1 + pathnames.h | 30 - po/bash.po.orig | 5623 ++++++ subst.c.orig | 7376 ++++++++ support/mkconffiles | 0 support/mkversion.sh | 0 support/rlvers.sh | 0 tests/? | 1 - tests/cprint.right.save1 | 72 + tests/history.tests.save | 97 + tests/misc/regress/log.orig | 50 + tests/misc/regress/shx.orig | 10 + tests/run-histexpand.debug | 4 + 81 files changed, 53829 insertions(+), 30791 deletions(-) mode change 100644 => 120000 CWRU/changelog create mode 100644 CWRU/old/set.def.save create mode 100644 CWRU/save/unwind_prot.h.save create mode 100644 doc/FAQ-2.05b create mode 100644 doc/FAQ.orig create mode 100644 doc/FAQ.save create mode 100644 doc/bash.1.orig create mode 100644 doc/bashref.texi.orig create mode 100755 doc/mkinstall-tmp mode change 100644 => 120000 doc/texinfo.tex create mode 100755 examples/scripts/adventure.sh.save1 create mode 100644 include/memalloc.h.save create mode 100644 lib/malloc/malloc.c.save mode change 100644 => 120000 lib/readline/ansi_stdlib.h create mode 100644 lib/readline/display.c.orig mode change 100644 => 120000 lib/readline/doc/fdl.texi mode change 100644 => 120000 lib/readline/posixdir.h mode change 100644 => 120000 lib/readline/posixjmp.h mode change 100644 => 120000 lib/readline/posixstat.h mode change 100644 => 120000 lib/readline/tilde.c mode change 100644 => 120000 lib/readline/tilde.h delete mode 100644 pathnames.h create mode 100644 po/bash.po.orig create mode 100644 subst.c.orig mode change 100755 => 100644 support/mkconffiles mode change 100755 => 100644 support/mkversion.sh mode change 100755 => 100644 support/rlvers.sh delete mode 100644 tests/? create mode 100644 tests/cprint.right.save1 create mode 100644 tests/history.tests.save create mode 100644 tests/misc/regress/log.orig create mode 100644 tests/misc/regress/shx.orig create mode 100644 tests/run-histexpand.debug diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index f6ce0b92..3268ef26 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -9638,3 +9638,40 @@ flags.c error messages [bash-3.0 frozen] + + 7/27 + ---- +doc/Makefile.in + - small fixes + +[bash-3.0-released] + + 7/28 + ---- +array.c + - in array_insert(), make sure the value to be added is non-NULL before + calling savestring() on it + +builtins/reserved.def + - fix description of `CDPATH' + +lib/readline/display.c + - when expanding a prompt that spans multiple lines with embedded + newlines, set prompt_physical_chars from the portion after the + final newline, not the preceding portion. Bug reported by + "Ralf S. Engelschall" + +make_cmd.c + - explicitly declare `lineno' in function prologue for make_case_command + +builtins/evalfile.c + - include `trap.h' for declaration for run_return_trap + +bashline.c + - fix a `return' without a value in enable_hostname_completion + +general.c + - include test.h for extern declaration for test_eaccess + +externs.h + - add declaration for zcatfd diff --git a/CWRU/changelog b/CWRU/changelog deleted file mode 100644 index f6ce0b92..00000000 --- a/CWRU/changelog +++ /dev/null @@ -1,9640 +0,0 @@ - 4/9/2001 - -------- -[bash-2.05 released] - - 4/10 - ---- -redir.c - - check return value of fclose() in write_here_document() for error - returns; don't just rely on fwrite() failing - -support/bashbug.sh - - set TMPDIR to /tmp if it's null or unset - - use $TMPDIR in the TEMP tempfile name template - - fixed the call to `mktemp', if it exists, to make it more portable - -jobs.c - - if WCONTINUED is not defined, define it to 0 and add a define for - WIFCONTINUED(wstatus) which expands to 0 - - add WCONTINUED to the flags passed to waitpid(2) in waitchld() - - don't increment children_exited if waitpid's status is WIFCONTINUED, - since we don't want to call a SIGCHLD trap handler in this case - - in waitchld(), we set child->running to 1 if WIFCONTINUED(status) - is non-zero - - make sure pretty_print_job doesn't check for the core dump bit if - the process has been continued; it's only valid if the job is dead - - in set_job_status_and_cleanup, set the job to JRUNNING if job_state - is non-zero and the job was previously marked as JSTOPPED - -configure.in - - add -DBROKEN_DIRENT_D_INO to interix LOCAL_CFLAGS - -lib/glob/glob.c - - if BROKEN_DIRENT_D_INO is defined, define REAL_DIR_ENTRY to 1 - -jobs.c - - in kill_pid, we only need to block and unblock SIGCHLD if the - `group' argument is non-zero, since otherwise we just call `kill' - on the pid argument - -version.c - - update copyright date to 2001 - -bashline.c - - prog_complete_return needs to take a `const char *' as its first - argument - - history_completion_generator needs to take a `const char *' as - its first argument, and `text' needs to be a `const char *' - - 4/11 - ---- -redir.c - - fixed a weird typo in redir_special_open, case RF_DEVFD, added - call to all_digits before call to legal_number - - fixed do_redirection_internal to call legal_number instead of atol(3) - when translating r_duplicating_{in,out}put_word, so it handles - overflow better - - produce an error message in redirection_error for out-of-range - file descriptors - - change allocation strategy in redirection_error so we don't have to - malloc scratch memory if redirection_expand() fails - -jobs.h - - added defines for `running' member of a struct process - -general.c - - fix legal_number to return 0 when strtol(3) reports overflow or - underflow - -parse.y - - changed read_token_word to call legal_number instead of atoi(3) - -input.c - - return -1/EBADF from close_buffered_fd if fd is < 0 - -command.h - - fixed bogus comment about IS_DESCRIPTOR in description of the - REDIRECTEE struct - -print_cmd.c - - change cprintf's 'd' modifier code to display negative numbers as - an out-of-range value. We can do this only because the only use - of %d is to output file descriptor numbers in redirections - -support/mksignames.c - - need to include config.h to get a possible value for - UNUSABLE_RT_SIGNALS - - 4/16 - ---- -lib/readline/doc/rluser.texinfo - - corrected a small error in one description of M-DEL - - 4/17 - ---- -stringlib.c - - need to initialize `ind' before calls to RESIZE_MALLOCED_BUFFER - in strcreplace() - -support/bashversion.c - - new file, prints bash version information - -Makefile.in - - rules for building bashversion and linking it to version.o - - 4/24 - ---- -conftypes.h - - new file with HOSTTYPE, OSTYPE, MACHTYPE, etc. defines from - variables.h - -variables.h, version.c - - include conftypes.h - -patchlevel.h - - new file, contains define for PATCHLEVEL. Doing away with the old - scheme of having the information in configure.in - -version.c - - include patchlevel.h - -Makefile.in - - run bashversion -p to find patch level rather than have configure - substitute in a value - - pass -S ${top_srcdir} to support/mkversion.sh - -support/mkversion.sh - - don't put PATCHLEVEL define into version.h, but accept and ignore - a -p option - - take a new -S srcdir option - - find the patch level by parsing it out of patchlevel.h - -configure.in - - hard-code BASHVERS assignment instead of reading it from a file - - remove BASHPATCH; don't substitute it - -_distribution,_patchlevel - - removed - - 4/26 - ---- -shell.c - - call init_noninteractive() in open_shell_script if forced_interactive - is non-zero (the shell was started with -i) and fd_is_tty is 0 - (the script file is a real file, not something like /dev/stdin), - since it wasn't done earlier - -builtins/printf.def - - change for POSIX.2 compliance when conversion errors are encountered - when processing %d, %u, and floating point conversion operators - (print a warning message, return the value accumulated at the time - of the error -- which is always 0 -- and exit with a non-zero status) - -command.h - - added CMD_COMMAND_BUILTIN for use by the `command' builtin and the - code in execute_cmd.c - -builtins/command.def - - add CMD_COMMAND_BUILTIN to the created command's flags - - 5/1 - --- -configure.in - - add call to AC_C_CONST to test `const' compiler behavior - - add call to AC_C_INLINE to test `inline' compiler behavior - - add call to AC_C_STRINGIZE to test cpp #x stringizing operator - -config.h.in - - add `#undef const' for configure to substitute - - add `#undef inline' for configure to substitute - - add `#undef HAVE_STRINGIZE' for configure to substitute - -include/stdc.h - - remove code that defines or undefines `const' and `inline' - - change the __STRING macro to be defined depending on the value - of HAVE_STRINGIZE - -lib/malloc/malloc.c - - change the __STRING macro to be defined depending on the value - of HAVE_STRINGIZE - -lib/readline/{readline,rlprivate}.h - - moved rl_get_termcap to readline.h, making it a public function - -lib/readline/readline.h - - new #define, RL_READLINE_VERSION, hex-encoded library version - number, currently set to 0x0402 - - new public int variable, rl_readline_version - -lib/readline/readline.c - - #define RL_READLINE_VERSION if it is not already defined (which it - should be in readline.h) - - initialize rl_readline_version to RL_READLINE_VERSION - -lib/readline/doc/rltech.texinfo - - documented rl_get_termcap - - documented rl_readline_version - -jobs.c - - job_exit_status should return an int, not a WAIT (undetected - before because on most POSIX-like systems a WAIT is really an int) - -builtins/evalfile.c - - added FEVAL_REGFILE (file must be a regular file) to accepted - _evalfile flags - - fc_execute_file() adds FEVAL_REGFILE to _evalfile flags. This - means that startup files and files read with `.' no longer need - to be regular files - - 5/2 - --- - -lib/termcap/Makefile.in - - fix target for installed termcap library (normally unused) - -lib/tilde/Makefile.in - - fix install target to install in $(libdir) (normally unused) - -Makefile.in - - don't make $(man3dir) since there's nothing installed there - -Makefile.in,doc/Makefile.in - - change `man1ext' to `.1', `man3ext' to `.3' - - change appropriate install targets to use new values of man[13]ext - - use `test ...' instead of `[...]' - - add support for DESTDIR root installation prefix, for package - building (installdirs, install, install-strip, uninstall targets) - -builtins/common.c - - new function int get_exitstat(WORD_LIST *list) returns an eight-bit - exit status value for use in return, exit, logout builtins - -builtins/common.h - - extern declaration for get_exitstat() - -builtins/{exit,return}.def - - call get_exitstat where appropriate - -builtins/printf.def - - add support for "'" flag character as posix 1003.2-200x d6 says - - fix core dump when user-supplied field width or precision is 0 - - fix to printstr() to handle zero-length precision with `%b' format - specifier (printf '%.0b-%.0s\n' foo bar) - - fix to printstr() to treat a negative field width as a positive - field width with left-justification - - fix to mklong to avoid static buffers, which can always be overrun - by someone sufficiently motivated - -bashline.c - - change var in add_host_name to type `size_t' for passing to xrealloc - - 5/3 - --- -execute_cmd.c - - change restore_signal_mask to accept a sigset_t *, since a sigset_t - may not fit into a pointer, change call - -unwind_prot.c - - use a union UWP in restore_variable when restoring a variable whose - size is the same as sizeof(int), the reverse of the method used to - store it in unwind_protect_int - -builtins/printf.def - - use a #define LENMODS containing the length modifiers instead of - testing against each possible modifier character, save any mod - character found - - add support for ISO C99 length specifiers `j', `t', and `z' - - if `L' modifier is supplied with a floating point conversion char, - pass a `long double' to printf if HAVE_LONG_DOUBLE is defined - -configure.in,config.h.in - - call AC_C_LONG_DOUBLE to check for `long double'; define - HAVE_LONG_DOUBLE if supported - -bashline.c - - fix an inadvertantly-unclosed comment in attempt_shell_completion - - make set_saved_history return a value - - make dynamic_complete_history return a useful value - -{make_cmd,execute_cmd,shell,subst,trap,variables,input,unwind_prot,test, -pcomplete}.c - - removed some declared-but-unused variables - -builtins/{cd,enable,fc,set,setattr,type,umask,printf,complete}.def - - removed some declared-but-unused variables - -lib/sh/{zread,netopen}.c - - removed some declared-but-unused variables - -execute_cmd.c - - in execute_arith_command, use a long variable to hold the result - of evalexp(), since that's what it returns - -builtins/evalstring.c - - make cat_file return -1 on a read or write error - -lib/sh/stringlib.c - - make merge_stringlists() return the right value - - 5/7 - --- -pcomplete.c - - remove typo that caused empty declaration (;;) - -parse.y - - fix yyerror() to accept a single string argument; fix callers - -trap.c - - cast pointer to long instead of int when printing message with - internal_warning() in run_pending_traps() - -subst.c - - fix process_substitute to handle stdin being closed - -test.c - - change `while' to `if' in and() and or(), since the loop isn't - actually performed -- there's an unconditional `return' in the - loop body - - check for integer overflow of arguments to `-t' - -lib/sh/netopen.c - - change _getserv() to reject negative port/service numbers - -expr.c - - fix strlong() to not convert the base specification from long to - int before checking for overflow, since truncation on machines - where sizeof(int) != sizeof(long) may mask errors - -builtins/{jobs,kill,wait}.def - - use legal_number instead of atoi when converting strings to pid_t; - check for numeric overflow - -input.c - - fix for cygwin in b_fill_buffer -- off-by-one error when checking - buffer for \r\n termination - -general.h - - new #define INT_STRLEN_BOUND(t), computes max length of string - representing integer value of type T, possibly including a sign - character - - include if it's present - -{execute_cmd,findcmd,test}.c - - don't include , since general.h does it now - -{execute_cmd,lib/sh/itos,pcomplete,print_cmd,subst,variables}.c - - use INT_STRLEN_BOUND instead of static array sizes when converting - various strings to integer values - -shell.h - - struct fd_bitmap now uses an `int' size, since it's bounded by - the number of file descriptors, which must fit into an `int' - -execute_cmd.c - - FD_BITMAP_DEFAULT_SIZE is now 32, not 32L - - new_fd_bitmap takes an `int' size parameter, not a `long' - -execute_cmd.h - - change prototype for new_fd_bitmap() - -test.c - - fix test_stat to check for overflow when parsing the integer file - descriptor number; return ENOENT instead of EBADF for files that - are not open - -hashlib.c - - don't discard the upper 32 bits of the random value, if present - -lib/readline/shell.c - - use the same INT_STRLEN_BOUND mechanism to decide how much space to - allocated in sh_set_lines_and_columns - - 5/8 - --- -aclocal.m4 - - add check for libtinfo (termcap-specific portion of ncurses-5.2) to - BASH_CHECK_LIB_TERMCAP - - new macro, RL_LIB_READLINE_VERSION, checks version of installed - readline library and (optionally) writes version #defines to - config.h. Bash doesn't use the version defines - -configure.in - - call RL_LIB_READLINE_VERSION instead of support/rlvers.sh - -execute_cmd.c - - fix execute_shell_script and the WHITECHAR and STRINGCHAR macros - to check array bounds before indexing into the sample string - -unwind_prot.[ch] - - import new versions submitted by Paul Eggert - with a couple of changes for backwards compatibility, so the rest - of the source doesn't need to be changed yet - -jobs.c - - use unwind_protect_var on last_made_pid in run_sigchld_trap - -builtins/bind.def - - use unwind_protect_var on rl_outstream - -general.c - - rework print_rlimtype to use INT_STRLEN_BOUND and handle the - most negative number correctly - -expr.c - - `tokval' should have been a `long', since all arithmetic is done - as longs - -builtins/history.def - - consolidate tests for valid history position in one block to - avoid duplicate code and strings - -builtins/ulimit.def - - fix check for overflow when setting limit to work when int is 32 - bits and RLIMTYPE is 64 - -lib/sh/tmpfile.c - - don't truncate the result of time(3) to int; just use time_t, - since it's being assigned to an `unsigned long' - -mailcheck.c - - use legal_number instead of atoi in time_to_check_mail() to catch - more numeric errors; consolidate error checking in one block - - last_time_mail_checked should be a time_t - - 5/9 - --- -builtins/set.def - - recognize `set [-+]o nolog' if HISTORY is defined - -bashline.c - - new variable `dont_save_function_defs', set by `set -o nolog'; - currently ignored - -command.h - - the `dest' member of a REDIRECTEE is now an `int' - -parse.y,redir.c - - changed uses of `redir.test' (where redir is a REDIRECTEE) since - it's now an int - -lib/readline/rlstdc.h - - don't mess around with `const', rely on configure to supply a - proper definition if the compiler doesn't support it - -lib/tilde/tilde.h - - include if HAVE_CONFIG_H is defined - - don't mess around with `const', rely on configure - -builtins/shopt.def - - new read-only `shopt' option, login_shell, non-zero if shell is a - login shell (as decided by shell.c) - - new function set_login_shell(), sets shopt private value of - login_shell - -builtins/common.h - - new extern declaration for set_login_shell - -shell.c - - call set_login_shell after setting value of login_shell (in - main() and set_shell_name()) - -parse.y - - added new `\A' prompt string escape sequence: time in 24-hour - HH:MM format - -configure.in, config.h.in - - check for , define HAVE_GRP_H if found - -builtins/complete.def - - add new `-A group/-g' option to complete group names - -pcomplete.h - - new define for CA_GROUP, used with group name completion - -pcomplete.c - - add code to support CA_GROUP group name completion - -bashline.c - - new function, bash_groupname_completion_function(), supports - programmable completion of group names - -bashline.h - - extern declaration for bash_groupname_completion_function - -lib/readline/bind.c - - new inputrc variable, `match-hidden-files', controls completion - matching files beginning with a `.' (on Unix) - -lib/readline/complete.c - - new variable, _rl_match_hidden_files, mirrors `match-hidden-files' - inputrc variable - -lib/readline/rlprivate.h - - extern declaration for _rl_match_hidden_files - -builtins/hash.def - - new `-t' option to list hash values for each filename argument - -builtins/read.def - - alarm(3) takes an `unsigned int' argument, not int - - check for arithmetic overflow with -t and -n options - -input.c - - check for read error before doing \r\n translation on cygwin in - b_fill_buffer - - reset bp->b_used to 0 instead of leaving it at -1 on read error - in b_fill_buffer - -builtins/shopt.def - - new functions, shopt_setopt(name, mode) and - shopt_listopt(name, mode) to give the rest of the shell an easy - interface - -builtins/common.h - - extern declarations for shopt_setopt and shopt_listopt - -shell.c - - new invocation options -O and +O, to list or set/unset shopt - options like +o/-o sets and unsets `set -o' options - -doc/{bash.1,bashref.texi} - - document `set -o nolog' - - document `login_shell' shopt option - - document new `\A' prompt string escape sequence - - document new `-t' option to `hash' - - document new `[+-]O' invocation option - -doc/bashref.texi - - add text to `Invoking Bash' section defining a login shell; text - taken from man page - -doc/bash.1, lib/readline/doc/rluser.texinfo - - documented new complete/compgen `-A group/-g' option - -lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1 - - documented new `match-hidden-files' inputrc variable - - 5/10 - ---- -configure.in - - fix AC_CHECK_PROG(ar, ...) - - add AC_CHECK_TYPE for ssize_t - -config.h.in - - new #undef for ssize_t - -lib/sh/zread.c - - int -> ssize_t fixes to mirror modern declarations of read and write - - the `off' variable in zsyncfd should be an off_t since it computes - a file offset - - the local buffer `lbuf' is now char, since it's not nice to pass - unsigned char * to read(2), and the values from it are assigned to - a char anyway - - lind and lused are now size_t, since they index into a buffer - - set lused to 0 on read error - -lib/sh/zwrite.c - - change second argument to type `char *', since ISO C says you have - to pass a `char *' to `write' - -externs.h - - fix extern declarations of zread, zread1, zreadc, and zwrite - - prototype extern declaration of qsort_string_compare - - add extern declaration for history_delimiting_chars() from parse.y - -input.h - - b_used and b_inputp members ofr struct BSTREAM are now size_t - -builtins/evalstring.c - - the number of chars read with zread in cat_file should be assigned - to a variable of type ssize_t - -input.c - - the number of chars read with zread in b_fill_buffer should be - assigned to a variable of type ssize_t - - `localbuf' is now type char[], since POSIX says you shouldn't pass - unsigned char * to read(2) - - in getc_with_restart(), use a variable of type unsigned char to - get a value from the local buffer and return it - - in ungetc_with_restart, explicitly return the character arg passed - to avoid relying on localbuf being unsigned char - -subst.c - - the number of chars read with zread in read_comsub should be - assigned to a variable of type ssize_t - -mksyntax.c - - instead of casting to unsigned char * in addcstr, use a variable - of type unsigned char and let the compiler do the work - -parse.y - - instead of casting to unsigned char * in yy_readline_get, use a - variable of type unsigned char and let the compiler do the work - - ditto for yy_string_get and shell_getc (cast to unsigned char) - -subst.c - - instead of casting to unsigned char when assigning to ifscmap in - expand_word_internal, use a variable of type unsigned char and - let the compiler do the work - -lib/sh/strtrans.c - - instead of casting to unsigned char in ansic_quote, use a variable - of type unsigned char and let the compiler do the work - -builtins/evalstring.c - - remove extern declarations for zwrite and run_trap_cleanup; they're - in externs.h - - prototype cat_file forward declaration - -Makefile.in - - remove -I$(includedir) from INCLUDES and SUBDIR_INCLUDES - -aclocal.m4 - - change RL_LIB_READLINE_VERSION to set RL_PREFIX, RL_LIBDIR, - and RL_INCLUDEDIR to what it used to test the installed readline - library version for use by the caller - - change RL_LIB_READLINE_VERSION to not compute ac_cv_rl_prefix if - the caller has already assigned it a value - - rename _rl_prefix -> ac_cv_rl_prefix, _rl_libdir -> ac_cv_rl_libdir, - _rl_includedir -> ac_cv_rl_includedir - -configure.in - - change testing of whether to use the value of - $opt_with_installed_readline to be != no, to allow the user to - specify a prefix where the installed readline library may be found - - if --with-installed-readline=PREFIX is supplied, set ac_cv_rl_prefix - to PREFIX before calling RL_LIB_READLINE_VERSION - - if --with-installed-readline[=PREFIX] is supplied, don't set - RL_LIBDIR and RL_INCLUDEDIR; let RL_LIB_READLINE_VERSION take care - of it, set RL_INCLUDE=-I${RL_INCLUDEDIR} - - if --with-installed-readline[=PREFIX] is supplied, and we're - linking with the history library, assign $RL_LIBDIR to HIST_LIBDIR - so we use the same version of the installed readline and history - libraries - -Makefile.in, builtins/Makefile.in - - have configure substitute RL_INCLUDEDIR, set RL_INCLUDEDIR variable - -doc/bashref.texi - - updated description of --with-installed-readline configure option - -general.c - - moved QSFUNC typedef here from builtins/common.c - -{alias,bashline,variables,lib/sh/stringvec}.c - - cast fourth argument to qsort to (QSFUNC *) - -alias.c - - prototype forward declaration of qsort_alias_compare - -bashhist.c - - include for extern declaration of glob_pattern_p - - remove extern declaration of history_delimiting_chars; it's now - in externs.h - - prototype forward declarations of histignore_item_func, - maybe_add_history, and bash_add_history - -bracecomp.c - - remove extern declaration for sh_backslash_quote; it's in externs.h - -braces.c - - remove extern declaration for extract_command_subst; it's in subst.h - - prototype forward declarations for expand_amble, array_concat, and - brace_gobbler - -error.c - - prototype extern declaration of give_terminal_to, fix bad call - -{execute_cmd,expr,findcmd,jobs,mailcheck,nojobs,pcomplete,print_cmd,redir, -shell}.c - - prototype all static forward function declarations - -pcomplete.c - - changed some function parameters to `const char *' to avoid discarding - const qualifier - -make_cmd.c - - make_bare_word, make_word_flags, and make_word now take a - `const char *' string argument - -make_cmd.h - - changed extern declarations for make_bare_word and make_word - -print_cmd.c - - cprintf now takes a `const char *' as its first argument, like - xprintf and printf - - the conditional define for xprintf should have been HAVE_VPRINTF, - not HAVE_VFPRINTF - -shell.c - - in isnetconn(), the return value of sizeof() is size_t - -aclocal.m4 - - add inclusion of stddef.h if STDC_HEADERS is defined to 1 in - BASH_CHECK_TYPE - -configure.in - - add a call to BASH_CHECK_TYPE for socklen_t (type of third argument - to getpeername(2)) - - 5/11 - ---- -lib/readline/bind.c - - make `useq' a char array to pass to rl_macro_bind in - rl_parse_and_bind - -lib/readline/{{bind,isearch}.c,rlprivate.h} - - _rl_isearch_terminators is now a char *, not unsigned char * - -{subst,variables,lib/sh/tmpfile}.c - - dollar_dollar_pid is now a `pid_t' instead of `int' - -variables.c - - sbrand() now takes an `unsigned long' to set the seed value - - changed last_random_value to type int, since it's always between - 0 and 32767 - - use strtoul to convert the value in assign_random instead of atoi - - take out casts in any arguments to sbrand() - - take out cast to int in call to inttostr in set_ppid() - -subst.c - - don't cast last_asynchronous_pid when passing to itos() - -{sig,subst}.c - - prototype all static forward function declarations - - 5/14 - ---- -{test,trap,variables}.c - - prototype all static forward function declarations - -variables.c - - free_variable_hash_data() now takes a PTR_T, a `generic pointer' - -builtins/{alias,bind,break,cd,complete,declare,enable,exit,fc,fg_bg,help, -history,jobs,pushd,read,set,trap,umask, - - prototype all static forward function declarations - -builtins/read.def - - reset_eol_delim now takes a `char *' arg, since that's what the - unwind_protect functions pass it, and it ignores its arguments - anyway - -lib/readline/{histsearch,input,kill,rltty,search,vi_mode}.c - - prototype all static forward function declarations - -lib/tilde/tilde.c - - prototype all static forward function declarations - - tilde_find_prefix, tilde_find_suffix, isolate_tilde_prefix, and - glue_prefix_and_suffix now take `const char *' arguments where - appropriate - -configure.in,config.h.in - - check for vsnprintf, define HAVE_VSNPRINTF if found - -lib/readline/display.c - - use vsnprintf() in rl_message if it's available; if we don't, at - least set the last character in msg_buf to 0 to avoid overrun -- - we really can't do anything about overflow at this point. if it's - available, this fixes buffer overflow problems in rl_message - - 5/15 - ---- -lib/readline/histexpand.c - - in get_history_word_specifier, allow any character to terminate - a `:first-' modifier, not just `:' and null. This is what csh - appears to do. This allows things like `!:0- xyzzy' to replace the - last argument with xyzzy - - 5/18 - ---- -configure.in, config.h.in - - check for , define HAVE_STDINT_H if found - - check for intmax_t in , define intmax_t as long if not - found - - 5/21 - ---- -builtins/kill.def - - change to use strerror() for error message when kill(2) fails - -aclocal.m4 - - new macro, BASH_C_LONG_LONG, check for `long long' - -configure.in, config.h.in - - call BASH_C_LONG_LONG, define HAVE_LONG_LONG if found - -lib/sh/snprintf.c - - new file, with implementations of snprintf, vsnprintf, asprintf, - and vasprintf, derived from inetutils version - -Makefile.in, lib/sh/Makefile.in - - add snprintf.c/snprintf.o - -configure.in, config.h.in - - add checks for snprintf, asprintf, vasprintf, with appropriate - cpp defines - -lib/readline/{rldefs,xmalloc}.h, lib/readline/xmalloc.c - - xmalloc and xrealloc now take `size_t' arguments, like their bash - counterparts - -externs.h,lib/sh/itos.c - - inttostr and itos now take `long' arguments - - inttostr takes a `size_t' argument for the buffer size - -{expr,lib/malloc/malloc,variables,general}.c - - fixed calls to itos() by removing casts, etc. - -subst.[ch] - - get_dollar_var_value now takes a long, not an int - - sub_append_number now takes a long, not an int - -subst.c - - in parameter_brace_expand_word, use a long and legal_number to - translate ${N}, to avoid overflow - - in parameter_brace_expand_length, use a long and legal_number to - translate ${#N}, to avoid overflow - - in do_array_element_assignment, array_expand_index, - array_value_internal, use arrayind_t instead of int - - let verify_substring_values take long * arguments for the return - value of evalexp() - - pass long * arguments to verify_substring_values in - parameter_brace_substring - - parameter_brace_expand_length now returns `long' - - parameter_brace_expand now uses a long variable for the return - value of parameter_brace_expand_length - - param_expand now uses a long variable for the return value from - evalexp - - array_length reference now returns an `arrayind_t', since it can - return the num_elements member of an array, which is of type - arrayind_t - -subst.h - - array_expand_index now returns an `arrayind_t' - -array.[ch] - - array_subrange now takes arrayind_t arguments, not `int' - - dup_array_subrange now uses arrayind_t local variable to do - array indexing - - use long to print array indices in print_element - -variables.c - - null_array_assign, assign_dirstack, bind_array_variable - now take arrayind_t arguments as array indices - - assign_array_var_from_word_list, assign_array_var_from_string, - unbind_array_element now use arrayind_t local variables for - array indexing - -variables.h - - change extern declaration of bind_array_variable - -builtins/common.[ch] - - get_numeric_arg now returns a `long', since it usually returns - the value of legal_number() - -builtins/{shift,break}.def - - use long variables for the return value of get_numeric_arg - -builtins/history.def - - convert string argument to int only if it's in range - -builtins/pushd.def - - set_dirstack_element and get_dirstack_element now take `long' - index arguments - - get_dirstack_index now takes a `long' index argument, since it's - passed the converted value from legal_number - -lib/sh/timeval.c - - in print_timeval, don't assume that the number of minutes fits into - an int, since it's just seconds/60. - -lib/sh/clock.c - - ditto for print_clock_t - - 5/22 - ---- -shell.c - - since the -O option settings may possibly be overridden by the - normal shell initialization or posix initialization, save the - invocation options on an alist (with add_shopt_to_alist) and - process them after basic initialization (with run_shopt_alist) - - 5/23 - ---- -trap.h - - new define, BASH_NSIG, all system signals plus special bash traps - -trap.c, builtins/trap.def - - use BASH_NSIG for array bounds and loops where appropriate - -trap.c - - change decode_signal to disallow numeric signal numbers above - NSIG -- this means you can only reference special traps like - DEBUG by name - - new SPECIAL_TRAP(s) macro to test whether s is one of the special - bash traps (currently DEBUG and EXIT) - - change reset_or_restore_signal_handlers so command substitution - doesn't inherit the debug trap (like ksh93), and child processes - don't have to rely on initialize_traps being run to get rid of - any debug trap - -support/mksignames.c - - add extra "ERR" signal name, value NSIG+1, allocate space for it - and write it out in signal_names[] - -trap.h - - new define: ERROR_TRAP == NSIG+1, change BASH_NSIG to NSIG+2 - - extern declarations for set_error_trap, run_error_trap - - new define: TRAP_STRING(s), expands to trap_list[s] if signal S - is trapped and not ignored, NULL otherwise - -trap.c - - add ERROR_TRAP to SPECIAL_TRAPS define - - initialize ERROR_TRAP stuff in initialize_traps - - new function: set_error_trap(command), sets the ERR trap string - - new function: run_error_trap(command), runs the ERR trap string - - set trap string for ERROR_TRAP to NULL in free_trap_strings - - change reset_or_restore_signal_handlers so child processes don't - inherit the ERR trap - - add case to call run_error_trap in maybe_call_trap_handler - -execute_cmd.c - - in execute_command_internal, keep track of ERR trap and call it if - necessary - - use TRAP_STRING to get the value of debug and error traps - - in execute_function, arrange things so the ERR trap is not inherited - by shell functions, and is saved and restored like the DEBUG trap - -doc/{bash.1,bashref.texi} - - documented new ERR trap - -tests/{trap.{tests,right},trap2.sub,trap2a.sub} - - added ERR trap tests - -subst.c - - on machines without /dev/fd, change the named pipe fifo list to a - list of structs containing pathname and proc information - - change unlink_fifo_list to kill the proc in the fifo list with - signal 0 and not remove the fifo if the proc is still alive. This - should fix the problem on those backward systems without /dev/fd - where fifos were removed when a job using process substitution was - suspended - - 5/24 - ---- -examples/loadables/getconf.h - - new file, with basic defines needed to make getconf work minimally - on POSIX systems without the necessary definitions - -examples/loadables/getconf.c - - replacement functions for confstr, sysconf, pathconf for systems - that lack them, providing a minimal posix interface - - heavily augmented getconf, now supports all POSIX.1-200x, - POSIX.2-200x, Solaris 7, AIX 4.2 getconf variables - - 5/29 - ---- -builtins/setattr.def - - make `readonly', `export', and `declare' print `invisible' variables - as just a command and variable name, without a value, when listing - all variables (as POSIX.2-200x d6 requires) - - 5/30 - ---- - -configure.in - - upgraded to autoconf-2.50 on main development machine, so require - autoconf-2.50 in preparation for using some if its new features - - call AC_C_PROTOTYPES - - remove call to AC_EXEEXT, which now does the wrong thing - - changed AC_INIT to new flavor - - added call to AC_CONFIG_SRCDIR - - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS - - AC_RETSIGTYPE -> AC_TYPE_SIGNAL - -configure.in, aclocal.m4, config.h.in - - removed call to BASH_LARGE_FILE_SUPPORT, use AC_SYS_LARGEFILE - standard support, with new macros _FILE_OFFSET_BITS and - _LARGE_FILES - - removed definition of BASH_LARGE_FILE_SUPPORT - -doc/bashref.texi - - document new `--enable-largefile' configure option - -lib/readline/readline.c - - change rl_set_prompt to call rl_expand_prompt unconditionally, so - local_prompt and local_prompt_prefix get set correctly - - 6/6 - --- -lib/readline/complete.c - - don't append `/' or ` ' to a match when completing a symlink that - resolves to a directory, unless the match doesn't add anything - to the word. This means that a tab will complete the word up to - the full name, but not add anything, and a subsequent tab will add - a slash. Change to append_to_match; callers changed - -hashlib.c - - new function, hash_table_nentries (table), returns the number of - items in TABLE - -hashlib.h - - extern declaration for hash_table_nentries - -configure.in - - configure without bash malloc on openbsd; they claim it needs - eight-bit alignment (which the bash malloc provides, but...) - - 7/2 - --- -stringlib.c - - only call RESIZE_MALLOCED_BUFFER from strsub() if the replacement - string length is > 0, avoid possible hangs if replacement is null - -subst.c - - don't include input.h; no longer needed - -configure.in - - remove calls to AC_SYS_RESTARTABLE_SYSCALLS and - BASH_SYS_RESTARTABLE_SYSCALLS; the results are no longer used - -config.h.in - - remove define for HAVE_RESTARTABLE_SYSCALLS - -aclocal.m4 - - removed definition of BASH_SYS_RESTARTABLE_SYSCALLS; no longer used - -execute_cmd.c - - changed select command so `return' no longer terminates the select - command, so it can be used to return from an enclosing function. - This is as ksh (88 and 93) does it - -lib/readline/vi_mode.c - - fix trivial typo in declaration of vi_motion; `t' appears twice; - the second instance should be `T' - - 7/3 - --- -configure.in - - don't add -static to LDFLAGS on Solaris 2.x. This means that the - auxiliary programs will be built as dynamic executables, but that - should do no harm - - 7/5 - --- -lib/glob/fnmatch.c - - fix the code that processes **(pattern) to short-circuit if the - pattern is ill-formed or lacks a trailing `)' -- this fixes the - segfault on **(/*) - -Makefile.in, builtins/Makefile.in - - split CCFLAGS into CCFLAGS_FOR_BUILD and CFLAGS, to aid in - cross-compilation - - build programs that use $(CC_FOR_BUILD) using $(CCFLAGS_FOR_BUILD) - -configure.in, config.h.in - - check for getaddrinfo(3), define HAVE_GETADDRINFO if found - -lib/sh/netopen.c - - implemented a version of _netopen (_netopen6) that uses - getaddrinfo(3) if available, use if HAVE_GETADDRINFO is defined. - old _netopen is _netopen4; _netopen now calls either _netopen6 - or _netopen4 as appropriate - - 7/9 - --- -builtins/exit.def - - don't source ~/.bash_logout if subshell_environment is non-zero - -execute_command.c - - in execute_until_or_while, handle the case where `breaking' is - set in the loop test (e.g., by the job control code when a job - is stopped with SIGTSTP), but the return value from the test is - something that would cause the loop to break. Need to decrement - `breaking' in this case - - 7/10 - ---- -execute_cmd.c - - in execute_in_subshell, make sure a command of type cm_subshell - inherits its `enclosing' command's CMD_IGNORE_RETURN flag - -variables.c - - in maybe_make_export_env, don't allow restricted shells to put - exported functions in the export environment - - 7/11 - ---- -lib/glob/strmatch.h - - renamed old fnmatch.h - - changed guard #ifdef to _STRMATCH_H - - include system if HAVE_LIBC_FNM_EXTMATCH is defined - -lib/glob/strmatch.c - - renamed old fnmatch.c - - include "strmatch.h" - - if HAVE_LIBC_FNM_EXTMATCH is defined, define a dummy version of - strmatch() that just calls fnmatch(3) - -lib/glob/glob.c - - include "strmatch.h" - - fnmatch -> strmatch - -Makefile.in, lib/glob/Makefile.in - - fnmatch -> strmatch - -{bashhist,execute_cmd,pathexp,pcomplete,shell,stringlib,subst,test}.c, -pathexp.h,builtins/help.def - - include - - fnmatch -> strmatch - -execute_cmd.c - - broke the code that parses the interpreter name from a #! line - out from execute_shell_script to a new function, getinterp() - - call getinterp from execute_shell_script - - use return value from getinterp in error message about bad - #! interpreter in shell_execve - - 7/12 - ---- -lib/readline/isearch.c - - the last isearch string is now remembered in a new static variable, - last_isearch_string - - if ^R^R is typed, readline now searches for the remembered isearch - string, if one exists - - 7/24 - ---- -pcomplete.h - - extern declaration for completions_to_stringlist() - - 7/25 - ---- -builtins/complete.def - - make compgen handle -o default option - - make compgen return success only if sl->list_len is non-zero, - indicating that there are items on the list - - 7/31 - ---- -execute_cmd.c - - in execute_connection, force stdin to /dev/null for asynchronous - commands if job control is not active, not just if the shell is - running a shell script (since you can run `set -m' in a script) - -lib/readline/rltty.c - - make sure _rl_tty_restore_signals resets `tty_sigs_disabled' on - successful restoration of the terminal modes - - make sure _rl_tty_disable_signals turns off IXON so that ^S and - ^Q can be read by rl_quoted_insert - - 8/1 - --- -aclocal.m4 - - new check for FNM_EXTMATCH being defined in , as Ullrich - Drepper intends to do for new versions of GNU libc - -config.h.in - - new definition for HAVE_LIBC_FNM_EXTMATCH - -configure.in - - check for fnmatch, but don't define anything in config.h - - call BASH_FUNC_FNMATCH_EXTMATCH to check for FNM_EXTMATCH - - 8/2 - --- -alias.h - - remove bogus extern declaration for xmalloc() - - include "stdc.h" - - add prototype declarations for all extern function declarations - -xmalloc.c,lib/readline/xmalloc.c - - fix xmalloc to return a PTR_T - - fix xrealloc to return a PTR_T and take a PTR_T as first argument - -include/ansi_stdlib.h - - extern declarations for malloc and realloc have them return PTR_T - -xmalloc.h - - new file, with extern declarations for functions in xmalloc.c - -general.h - - removed extern declarations for functions in xmalloc.c - - include xmalloc.h - -Makefile.in,builtins/Makefile.in - - update dependencies to include xmalloc.h - -parse.y,{alias,array,bashline,bracecomp,execute_cmd,findcmd,flags,general, -hashcmd,locale,mailcheck,make_cmd,pathexp,pcomplete,print_cmd,stringlib, -subst,unwind_prot,variables}.c -builtins/{common,evalfile}.c -builtins/{cd,command,enable,exec,printf,read,set}.def -lib/sh/{makepath,netopen,pathphys,setlinebuf,shquote,snprintf,stringlist, -strtrans,tmpfile}.c -lib/readline/{util,terminal,shell,readline,macro,kill,isearch,input, -histfile,histexpand,display,complete,bind}.c - - make sure all calls to xmalloc are cast to the right return value - -siglist.c - - include xmalloc.h - -parse.y,{alias,bashline,bracecomp,expr,make_cmd,nojobs,print_cmd,subst}.c -builtins/{fc,printf,read}.def -lib/sh/snprintf.c, lib/tilde/tilde.c -lib/readline/{bind,display,histexpand,isearch,macro,util,vi_mode}.c - - make sure all calls to xrealloc are cast to the right return value - -lib/sh/{netopen,setlinebuf,shquote,snprintf}.c, lib/tilde/tilde.c - - include xmalloc.h, remove extern declaration of xmalloc - -lib/readline/xmalloc.h - - xmalloc and xrealloc should return PTR_T - -lib/readline/rldefs.h - - don't include an extern declaration for xmalloc - - 8/7 - --- -support/shobj-conf - - fixed up commented-out stanzas for HP's unbundled C compiler on - HP/UX - -support/bashbug.sh - - force the subject to be changed from the default - -lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1 - - document that transpose-words swaps the last two words on the line - if point is at the end of the line - - 8/9 - --- -stringlib.c - - fix possible infinite recursion problem with null pattern in - strsub() - -hashlib.c - - new function copy_hash_table to copy a hash table using a caller- - supplied function to copy item data (defaults to savestring()) - -hashlib.h - - new extern declaration for copy_hash_table - -builtins/declare.def - - changes so that declare [-a] var=value assigns `value' to element 0 - of array variable `var' like ksh93 - - change so that declare [-a] var[N]=value assigns `value' to element - N of array variable `var' like ksh93 - - 8/13 - ---- -arrayfunc.c - - new file, for miscellaneous array functions - -arrayfunc.h - - new file, extern declarations for functions in arrayfunc.c - -variables.c - - move convert_var_to_array, bind_array_variable, - assign_array_from_string, assign_array_var_from_word_list, - assign_array_var_from_string, quote_array_assignment_chars, - skipsubscript, unbind_array_element, print_array_assignment - to arrayfunc.c - -shell.h - - include arrayfunc.h after variables.h - -variables.h - - remove above extern function declarations moved to arrayfunc.h - - add extern declaration for var_lookup - -Makefile.in - - add arrayfunc.c, arrayfunc.h in appropriate places - - add arrayfunc.h to dependencies - -subst.c - - move valid_array_reference, array_expand_index, array_variable_part, - array_value_internal, array_value (now global), get_array_value, - do_array_element_assignment to arrayfunc.c - -subst.h - - extern declarations for functions above moved to arrayfunc.h - -arrayfunc.h - - extern declarations for above functions from subst.c - -subst.[ch] - - string_list_dollar_star and string_list_dollar_at are now global - functions - - quote_escapes is now a global function - -subst.c - - maybe_expand_string -> expand_string_if_necessary - - expand_string_to_string -> expand_string_to_string_internal - - new functions: expand_string_to_string and - expand_string_unsplit_to_string, which call - expand_string_to_string_internal with expand_string and - expand_string_unsplit as the FUNC arguments, respectively - -arrayfunc.c - - change array_expand_index to call expand_string_to_string instead - of maybe_expand_string - - 8/14 - ---- -shell.c - - in execute_env_file, call expand_string_unsplit_to_string - -mailcheck.c - - in check_mail, call expand_string_to_string - -variables.c - - in assign_in_env, call expand_string_unsplit_to_string - -arrayfunc.c - - new function, array_variable_name, splits an array reference into - a name (which is returned as a new string) and subscript - - change array_variable_part to just call array_variable_name and - look up the string returned with find_variable - - new function, find_or_make_array_variable (name, flags) which will - look up an array variable and convert a string variable to an - array if necessary. The FLAGS argument, if non-zero, says to - check the readonly and noassign attributes and fail if either is set - -builtins/read.def - - make `read -a aname' honor any readonly status of `aname' - - read -a now calls find_or_make_array_variable with FLAGS value 1 - -arrayfunc.[ch], subst.c, builtins/{declare,read}.def - - do_array_element_assignment -> assign_array_element - - 8/20 - ---- -parse.y - - changed `for' command grammar to allow missing word list after `IN' - token, like latest POSIX drafts require - -lib/sh/tmpfile.c - - in sh_mktmpname(), check for filenum == 0 and init to non-zero number - in this case. it can happen on arithmetic overflow - -support/mkversion.sh - - added `[0-9].[0-9][0-9][a-z]' as an acceptable value for a - distribution to allow for intermediate versions, like 2.05a - -support/config.guess - - removed the addition of the output of `/usr/bin/objformat' when - creating the canonical name on FreeBSD machines, so the canonical - name is once again `freebsd4.2' instead of `freebsdelf4.2' - - 8/22 - ---- -lib/readline/{rlstdc,history,keymaps,readline,rldefs,rlprivate,rlshell, -rltypedefs,xmalloc}.h -lib/readline/{bind,compat,complete,display,funmap,histexpand,histsearch, -input,isearch,kill,nls,parens,readline,rltty,search,shell,signals,vi_mode - - changed __P to PARAMS - -lib/tilde/tilde.[ch] - - changed __P to PARAMS - -{Makefile,configure}.in - - changed the version number to 2.05a - - changed the release status to `alpha1' - - 8/23 - ---- -support/shobj-conf - - support for building shared libraries on Darwin/MacOS X - -siglist.h - - extern declaration for strsignal() to compensate for lack of - a definition in some system include files - -jobs.c - - remove casts from strsignal() calls - -[bash-2.05a-alpha1 frozen] - - 8/27 - ---- -[bash-2.05a-alpha1 released] - - 8/27 - ---- -execute_cmd.c - - fix eval_arith_for_expr to handle the case where the expanded - word list is NULL, returning 0 in this case - -print_cmd.c - - in print_function_def, make sure that func_redirects is assigned - a value before being used - - 8/28 - ---- -alias.c - - include for definition of isalpha() - -bashhist.h - - add prototypes for extern function declarations - -flags.c - - include bashhist.h for extern function declarations - -mksyntax.c - - include if HAVE_UNISTD_H is defined in config.h - -parse.y - - include test.h for extern function declarations - -externs.h - - change extern declaration for setlinebuf to sh_setlinebuf - -stringlib.c - - include for extern function declarations - -variables.h - - add function prototypes for all of the sv_* functions - -builtins/common.h - - add extern declarations for set_shellopts() and parse_shellopts() - from builtins/set.def - -variables.c - - include "hashcmd.h" for extern declaration for flush_hashed_filenames - - include "pathexp.h" for extern declaration for setup_glob_ignore - -lib/malloc/malloc.c - - cast to `long' instead of `int' in memalign for 64-bit machines - -{pcomplete,trap}.c - - changed printf escape sequences used to print pointers to %p - -lib/readline/undo.c - - include "xmalloc.h" for extern function declaration - -input.h - - add function prototypes to extern declarations for getc_with_restart - and ungetc_with_restart - -variables.[ch] - - changed type of `function' member of `struct name_and_function' to - `sv_func_t', which is defined and prototyped in variables.h - - map_over now takes an `sh_var_map_func_t *' - -shell.h - - start of a set of function pointer typedefs like those in - lib/readline/rltypedefs.h - -hashlib.[ch] - - second paramter to flush_hash_table is now an `sh_free_func_t *' - -trap.c - - parameter to reset_or_restore_signal_handlers is now an - `sh_resetsig_func_t *' - -pcomplete.h, pcomplib.c - - function pointer argument to print_all_compspecs is now an - `sh_csprint_func_t *' - - function pointer `list_getter' element of an `ITEMLIST' is now - prototyped with __P((...)) instead of using `Function *' - -jobs.[ch] - - `j_cleanup' member of a JOB is now an `sh_vptrfunc_t *' - -alias.c - - map_over_aliases now takes an `sh_alias_map_func_t *' - - free_alias_data now takes a `PTR_T' - -pathexp.c - - function pointer argument to ignore_globbed_names is now an - `sh_ignore_func_t *' - -bashline.c - - function pointer argument to _ignore_completion_names is now an - `sh_ignore_func_t *' - -pathexp.h,{bashhist,bashline.c - - `item_func' member of a `struct ignorevar' is now an - `sh_iv_item_func_t *' - -builtins/evalfile.c - - `errfunc' is now an `sh_vmsg_func_t *' - -jobs.c - - map_over_job now takes an `sh_job_map_func_t *' as its first argument - -array.[ch] - - function pointer argument to array_walk is now an - `sh_ae_map_func_t *' - -general.c - - tilde_expansion_preexpansion_hook has type `tilde_hook_func_t *', - and so the assignment in tilde_initialize doesn't need a cast - -list.c - - map_over_words now takes an `sh_icpfunc_t *' as its second argument - -input.h - - the `getter' and `ungetter' function pointer members of a - BASH_INPUT are now of types `sh_cget_func_t *' and - `sh_cunget_func_t *' respectively - - init_yy_io now takes an `sh_cget_func_t *' as its first argument and - an `sh_cunget_func_t *' as its second - -parse.y - - init_yy_io now takes an `sh_cget_func_t *' as its first argument and - an `sh_cunget_func_t *' as its second - - initialize_bash_input casts bash_input.getter and bash_input.ungetter - appropriately - -builtins/mkbuiltins.c - - make the extern function definitions written to builtext.h have - prototypes with __P((...)) - - include "stdc.h" - - change Function to mk_handler_func_t - - fixed comment_handler to take the right number of args - - prototyped all the handler functions with __P((...)) - -builtins.h - - the `function' member of a struct builtin is now of type - `sh_builtin_func_t *' - -builtins/common.[ch] - - last_shell_builtin, this_shell_builtin are now of type - `sh_builtin_func_t *' - - find_shell_builtin, builtin_address, find_special_builtin now return - `sh_builtin_func_t *' - -builtins/exit.def, {execute_cmd,jobs,nojobs,variables}.c, parse.y - - changed all declarations of last_shell_builtin and this_shell_builtin - -execute_cmd.c - - execute_builtin, execute_builtin_or_function, - execute_subshell_builtin_or_function now take an - `sh_builtin_func_t *' instead of a `Function *' for argument - - changed appropriate variables from `Function *' to - `sh_builtin_func_t *' - -builtins/{bind,builtin,enable,read,setattr}.def - - replaced uses of `Function *' in variable declarations with - appropriate types (sh_builtin_func_t * or rl_command_func_t *) - -builtins/set.def - - set_func and get_func members of binary_o_options are now of types - `setopt_set_func_t *' and `setopt_get_func_t *', which are - prototyped - -builtins/shopt.def - - set_func member of shopt_vars is now of type `shopt_set_func_t *' - -bashline.c - - enable_hostname_completion now returns `int' (the old value of - perform_hostname_completion) - -[The only use of Function and VFunction now is for unwind-protects] - - 9/4 - --- -lib/sh/getcwd.c - - use const define from config.h rather than `CONST' - - use PTR_T define from xmalloc.h rather than `PTR' - - include xmalloc.h for PTR_T - - remove PATH_MAX define, rely on value from maxpath.h - -{general,mailcheck}.c, lib/sh/{pathcanon,pathphys}.c - - don't include maxpath.h directly; it's already included by shell.h - -lib/sh/mailstat.c - - new `mailstat()' implementation, to stat a mailbox file for - mail checking. handles maildir-style mail directories with one - file per message and creates a dummy stat struct from them - -lib/sh/Makefile.in - - add mailstat.c and mailstat.o in the appropriate places - -lib/malloc/malloc.c - - augmented implementation with wrapper functions that pass in file - and line number information from cpp. currently unused, but a - placeholder for future debugging and use tracking - -lib/malloc/shmalloc.h - - new file, extern declarations for allocation wrapper functions for - use by the shell (and others, I guess) - -xmalloc.[ch] - - wrapper functions for xmalloc, xfree, xrealloc (sh_ prefixed) that - pass cpp line number information through to the malloc functions, - if USING_BASH_MALLOC is defined - - 9/5 - --- -lib/malloc/gmalloc.c - - removed; no longer part of distribution - -lib/malloc/Makefile.in - - removed references to gmalloc.[co] - -configure.in, doc/bashref.texi - - removed references to `--with-glibc-malloc' configure option - -{configure,Makefile}.in - - changed the way bash malloc is configured into the Makefile, making - it more like how readline is configured. If the bash malloc is - not configured in, nothing in lib/malloc will be built - - 9/6 - --- -lib/malloc/imalloc.h - - new file, some internal malloc definitions - -lib/malloc/mstats.h - - new file, definitions for malloc statistics structs and functions - -lib/malloc/trace.c - - new file, malloc tracing functions (currently just print messages - to stderr), code is #ifdef MALLOC_TRACE - -lib/malloc/stats.c - - new file, moved malloc stats code from malloc.c to here - -lib/malloc/malloc.c - - moved some definitions to imalloc.h - - moved stats code to stats.c - - malloc tracing calls added to internal_{malloc,realloc,free}, all - #ifdef MALLOC_TRACE - -lib/malloc/Makefile.in, Makefile.in - - added {imalloc,mstats}.h, {trace,stats}.c - -parse.y - - changed decode_prompt_string to save and restore $? - (last_command_exit_value) around calls to expand_prompt_string(), - so command substitutions in PS1, etc. don't change $? - -{array,subst}.c - - a couple more arrayind_t fixes from Paul Eggert - -configure.in - - remove redundant check for wait3(2) - -redir.h - - fixed a typo (stdin_redirs -> stdin_redirects) - - 9/10 - ---- -execute_cmd.c - - remove check for \n and \r from WHITESPACE macro, since those - chars are not whitespace as returned by the whitespace(c) macro - - getinterp now takes a `char *' as first arg, not unsigned char * - - execute_shell_script now takes a `char *' as first arg, not - unsigned char * - - fix typo in forward declaration for `initialize_subshell' - -general.[ch] - - check_binary_file now takes a (char *) argument, not unsigned char * - - pass unsigned char to isspace and isprint because of ISO C fuckup - - bash_tilde_expand now takes a `const char *' as its argument - -builtins/evalfile.c, shell.c - - buffer passed to check_binary_file is char, not unsigned char - -parse.y - - fix extern declaration for yyerror() - - yyerror now takes a `const char *' as first arg - -{error,jobs}.c - - fixes to printf-style functions to handle pids wider than an int - -lib/readline/{isearch,vi_mode}.c - - fix call to rl_message in rl_display_search (remove extra arg) - -variables.c - - fix missing argument to builtin_error in make_local_variable - -builtins/getopts.def - - since getopts takes no options, change while loop calling - internal_getopts to a simple `if' check - -builtins/printf.def - - since printf takes no options, change while loop calling - internal_getopts to a simple `if' check - -lib/readline/bind.c - - remove _SET_BELL macro, expand code inline - -lib/readline/input.c - - change _rl_input_available to use either select or FIONREAD, - but not both - -lib/readline/readline.c - - fix rl_digit_loop to remove unreachable code at end of loop - -{bashhist,bashline,expr,jobs,redir,shell}.c, builtins/fc.def, lib/sh/snprintf.c - - bracket unused functions with #ifdef INCLUDE_UNUSED/#endif - - remove some unused variables - -execute_cmd.c - - remove #ifdef'd code that allowed `return' to terminate a select - statement - -expr.c - - remove some extraneous tests from strlong() - -array.h - - arrayind_t is now a long, since shell arithmetic is performed as - longs - - remove second declaration of new_array_element - -builtins/printf.def - - in mklong, xrealloc cannot return NULL, so don't check for it - - remove some #if 0 code - - fix core dump triggered by a format specification with more than - one `*' - - remove `foundmod', since its value mirrors `modchar != 0' - - include "common.h" for builtin_{error,usage} declarations - -Makefile.in,builtins/Makefile.in - - updated some dependencies due to new include files - -pcomplete.c - - include "execute_cmd.h" for declaration of execute_shell_function - -arrayfunc.c - - include for printf - - include "builtins/common.h" for builtin_error declaration - -builtins/evalstring.c - - include "../trap.h" for run_trap_cleanup declaration - -builtins/help.def - - include "common.h" instead of locally declaring builtin_error - and builtin_usage - -error.h - - add extern declaration for itrace() - - add prototype to extern declaration of get_name_for_error - - file_error now takes a `const char *' as first argument - -externs.h - - added prototype for sh_setlinebuf declaration, bracketed with - NEED_SH_SETLINEBUF_DECL so we don't need stdio.h everywhere - - add extern declaration for parse.y:return_EOF() - -shell.c - - add NEED_SH_SETLINEBUF_DECL before including shell.h - -lib/readline/callback.c - - include or "ansi_stdlib.h" for abort declaration - -quit.h - - remove declaration of throw_to_top_level - -subst.c - - remove unused extern declaration for getopts_reset - -lib/sh/netopen.c - - include for legal_number, etc. - - add prototype for inet_aton extern declaration - -lib/sh/clock.c - - include for __P declaration - - add extern declaration for get_clk_tck - -support/mkversion.sh - - changed so that extern function declarations for functions in - version.c (moved from externs.h) are in the generated version.h - -shell.h - - include version.h - -version.c - - various `char *' version variables are now `const char *' - -general.h - - add prototype for same_file, bracketed with _POSIXSTAT_H - #ifdef, since that's what include/posixstat.h defines - -builtins/common.[ch] - - _evalfile, maybe_execute_file, source_file, and fc_execute_file - now take a `const char *' as their first argument - -eval.c - - removed extern declaration of yyparse; it's in externs.h - -parse.y - - added prototypes to static forward function declarations - - changed local `all_digits' variable in read_token_word () to - all_digit_token to avoid clash with all_digits() function in - general.c - -{bashhist,copy_cmd,make_cmd,hashlib,mailcheck}.c - - added prototypes for static function declarations - -shell.h - - add extern declarations for interactive, interactive_shell, - changed c files with extern declarations - -pcomplete.c - - changed it_init_aliases to avoid shadowing global variable - `aliases' - -bashline.c,pathexp.c,general.h - - sh_ignore_func_t is now a pointer to a function taking a - `const char *'; users changed - -configure.in - - test for - -config.h.in - - add #undef HAVE_STRINGS_H - -bashansi.h - - change like recommended in autoconf manual - - 9/11 - ---- -[a date which will live in infamy. prayers for the victims.] - -execute_cmd.c - - don't use an absolute index into abuf in mkfmt, use - sizeof(abuf) to compute last index - -builtins/common.c - - fix read_octal to do a better job of detecting overflow while - iterating through the string - -builtins/umask.def - - change octal-print mode to print 4 digits, like other shells - - cast umask to unsigned long to avoid problems on systems where - it's wider than an int (POSIX doesn't guarantee that mode_t is - no wider than an int, but real-world systems use int) - -builtins/printf.def - - mklong can never return NULL (it uses xrealloc), so the mainline - doesn't need to check for NULL returns - - new function, getldouble (long double *), to get long doubles - - mklong now takes a `char *' as its second argument, the modifier(s) - to use - - changed use of `modchar' to handle more than a single modifier - character - - changed to handle `long double' and `L' formats better, rather - than discarding long double information - - since printf now follows the POSIX.2 rules for conversion errors, - we can dispense with the status returns from the get* functions - - make the get* functions as similar in structure as possible, - removing type casts, etc. - -lib/sh/timeval.c,execute_cmd.c - - change some instances of `long' to `time_t', for systems where - a time_t is bigger than a long - -jobs.c - - include "posixtime.h" instead of - -config.h.in - - add defines for HAVE_DECL_CONFSTR, HAVE_DECL_STRTOLD, - HAVE_DECL_SBRK, HAVE_DECL_PRINTF - - remove defines for SBRK_DECLARED and PRINTF_DECLARED - - add _GNU_SOURCE define - -configure.in - - add AC_CHECK_DECLS for strtold, confstr, sbrk, printf - - remove call to BASH_FUNC_SBRK_DECLARED - - remove call to BASH_FUNC_PRINTF - -xmalloc.c, lib/malloc/malloc.c - - change check of SBRK_DECLARED to HAVE_SBRK_DECL - -print_cmd.c - - change PRINTF_DECLARED to HAVE_DECL_PRINTF - -builtins/evalstring.c, builtins/common.h - - parse_and_execute now takes a `const char *' as its second argument - -input.h,parse.y - - with_input_from_* functions now take a `const char *' as their - second argument - - init_yy_io now takes a `const char *' as its fourth argument - -parse.y,externs.h - - parse_string_to_word_list now takes a `const char *' as its second - argument - -tests/builtins.right - - change output to account for extra digit in umask output - -pcomplib.c - - free_progcomp now takes a PTR_T argument - -builtins/bashgetopt.h - - include - - add prototypes to extern declarations - -builtins/shopt.def - - add prototypes to static function declarations - -builtins/{fc,umask,wait}.def, builtins/{bashgetopt,common}.c - - include for isdigit macro (referenced by `digit(x)') - -lib/readline/complete.c - - added more static function declarations with prototypes - - 9/12 - ---- -lib/sh/tmpfile.c - - use `^' instead of `*' in sh_mktmpname to make filenames a bit - more random - -include/stdc.h,lib/readline/rldstdc.h - - add __attribute__ definition - -builtins/common.h - - add printf __attribute__ to declaration of builtin_error - -error.h - - add printf __attribute__ to declaration of programming_error, - report_error, parser_error, fatal_error, sys_error, internal_error, - internal_warning - -lib/readline/readline.h - - add printf __attribute__ to declaration of rl_message - -pcomplete.c - - add printf __attribute__ to declaration of debug_printf - -print_cmd.c - - add printf __attribute__ to declarations of cprintf, xprintf - -include/chartypes.h - - new file, includes and defines macros that check for - safe (ascii) arguments before calling the regular ctype macros - -{alias,bashline,execute_cmd,expr,findcmd,general,locale,mksyntax,stringlib,subst,variables}.c -parse.y -builtins/{bashgetopt,common}.c -builtins/{fc,printf,umask,wait}.def -lib/glob/strmatch.c -lib/sh/{oslib,pathcanon,pathphys,snprintf,strcasecmp,strindex,stringvec,strtod,strtol,strtrans}.c -examples/loadables/{head,sleep}.c - - include "chartypes.h" or instead of - -Makefile.in,{builtins,lib/{glob,sh}}/Makefile.in - - update dependencies to include chartypes.h - -lib/sh/inet_aton.c - - use `unsigned char' instead of `char' to pass to ctype.h functions - -lib/sh/netopen.c - - check for '0' <= host[0] <= '9' in _getaddr instead of using - isdigit - -subst.c,lib/sh/shquote.c - - change array subscripts into sh_syntaxtab from `char' to - `unsigned char' - -{alias,bashline,execute_cmd,expr,general,subst}.c, parse.y -builtins/{fc,printf,umask,wait}.def builtins/{bashgetopt,common}.c -lib/sh/{pathcanon,pathphys,snprintf,strcasecmp,strindex,strtod,strtol,strtrans}.c -examples/loadables/{head,sleep}.c - - change to use some of the new macros in chartypes.h - - remove old local macro definitions now provided by chartypes.h - -general.h - - remove definition of isletter, ISOCTAL, digit, digit_value - - change legal_variable_starter and legal_variable_char to use - chartypes.h macros - - change ABSPATH to use chartypes.h macros - -lib/readline/util.c - - change to use Paul Eggert's FUNCTION_FOR_MACRO define to define - function replacements for macros in chardefs.h - -lib/readline/chardefs.h - - added some of the same macros as in chartypes.h - - change _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p, - _rl_to_upper, _rl_to_lower to use new IS* macros - - added _rl_isident macro from vi_mode.c:isident - -lib/readline/{bind,complete,nls}.c - - change to use some of the new macros from chardefs.h - -lib/readline/vi_mode.c - - isident -> _rl_isident - - remove local defines of macros in chardefs.h - -lib/sh/strtol.c - - updated to new version, modified from glibc 2.2.4 and sh-utils-2.0. - This one can do strtoll and strtoull, if necessary - - 9/13 - ---- -builtins/ulimit.def - - changed get_limit so it retrieves both hard and soft limits - instead of one or the other - - changed callers of get_limit - - changed getmaxvm to take soft limit, hard limit as arguments - - changed getmaxuprc to just take a single argument, the value - - changed calls to printone() to pass soft limit or hard limit - depending on `mode' instead of using old current_limit variable - - moved check for out-of-range limits in ulimit_internal into the - block that converts a string argument to a value of type rlim_t - - changed RESOURCE_LIMITS struct to break the description into a - description string and separate scale factor string - - changed print_all_limits to print a single error message if - get_limit fails, including limits[i].description now that the - scale factor has been removed from the description string - - removed DESCFMT define, since it's now used only in printone() - - changed printone to print the option character associated with a - particular limit if we're printing multiple limits - - changed calls to builtin_error to print the description associated - with a limit if setting or getting the limit fails - - added support for new POSIX 1003.1-200x rlim_t values: - RLIM_SAVED_CUR and RLIM_SAVED_MAX, which expand to the current - soft and hard limits, whatever they are - - changed printone to print `hard' or `soft' if the current limit is - RLIM_SAVED_MAX or RLIM_SAVED_CUR, respectively - - changed ulimit_internal to handle new `hard' and `soft' arguments - - changed help text do describe the special limit arguments `hard', - `soft', and `unlimited' - -doc/{bash.1,bashref.texi} - - documented new `hard' and `soft' limit arguments to `ulimit' - -hashlib.[ch] - - find_hash_item now takes a `const char *' is its first argument - - hash_string now takes a `const char *' is its first argument - - remove_hash_item now takes a `const char *' as its first argument - -pcomplib.c - - removed cast from first argument to find_hash_item in find_compspec - -general.[ch] - - absolute_program now takes a `const char *' as its argument - - absolute_pathname now takes a `const char *' as its argument - -lib/glob/glob.[ch] - - glob_pattern_p now takes a `const char *' as its argument - -bashline.c - - removed cast from first argument to absolute_program in - command_word_completion_function - - removed cast from first argument to glob_pattern_p in - attempt_shell_completion - -findcmd.[ch] - - find_absolute_program, find_user_command, find_path_file, - search_for_command, user_command_matches now take a - `const char *' as their first argument - - file_status, executable_file, is_directory, executable_or_directory - now take a `const char *' as their argument - - _find_user_command_internal, find_user_command_internal, - find_user_command_in_path - -lib/sh/makepath.c, externs.h - - changed sh_makepath so it takes `const char *' for its first - two arguments - -hashcmd.[ch] - - find_hashed_filename now takes a `const char *' as its first arg - - remove_hashed_filename now takes a `const char *' as its first arg - -variables.[ch] - - new_shell_variable, var_lookup, shell_var_from_env_string, - find_name_in_env_array, bind_function, makunbound, - bind_name_in_env_array, bind_tempenv_variable, bind_variable - now take a `const char *' as their first arg - - find_function, make_new_variable, find_tempenv_variable, - find_variable_internal, find_variable, set_func_read_only, - set_func_auto_export, all_variables_matching_prefix, assign_in_env, - assignment, kill_local_variable, make_local_variable, unbind_variable - now take a `const char *' as their arg - - mk_env_string now takes `const char *' arguments - -arrayfunc.[ch] - - skipsubscript now takes a `const char *' as its argument - - 9/17 - ---- -lib/readline/complete.c - - attempt to preserve case of what the user typed in - compute_lcd_of_matches if we're ignoring case in completion - -builtins/{let,pushd}.def,{execute_cmd,expr}.c - - change some 0L constants to 0 and let the compiler sort it out - - 9/18 - ---- -lib/malloc/alloca.c - - alloca now takes a `size_t' argument - -include/memalloc.h - - if we're providing an extern function declaration for alloca, - use `void *' and prototype if __STDC__ is defined - - if HAVE_ALLOCA_H is defined, but C_ALLOCA is defined, don't - define HAVE_ALLOCA - - 9/19 - ---- -subst.c - - do_assignment_internal, do_assignment, and do_assignment_no_expand - now take a `const char *' as their first argument - -general.h - - a `sh_assign_func_t' is now a function taking a `const char *' and - returning int - -hashcmd.c - - free_filename_data now takes a `PTR_T' argument to agree with the - typedef for `sh_free_func_t' - -lib/sh/snprintf.c - - use TYPE_MAXIMUM define like strtol.c instead of huge constants - - 9/20 - ---- -lib/sh/snprintf.c - - don't bother to compile the bulk of the body unless HAVE_SNPRINTF - or HAVE_ASPRINTF is not defined - - 9/24 - ---- -flags.c - - ignore `set -n' if the shell was started interactively - -lib/readline/readline.c - - initialize readline_echoing_p to 0; let the terminal-specific code - in rltty.c set it appropriately - -lib/malloc/malloc.c - - changed internal_memalign() slightly to avoid compiler warnings about - negating an unsigned variable (-alignment -> (~alignment + 1)) - - 9/27 - ---- -lib/readline/readline.c - - changed rl_newline to set _rl_history_saved_point appropriately - for the {previous,next}_history code - -lib/readline/rlprivate.h - - extern declaration for _rl_history_preserve_point - -lib/readline/bind.c - - new bindable variable, `history-preserve-point', sets value of - _rl_history_preserve_point - - 10/1 - ---- -lib/malloc/table.c - - new file, with a map of allocated (and freed) memory for debugging - multiple frees, etc. Indexed by hash on values returned by - malloc(); holds size, file and line number info for last alloc or - free and a couple of statistics pointers - -lib/malloc/malloc.c - - a few cleanups; added calls for registering allocations and frees - if MALLOC_REGISTER is defined - - replaced MALLOC_RETURN with explicit MALLOC_NOTRACE define - - reordered fields in `struct...minfo' in `union mhead' to restore - eight-byte alignment - - added explicit checks for underflow in free and realloc since - checking mh_magic2 is not sufficient to detect everything (it's - no longer the last field in the struct, and thus not the bytes - immediately preceding what's returned to the user) - - new function, xbotch, for printing file and line number info for - the failed assertion before calling botch() (programming_error()) - -configure.in - - replaced call to BASH_C_LONG_LONG with call to - AC_CHECK_TYPES([long long]) - - moved the C compiler tests before the tests for various - system types, so we can know whether we have `long long' - before testing for 64-bit types - - if we have `long long', check for sizeof(long long) and save value - -aclocal.m4 - - changed BASH_TYPE_BITS64_T to check `long long' before `long', but - after `double' - - 10/2 - ---- -lib/malloc/malloc.c - - made malloc and realloc both agree on the rounding for a request of - size N (round up to nearest multiple of 8 after adjusting for - malloc overhead); uses new ALLOCATED_BYTES macro - - realloc and free now use new IN_BUCKET macro for underflow checks - -execute_cmd.c - - fixed time_command() to use `time_t' instead of `long' to hold - time stamps - -lib/sh/clock.c - - clock_t_to_secs now takes a `time_t *' second argument - - fixed print_clock_t to call clock_t_to_secs with right arguments - -lib/sh/timeval.c - - fixed print_timeval to make `minutes' a `long' and make its - structure identical to print_clock_t - -redir.c - - changed redirection_error to check for EBADF and use the file - descriptor being redirected from in the error message if it - is >= 0 - -Makefile.in - - changed release status to `beta1' - -lib/glob/collsyms.h - - added a few ASCII symbols to the posix_collsyms array - - 10/3 - ---- -aclocal.m4 - - fixed typo in BASH_TYPE_BITS64_T - -configure.in - - added check for unsigned chars with AC_C_CHAR_UNSIGNED - -config.h.in - - added PROTOTYPES and __CHAR_UNSIGNED__ #defines - -general.h - - if CHAR_MAX is not define by , provide a definition - -builtins/printf.def - - change tescape() to mask \0 and \x escape sequences with 0xFF - - change tescape() to process at most two hex digits after a `\x' - -lib/sh/strtrans.c - - change strtrans() to mask \0 and \x escape sequences with 0xFF - - change strtrans() to process at most two hex digits after a `\x'. - This affects `echo -e' and $'...' processing - -lib/readline/bind.c - - changed rl_translate_keyseq() to process at most two hex digits - after a `\x' - -lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1 - - changed documentation for key binding escape sequences to specify - that at most two hex digits after \x are translated - - changed documentation for key binding to specify that the result - of \nnn or \xhh escapes is an eight-bit value, not just ASCII - -doc/{bash.1,bashref.texi} - - changed documentation of $'...' to specify that at most two hex - digits after \x are translated - - changed `echo' documentation to specify that at most two hex - digits after \x are translated - - changed documentation for `echo' and $'...' to specify that the - result of \nnn or \xhh escapes is an eight-bit value, not just ASCII - - 10/4 - ---- -lib/malloc/malloc.c - - changed interface for xbotch to pass memory address and error code - as two additional arguments - - call mregister_describe_mem from xbotch to get the last allocation - or free before the botch - -configure.in - - call AC_CHECK_DECLS([strsignal]) - -config.h.in - - add HAVE_DECL_STRSIGNAL - -siglist.h - - make declaration of strsignal() dependent on !HAVE_DECL_STRSIGNAL - - 10/5 - ---- -support/texi2html - - upgraded to version 1.64 - - 10/9 - ---- -aclocal.m4 - - added check for `long long' to BASH_TYPE_PTRDIFF_T - -configure.in - - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ - -aclocal.m4 - - replaced body of BASH_STRUCT_TERMIOS_LDISC with call to - AC_CHECK_MEMBER(struct termios.c_line, ...) - - replaced body of BASH_STRUCT_TERMIO_LDISC with call to - AC_CHECK_MEMBER(struct termios.c_line, ...) - -[bash-2.05a-beta1 frozen] - - 10/10 - ----- -lib/sh/snprintf.c - - fixed exponent() to not smash the trailing zeros in the fraction - when using %g or %G with an `alternate form' - - fixed exponent() to handle the optional precision with %g and %G - correctly (number of significant digits before the exponent) - - 10/11 - ----- -expr.c - - fixed strlong() to correct the values of `@' and `_' when - translating base-64 constants (64#@ == 62 and 64#_ == 64), for - compatibility with ksh - -lib/sh/itos.c - - added a slightly more flexible fmtlong() function that takes a - base argument and flags (for future use) - - rewrote itos and inttostr in terms of fmtlong - -lib/sh/fmtulong.c - - new file, converts unsigned long to string. hooks for `unsigned - long long' in the future. unused as yet - - 10/15 - ----- -lib/readline/rltty.c - - change the SET_SPECIAL macro to avoid possible (but highly - unlikely) negative array subscripts - -error.h - - add __attribute__ to extern declaration of itrace (even though the - function isn't defined in released versions of bash) - -bashansi.h - - include if HAVE_STRINGS_H is defined, to get any extra - function declarations provided therein - -copy_cmd.c - - fix typo in forward declaration for copy_arith_for_command - -lib/malloc/stats.c - - make the accumulators in _print_malloc_stats be `unsigned long' - instead of `int' - -externs.h, sig.h - - add `__noreturn__' gcc attribute to exit_shell and jump_to_top_level - declarations - -lib/sh/mailstat.c, support/bashversion.c - - include for some string function declarations - -lib/malloc/shmalloc.h - - added extern declarations of functions that do malloc debugging - -lib/readline/{isearch,readline,vi_mode}.c - - make sure we index into _rl_keymap with a non-negative index - -parse.y - - make sure we index into sh_syntaxtab with a non-negative index - -lib/readline/vi_mode.c - - bound the vi_mark_chars array with the number of characters between - 'a' and 'z' rather than using a fixed amount - - don't use _rl_lowercase_p when deciding whether the char read by - rl_vi_set_mark is a valid mark; just use 'a' <= char <= 'z' - -lib/readline/chardefs.h - - conditionally include memory.h and strings.h as in general.h - - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software - - add defines for ISPRINT(c), ISLOWER(c) and ISUPPER(c) - - fix defines for _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p, - _rl_pure_alphabetic, ALPHABETIC, _rl_to_upper, _rl_to_lower, - and _rl_isident to work on systems with signed chars - -include/chartypes.h - - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software - -lib/sh/{strcasecmp,strtod,strtol}.c - - don't pass possibly-negative characters to tolower() or toupper() - -lib/glob/strmatch.c - - don't bother testing for isupper in FOLD; rely on TOLOWER macro - from to do it - - don't use local definitions of isblank, et al.; rely on macros - from - -lib/readline/{display,readline}.c, mksyntax.c - - use new ISPRINT macro instead of isprint() - -builtins/{kill.def,mkbuiltins.c},{error,execute_cmd,jobs,nojobs,subst}.c - - don't assume that a pid_t fits into an int for printing and other - uses - -variables.[ch] - - the unused put_gnu_argv_flags_into_env now takes a `long' pid - argument - -configure.in, config.h.in - - call AC_STRUCT_ST_BLOCKS, define HAVE_STRUCT_STAT_ST_BLOCKS if found - - check for strtoull(), define HAVE_STRTOULL if found - - check for uintmax_t, define to `unsigned long' if not found - -lib/sh/mailstat.c - - don't use st_blocks member of struct stat unless - HAVE_STRUCT_STAT_ST_BLOCKS is defined; otherwise use the st_nlink - field to return the total number of messages in a maildir-style - mail directory - -general.h,{alias,expr,general,subst,variables}.c -builtins/{printf,read}.def -lib/readline/{bind,complete,nls}.c -lib/sh/{pathcanon,pathphys,shquote,snprintf,strindex,strtod,strtol,strtrans}.c - - cast args to ctype macros to unsigned char for systems with signed - chars; other fixes for signed chars - -lib/sh/{fmtullong,strtoull.c} - - new files, more support for `long long' - -Makefile.in, lib/sh/Makefile.in - - make fmtullong.o and strtoull.o part of libsh - -lib/sh/itos.c - - remove local copy of fmtlong; use fmtulong instead - - new functions: uitos, uinttostr work on `unsigned long' - -lib/sh/snprintf.c - - fixes to make `unsigned long long' work (%llu) - - fixes to make unsigned formats not print the sign when given - an unsigned long that is greater than LONG_MAX - -externs.h - - extern declarations for fmtulong, fmtulloing, strtoull - - extern declarations for uitos, uinttostr - - 10/16 - ----- -configure.in - - move header checks before function checks - - move c compiler tests before header checks - - check for with BASH_HEADER_INTTYPES - - change type checks for intmax_t, uintmax_t to not attempt to - include - - check for strtoimax, strtoumax, strtoll, strtol, strtoull, strtoul - with BASH_CHECK_DECL (for declarations in header files) and - AC_REPLACE_FUNCS (for availability and LIBOBJS substitution) - - remove check for have_long_long around sizeof check for long long - (since autoconf will give it a size of 0 if the type isn't found) - -config.h.in - - add a define for HAVE_INTTYPES_H - - add a define for HAVE_UNSIGNED_LONG_LONG - - add defines for HAVE_STRTOIMAX, HAVE_STRTOUMAX, HAVE_STRTOLL - -aclocal.m4 - - new func, BASH_HEADER_INTTYPES, which just calls AC_CHECK_HEADERS - on ; separate so it can be AC_REQUIREd - - AC_REQUIRE([BASH_HEADER_INTTYPES]) in BASH_CHECK_TYPE - - include in BASH_CHECK_TYPE if HAVE_INTTYPES_H is - defined - - change AC_DEFINE to AC_DEFINE_UNQUOTED in BASH_CHECK_TYPE - - new `long long' checking macros: BASH_TYPE_LONG_LONG and - BASH_TYPE_UNSIGNED_LONG_LONG - - new BASH_CHECK_DECL - -lib/sh/{strto[iu]max,strtoll}.c, lib/sh/Makefile.in, Makefile.in - - new files - -externs.h - - extern declarations for strtoll, strtoimax, strtoumax - -lib/malloc/alloca.c - - include for size_t - -builtins/printf.def - - new functions: getllong, getullong, getintmax, getuintmax; return - long long, unsigned long long, intmax_t, uintmax_t respectively - - builtin printf now handles `ll' and `j' length modifiers directly - -lib/sh/Makefile.in - - use LIBOBJS to decide whether or not the strto* functions are - needed - - 10/17 - ----- -configure.in - - call AC_REPLACE_FUNCS(rename) - - move getcwd, strpbrk, strcasecmp, strerror, strtod - from AC_CHECK_FUNCS to AC_REPLACE_FUNCS - - only call BASH_FUNC_GETCWD if $ac_func_getcwd == "yes" - - call BASH_CHECK_SYS_SIGLIST - - if we don't have vprintf but have _doprnt, call AC_LIBOBJ(vprint) - -lib/sh/Makefile.in - - remove rename, getcwd, inet_aton, strpbrk, strcasecmp, strerror, - strtod, vprint from OBJECTS; picked up from LIBOBJS - -aclocal.m4 - - change BASH_FUNC_GETCWD to call AC_LIBOBJ(getcwd) if the libc - getcwd(3) calls popen(3) - - change BASH_FUNC_INET_ATON to call AC_LIBOBJ(inet_aton) if it's - not found in libc or as a #define even with the special includes - - BASH_KERNEL_RLIMIT_CHECK -> BASH_CHECK_KERNEL_RLIMIT - - BASH_DEFAULT_MAILDIR -> BASH_SYS_DEFAULT_MAILDIR - - BASH_JOB_CONTROL_MISSING -> BASH_SYS_JOB_CONTROL_MISSING - - BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS - - BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE - - BASH_DUP2_CLOEXEC_CHECK -> BASH_FUNC_DUP2_CLOEXEC_CHECK - - BASH_PGRP_SYNC -> BASH_SYS_PGRP_SYNC - - BASH_RLIMIT_TYPE -> BASH_TYPE_RLIMIT - - BASH_FUNC_PRINTF -> BASH_DECL_PRINTF - - BASH_FUNC_SBRK_DECLARED -> BASH_DECL_SBRK - - BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T - - BASH_CHECK_SOCKLIB -> BASH_CHECK_LIB_SOCKET - - new macro, BASH_CHECK_SYS_SIGLIST, encapsulates all the checks for - sys_siglist, _sys_siglist, and strsignal(), sets SIGLIST_O to - siglist.o if appropriate - -Makefile.in - - use SIGLIST_O variable to decide whether or not we need siglist.o - -{execute_cmd,subst}.c - - change a couple of instances of ISDIGIT to DIGIT, where we really, - really only want ascii digits - -ansi_stdlib.h - - don't need a declaration for atol() - - 10/18 - ----- - -aclocal.m4 - - new macro, BASH_FUNC_PRINTF_A_FORMAT, checks for printf support - for %a, %A conversion specifiers, defines HAVE_PRINTF_A_FORMAT - if successful - -configure.in - - call AC_CHECK_FUNCS for isascii - - call BASH_FUNC_PRINTF_A_FORMAT - -config.h.in - - add a define for HAVE_ISASCII - - add a define for HAVE_PRINTF_A_FORMAT - -lib/sh/snprintf.c - - for long double output, fall back to sprintf using ldfallback() - function for floating point formats - - support %a, %A using dfallback() or ldfallback() if - HAVE_PRINTF_A_FORMAT is defined - - fix bug in vasprintf that returned wrong value in its first - argument if the buffer holding the result string got reallocated - - fixed PUT_CHAR macro to increment the counter even if we've - exceeded the buffer size, for the return value from - vsnprintf/snprintf - - fix vsnprintf_internal to not use counter < length as a loop - condition, but always process the entire format string (for - the return value from vsnprintf/snprintf) - -builtins/printf.def - - support %a, %A if HAVE_PRINTF_A_FORMAT is defined - -include/typemax.h - - new file, with the TYPE_MAXIMUM stuff that's duplicated in several - files in lib/sh - -lib/sh/{fmtulong,strtol,snprintf}.c - - include instead of having the definitions in each file - -lib/sh/Makefile.in - - updated dependencies for typemax.h - - 10/22 - ----- -configure.in - - call AC_CHECK_FUNCS on ctype.h functions/macros that bash redefines - in chartypes.h - -config.h.in - - defines for HAVE_IS{ASCII,BLANK,GRAPH,PRINT,SPACE,XDIGIT} - -include/chartypes.h, lib/glob/strmatch.c, lib/readline/chardefs.h - - don't redefine some is* ctype macros/functions if HAVE_ISXXX is - defined (meaning that an appropriate function, but not a macro, - exists) - -lib/sh/strtrans.c - - new function, ansic_shouldquote, returns 1 if argument string - contains non-printing chars that should be quoted with $'...' - -externs.h - - new declaration for ansic_shouldquote() - -variables.c - - change print_var_value to ansi C quote the string if we're not in - posix mode and the variable's value contains non-printing chars, - to use the regular shell single quoting if the value contains - shell meta-characters, and to just output the string otherwise - -lib/sh/shquote.c - - add `break' to `case '~':' to avoid fallthrough and extra test - -doc/bashref.texi - - note that in POSIX mode, `set' displays variable values that - include nonprinting characters without quoting, unless they - contain shell metacharacters - -builtins/printf.def, lib/sh/snprintf.c - - handle `F' conversion specifier as equivalent to 'f' - -parse.y, {nojobs,variables}.c - - a couple of cleanups for when building a minimal configuration - -nojobs.c - - new function: stop_making_children(), just sets - already_making_children to 0 (like stop_pipeline) - -subst.c - - call stop_making_children from subst.c:command_substitute if - JOB_CONTROL is not defined. This fixes the bug where the wrong - process is waited for (and its status returned) when using - command substitution in a null command in a shell function - -builtins/printf.def - - new variable `tw' used to keep track of the total number of - characters written by a single call to `printf' -- to be - used for the `%n' conversion, which will be added later. It - gets reset each time we reuse the format string, which is what - ksh93 seems to do - - 10/23 - ----- -variables.c - - new function, bind_var_to_int (char *var, long val) - -variables.h - - extern declaration for bind_var_to_int - -lib/sh/netopen.c - - use gai_strerror() for error messages when getaddrinfo() fails - - use PF_INET if DEBUG is defined, since IPv6 doesn't work for me - -Makefile.in - - pass DEBUG=${DEBUG} down to makes in some subdirectories - -{builtins,lib/{glob,sh}}/Makefile.in - - append ${DEBUG} to LOCAL_CFLAGS value, passed by top-level Makefile - -builtins/printf.def - - added support for %n format conversion char (number of chars printed - so far from current format string) - - 10/24 - ----- -variables.c - - if posixly_correct is set, the default value of $MAILCHECK is 600 - - use legal_number instead of atoi in adjust_shell_level - - treat non-numeric assignments to SECONDS as 0 in assign_seconds - - new function, init_funcname_var; sets FUNCNAME as a dynamic variable - if it's not set in the initial environment - - new function, init_groups_var; sets GROUPS as a dynamic array - variable if it's not set in the initial environment - - new function, init_dirstack_var; sets DIRSTACK as a dynamic array - variable if it's not set in the initial environment - - new function, init_seconds_var; sets SECONDS as a dynamic - variable using any valid integer value in the initial environment - as the initial value, as if an assignment had been performed - - call init_funcname_var, init_groups_var, init_dirstack_var, - init_seconds_var from initialize_dynamic_variables - - non-numeric values assigned to LINENO are treated as 0 - - change initialize_shell_variables to not auto-export PATH or TERM - - change set_home_var to not auto-export HOME - - change set_shell_var to not auto-export SHELL - - broke the code that sets HOSTNAME, HOSTTYPE, MACHTYPE, OSTYPE - out into a separate function, set_machine_vars; none of those - variables are auto-exported - - bash no longer un-exports SSH_CLIENT or SSH2_CLIENT - -shell.c - - changed isnetconn() to check SSH_CLIENT and SSH2_CLIENT only if - SSH_SOURCE_BASHRC is defined in config-top.h - -config-top.h - - added a commented-out definition for SSH_SOURCE_BASHRC - - 10/25 - ----- - -Makefile.in - - changed RELSTATUS to `rc1' (release candidate 1) - - 10/29 - ----- -locale.c - - fixed an `=' vs. `==' typo in set_locale_var when parsing - LC_NUMERIC - -doc/{bash.1,bashref.texi} - - document what bash does with $POSIXLY_CORRECT - -doc/builtins.1 - - some updates - -builtins/psize.sh - - some mktemp(1) changes - -lib/readline/readline.c - - change rl_backward to check for rl_point < 0 and reset to 0 if so - -lib/readline/util.c - - don't compile in _rl_strpbrk if HAVE_STRPBRK is defined - -lib/readline/rlprivate.h - - remove extern declaration of _rl_strpbrk - -lib/readline/rldefs.h - - #define _rl_strpbrk as strpbrk if HAVE_STRPBRK is define, otherwise - add extern declaration of _rl_strpbrk from rlprivate.h - -{mailcheck,shell,variables}.c - - make sure to include posixtime.h to get any prototype for time(3) - in scope - -{array,eval,execute_cmd,mksyntax,subst}.c, parse.y -builtins/common.c -lib/sh/pathcanon.c - - a few changes as the result of `gcc -Wall' patches from solar - designer - -builtins/read.def, parse.y - - change some calls to free() to xfree() - -builtins/set.def - - make sure unset_builtin() resets unset_array to 0 each time through - the loop, because it's set (and used) depending on the current - argument - -shell.h - - new define, USE_VAR, to force the compiler to not put a particular - variable in a register -- helpful if registers are not restored - by setjmp/longjmp - -builtins/{evalfile.c,{read,wait}.def}, {eval,execute_cmd,shell,test}.c - - use USE_VAR for some variables - -subst.c - - fixed a case in expand_word_internal where a NULL pointer could - have been passed to free() (though free() should ignore it) - - fixed a case at the end of expand_word_internal where LIST could - have been used uninitialized (it makes gcc happy, though it - doesn't happen in practice) - -test.c - - give test_syntax_error(), beyond(), and integer_expected_error() - the `__noreturn__' attribute for gcc - -unwind_prot.c - - in clear_unwind_protect_list(), convert `flags' to `long' (via - assignment to a `long' variable) before casting to `char *', in - case pointers and longs are 64 bits and ints are 32 (makes no - difference on 32-bit machines) - - 10/30 - ----- -print_cmd.c - - fixed cprintf to avoid gcc warning about assigning const pointer - to non-const (discarding type qualifier) - -{make_cmd,pcomplete,test}.c,parse.y - - some minor changes to shut up gcc warnings - -lib/sh/tmpfile.c - - fixed sh_mktmpfp to avoid file descriptor leaks in the case that - sh_mktmpfd succeeds but fdopen fails for some reason - - change sh_mktmpfd to use the same scheme for computing `filenum' - as sh_mktmpname - - change get_sys_tmpdir to prefer P_tmpdir if P_tmpdir is defined - - changed sh_mktmpname and sh_mktmpfd to avoid trying to assign to - `nameroot' if `nameroot == 0' (duh) - - add code to sh_mktmpfd to use mkstemp(3) if USE_MKSTEMP is defined - - add code to sh_mktmpname to use mktemp(3) if USE_MKTEMP is defined - -support/{fixlinks,mkclone} - - use mktemp if it's available for the symlink test - - use $TMPDIR instead of hardcoding /tmp; default to /tmp - - use a better filename for the symlink test instead of `z' - -support/bashbug.sh - - more changes inspired by a patch from solar designer - -lib/malloc/Makefile.in - - new target `alloca', which builds libmalloc.a with alloca.o only - (for systems without alloca that are configured --without-bash-malloc) - -configure.in - - if we don't have a working alloca and are not configured to build - the bash malloc library, make a malloc library containing only - alloca.o - -aclocal.m4 - - slight change to RL_LIB_READLINE_VERSION to deal with minor version - numbers with a letter appended (like 4.2a) - - 10/31 - ----- -doc/{bash.1,bashref.texi} - - slight change to note that only interactive shells resend a SIGHUP - to all jobs before exiting - -externs.h - - declare strto[ui]max only if NEED_STRTOIMAX_DECL is defined. This - keeps picky compilers from choking because intmax_t is not defined - (MacOS X 10.1) - -builtins/printf.def - - #define NEED_STRTOIMAX_DECL before including shell.h - - 11/1 - ---- -general.c - - check in bash_tilde_expand() for an unquoted tilde-prefix; don't - bother passing the string to tilde_expand unless the prefix is - unquoted - -shell.c - - fix a problem with $LINENO when executing commands supplied with - the -c invocation option when ONESHOT is defined - -[bash-2.05a-rc1 frozen] - -builtins/printf.def - - fix the %n conversion to require that the variable name supplied - be a valid shell identifier - -variables.c - - improve random number generator slightly by using the upper 16 - bits of the running random number instead of the lower 16, which - are incrementally more random - - 11/2 - ---- -configure.in - - if RL_INCLUDEDIR ends up being /usr/include, don't put - -I$(RL_INCLUDEDIR) into CFLAGS - - 11/5 - ---- -doc/{bash.1,bashref.texi} - - correct description of POSIXLY_CORRECT to note that the shell enters - posix mode *before* the startup files are read if POSIXLY_CORRECT - is in the initial environment - -variables.c - - fix function prologues for init_dirstack_var and init_groups_var - to agree with caller (no arguments) - -jobs.c - - fix forward function declarations for pipe_read and pipe_close - -subst.c - - removed `inline' attribute from skip_double_quoted because it can - potentially be called recursively - -bashline.c - - quick fix to bashline.c:attempt_shell_completion programmable - completion code to just punt if the end of the command word found - by find_cmd_end is <= the start found by find_cmd_start (the bug - is probably in find_cmd_start -- fix later) - -pcomplete.c - - fix gen_matches_from_itemlist to return if the stringlist is null - after any cleaning or initialization, before trying to use it - - fix GEN_COMPS to only bother to try to append the STRINGLIST - returned by gen_matches_from_itemlist to `glist' if it's non-NULL - -lib/sh/stringlist.c - - make copy_stringlist return NULL if the STRINGLIST * passed as an - argument is NULL - - make append_stringlist call copy_stringlist only if M2 is non-NULL; - otherwise just return NULL if m1 is NULL - - make word_list_to_stringlist return 0 immediately if the passed - LIST argument is NULL - - make realloc_stringlist call alloc_stringlist if the passed - STRINGLIST argument (`sl') is 0, just like realloc calls malloc - -subst.c - - in skip_to_delim(), if we have an unclosed ${, and it's at the end - of the string (string[i] == '{', string[i+1] == '{' and - string[i+2] == 0, return si (i +2) immediately without bothering - to call extract_dollar_brace_string or extract_delimited_string - - in skip_to_delim(), if string[i] is 0 after a call to - extract_dollar_brace_string or extract_delimited_string (meaning we - have an unclosed ${ or other expansion, return i immediately without - doing a `continue' (which will increment i past the end of string) - - in split_at_delims, don't increment te by 1 if it's pointing to a - delimiter. this has the effect of skipping the first delimiter - char in a possibly multi-character delimiter, and ignoring - single-char delimiters like `>' - -configure.in - - use AC_CHECK_MEMBERS([struct stat.st_blocks]) instead of a call to - AC_STRUCT_ST_BLOCKS to avoid configure changing LIBOBJS if the test - fails - -general.c - - introduce two new variables: bash_tilde_{prefixes,suffixes}, set - to the additional prefixes and suffixes bash wants to pass to the - tilde expansion code (reserved for post-bash-2.05a fix) - -aclocal.m4 - - add missing `test' in BASH_CHECK_SYS_SIGLIST - - 11/7 - ---- -lib/readline/vi_mode.c - - fix rl_vi_goto_mark to explicitly check that the desired mark is - between 'a' and 'z', since some locales have lowercase letters - outside that range, which could cause a negative subscript - -include/chartypes.h - - remove superfluous `#undef ISASCII' - -lib/sh/strto[iu]max.c - - changes from Paul Eggert to work around buggy compilers and catch - configuration errors at compile time - -aclocal.m4 - - new macro, BASH_C_LONG_DOUBLE, identical to AC_C_LONG_DOUBLE but - with a fix for Irix 5.3 (not called, since I'm not sure it's the - right thing to do -- the C standard allows double and long double - to be the same size) - -lib/sh/snprintf.c - - only try to write the trailing NUL in vsnprintf_internal if - data->length is >= 0, since if it's not, we probably don't have - a buffer - -Makefile.in - - changed RELSTATUS to `release' - - 11/8 - ---- -lib/sh/strtol.c - - make sure chars passed to toupper are cast to unsigned - -unwind_prot.c - - change clear_unwind_protect_list to not require a cast from `int' - to `char *' - -lib/readline/chardefs.h - - make _rl_digit_p succeed only for ascii digits, since that's what - most callers assume - - 11/13 - ----- -doc/bashref.texi - - added `ERR' trap and [-+]O invocation option to section listing - differences from the Bourne shell - - 11/15 - ----- -[bash-2.05a released] - - 11/19 - ----- -include/stdc.h - - new define, INLINE, defined as `inline' for gcc and empty otherwise - -subst.c - - make skip_double_quoted, sub_append_string have INLINE attribute - -trap.c - - use BASH_NSIG as upper limit for signal names in signal_name() - -lib/readline/bind.c - - use RL_COMMENT_BEGIN_DEFAULT in output for rl-comment-begin value - -error.c - - fix sys_error to save value of errno around calls to fprintf - -doc/Makefile.in - - added rules to create PDF files from postscript and dvi input - -MANIFEST.doc - - added {article,bash,bashref,rose94}.pdf - -doc/bash.1 - - rearranged some `.PD 0' and `.TP' directives so man2html will - handle them better (shouldn't affect groff output) - -support/man2html.c - - small fix to handle quoted string arguments to directives like - `.BR' without mangling the output - - 11/20 - ----- -{arrayfunc,variables}.c - - changed calling sequence for dynamic array variable `assign' - functions to (SHELL_VAR *self, char *value, arrayind_t ind) - - changed calling sequence for dynamic variable assign functions - to the same as array variable assign_func. Now this can be - prototyped - -variables.h - - the assign_func member of a `struct variable' is now of type - `sh_var_assign_func_t', which is prototyped - - the dynamic_value member of a `struct variable' is now of type - `sh_var_value_func_t', which is prototyped - -variables.c - - changed to use `sh_var_assign_func_t' and `sh_var_value_func_t' - -builtins/cd.def - - when in posix mode, if the new directory name formed by PWD and - the argument passed by the user cannot be canonicalized, and the - -P option has not been supplied, return failure immediately - - if canonicalization failed, but the fallback to the directory - name specified by the user succeeds, reset the current working - directory - -lib/readline/{input.c,rlprivate.h} - - renamed rl_unget_char to _rl_unget_char; made library global - -lib/readline/{{bind,readline}.c,{keymaps,rlprivate}.h} - - support for `key subsequences'; allows a key sequence and a function - mapped to a subsequence of that key sequence. Primarily to allow - arrow keys to be bound in readline vi insert mode, while preserving - the ESC function to switch to command mode. - -lib/readline/{input.c,rlprivate.h} - - new function, _rl_input_queued(T), does a check with select or - FIONREAD with a timeout of `T' (which is generally 0) - -lib/readline/readline.c - - change _rl_dispatch_subseq to test for input in the queue if we - get ESC while in vi insertion mode if the keymap entry type for - ESC is ISKMAP. If _rl_input_queued returns non-zero, we assume - that an arrow key sequence has been pressed and go ahead with the - subsequence. If it returns zero, we assume that the user pressed - ESC to switch into command mode, and dispatch to that right away. - This avoids forcing the user to press another key before switching - into command mode - - 11/21 - ----- -lib/readline/readline.c - - bind common arrow key sequences in vi insertion keymap - -lib/readline/terminal.c - - bind termcap definition's arrow keys in vi insertion keymap - -lib/readline/bind.c - - check for rl_vi_movement_mode in _rl_bind_if_unbound, so - binding the arrow keys can work - -lib/readline/readline.c - - since _rl_bind_if_unbound does the check of what's currently - bound to the key sequence, the check in bind_arrow_keys_internal - was redundant - - bind_arrow_keys_internal now takes a Keymap argument and handles - saving and restoring _rl_keymap; changed bind_arrow_keys - accordingly - -builtins/fc.def - - fix from Paul Eggert to substitute the nearest history number in - range if an out-of-range value is supplied. POSIX requires this - -lib/sh/pathcanon.c - - fix from Corrina Vinschen for the special `cygdrive' prefix on - Cygwin - -bashhist.c - - split the history adding code into more pieces: - check_history_control (char *line) checks LINE against the value - of HISTCONTROL, returning 1 if LINE should be saved and 0 if not - - check_add_history (char *line) calls check_history_control and - history_should_ignore (line) and saves the line with - bash_add_history if the checks indicate that it should be saved - - maybe_add_history just calls check_add_history to set the value - of first_line_saved - -bashhist.h - - extern declaration for check_add_history() - -shell.c - - don't call load_history() from the interactive shell startup - code if history_lines_this_session is > 0, indicating that we've - already saved some lines in the history and that we probably - don't want to overwrite them - -builtins/history.def - - call check_add_history from push_history, so `history -s xx' - works even when in a compound command whose first line has not - been saved. (Caveat: in a compound command when the first - line has been saved, the line supplied to history -s will become - part of the compound command's history entry. Of course, the - delete_history call could remove the compound command from the - history entirely) - -bashline.c - - use sh_makepath instead of xmalloc/sprintf in - command_word_completion_function - -lib/readline/complete.c - - get_y_or_n now takes an int FOR_PAGER argument; caller changed - If FOR_PAGER is non-zero, get_y_or_n returns appropriate values - for a more-like pager: `newline' or `return' return 2; `q' or - `Q' return 0 - - there is now a mini internal more-like pager for displaying a - list of completions that exceeds the screen height (new function - _rl_internal_pager, called from rl_display_match_list) - - 11/24 - ----- -command.h - - new flag, W_TILDEEXP, says to do tilde expansion on an - assignment word - -execute_cmd.c - - fix_assignment_words now sets W_TILDEEXP for assignment word - arguments to `assignment builtins' - -general.c - - bash_tilde_expand now takes a second argument indicating whether - or not it's being invoked in an `assignment context' - -general.h - - change extern declaration for bash_tilde_expand - -{bashline,execute_cmd,findcmd,general,variables}.c -builtins/evalfile.c -lib/sh/makepath.c - - fix callers of bash_tilde_expand appropriately - -subst.c - - fix callers of bash_tilde_expansion appropriately - - add (currently commented-out) code that would tilde expand assignment - statement arguments to assignment builtins (W_TILDEEXP flag set) - even when the shell is in posix mode - -bashline.c - - fix attempt_shell_completion to turn off - rl_filename_completion_desired when doing command name completion, - so no slash gets appended to the name if there happens to be a - directory with the same name in the current directory - - 11/26 - ----- -lib/readline/rltech.texinfo - - a couple of additions to the rl_stuff_char description - -parse.y - - turn off echo_input_at_read in parse_string_to_word_list, so `set -v' - doesn't give extra lines of output when doing compound array - assignment - -subst.c - - fix split_at_delims to handle skipping over a `\n' if it's a - delimiter (use spctabnl(c) instead of whitespace(c)) - - 11/27 - ----- -support/config.{guess,sub} - - updated (with bash changes) to latest version from gnu.org - -sig.h - - add prototype for set_signal_handler declaration - -builtins/setattr.def - - add prototype to extern declaration of declare_builtin - -builtins/times.def - - add no_options call, since times takes no options - -lib/sh/spell.c - - add prototypes to forward declarations for midist and spdist - -lib/sh/strtrans.c - - add explicit int return type to ansic_shouldquote declaration - -lib/readline/rldefs.h, lib/readline/{macro,readline,util,undo}.c - - move define for SWAP to rldefs.h, removed from various C files - -lib/readline/vi_mode.c - - removed define for exchange(), changed to use SWAP instead - -lib/readline/bind.c - - added some static forward function declarations - - find_boolean_var, find_string_var now take a `const char *' argument - -lib/readline/signals.c - - added static forward declaration for rl_maybe_set_sighandler - -lib/readline/readline.c - - add some common key bindings for the HOME and END keys in - bind_arrow_keys_internal - -lib/readline/terminal.c - - fetch the `@7' termcap string; it's sent by the END key - - attempt to bind the terminal's END key to rl_end_of_line in - bind_termcap_arrow_keys; I don't know why I was using `kH' - instead of `@7' - -doc/builtins.1 - - remove `case', `for', `if', `until', `while' from NAME section; - those are not shell builtins - - 11/28 - ----- -stringlib.c - - new function, find_token_in_alist, takes a token value and an - ALIST argument, and returns the string correspoinding to the - token if found in the alist - -externs.h - - new extern declaration for find_token_in_alist() - -subst.c - - string_list_internal is no longer static - -subst.h - - new extern declaration for string_list_internal() - -parse.y - - new alist array of other tokens returned by read_token which are - not reserved words in word_token_alist[] - - reworked error reporting: new functions print_offending_line, - which prints the line containing the syntax error, - error_token_from_token, which takes the current token and tries to - figure out its textual representation, and error_token_from_text, - which does the old job of finding the bad token by analyzing the - text of shell_input_line at the current index - - report_syntax_error now tries to figure out the token that caused - the syntax error by first looking at current_token and falling - back to the old method of textual analysis if that fails - - report_syntax_error doesn't say the token resulting from the textual - analysis of the input line is an `unexpected token'; it just - says there is a `syntax error near xxx' - - changed conditional command error reporting to use the value - returned by error_token_from_token if it's not null instead of - just using the token value in the message, since current_token - ends up being set to -1, and the text of the message from - report_syntax_error might not be exactly right - - change parse_string_to_word_list to set current_token to the - offending token returned by read_token before calling yyerror() - to make the error reporting do the right thing - -aclocal.m4 - - fixed typo in BASH_CHECK_LIB_TERMCAP - -configure.in - - add check for isinf(3); define HAVE_ISINF_IN_LIBC if found - -config.h.in - - add define for HAVE_ISINF_IN_LIBC - -lib/sh/snprintf.c - - check for Inf and NaN, using isinf and isnan if they're found in - libc - - use the current locale for thousands separator and decimal point - - recognize "'" flag; not implemented yet - - fix for snprintf/vsnprintf with length of 0 and string argument of - 0 with non-zero length - -builtins/read.def - - TMOUT is now the default timeout for `read' (and select) if set, - like ksh93 when reading from the terminal - - edit_line (called by read -e) now just does readline's filename - completion by setting rl_attempted_completion_function to NULL, - since e.g., doing command completion for the first word on the - line wasn't really useful - -execute_cmd.c - - changed select_command to return failure status if select_query - returns NULL, indicating that read_builtin returned - EXECUTION_FAILURE - -doc/{bash.1,bashref.texi} - - documented new TMOUT behavior - - slight change to the description of the test `-ef' option - -doc/bashref.texi - - added item to posix mode section describing failure behavior of - cd when invoked in logical mode and the pathname formed by - combining $PWD and the directory argument does not refer to an - existing directory - - 11/29 - ----- -execute_cmd.c - - fix execute_function to call dispose_function_env after - merge_function_env if the shell is in posix mode (fixes debian - bash bug #117673) - -lib/readline/readline.c - - rl_forward -> rl_forward_char; rl_forward function for compatibility - - rl_backward -> rl_backward_char; rl_forward function for - compatibility - - new functions, rl_forward_byte, rl_backward_byte, for future use - -lib/readline/readline.h - - extern declarations for rl_forward_char, rl_backward_char, - rl_forward_byte, rl_backward_byte - -lib/readline/{emacs_keymap,funmap,vi_keymap,vi_mode - - rl_forward -> rl_forward_char - - rl_backward -> rl_backward_char - -lib/readline/funmap.c - - new bindable names, `backward-byte' and `forward-byte' - -aclocal.m4 - - new function, BASH_CHECK_MULTIBYTE, encapsulates checks for - multibyte code - -config.h.in - - add necessary defines for multibyte include files and functions - -configure.in - - add call to BASH_CHECK_MULTIBYTE - -config-bot.h - - add code to define HANDLE_MULTIBYTE if prerequisites are met - -lib/sh/xstrchr.c - - new file, xstrchr() is strchr(3) that handles multibyte characters - -bashhist.c - - first_line_saved -> current_command_first_line_saved; variable is - now global - -bashhist.h - - extern declaration for current_command_first_line_saved - - 11/30 - ----- -bashhist.c - - break the code that actually calls add_history out of - bash_add_history into a new function, really_add_history; - bash_add_history now calls really_add_history - - check_add_history takes a second `force' argument telling it - whether to call bash_add_history (force == 0) or really_add_history - (force != 0) - -builtins/history.def - - in push_history, call delete_last_history if the current command - has more than one line, the first line was saved, and - command-oriented history is active. This takes care of deleting - the right history element if `history -s' is used within a - compound or multiline command - - in push_history, call check_add_history with second argument of 1 - to skip check of current_command_line_count and add the arguments - to history -s as a single separate history entry - - 12/3 - ---- -lib/readline/complete.c - - append a slash to completed names which are symlinks to directories - if the new variable _rl_complete_mark_symlink_dirs is non-zero - -lib/readline/rlprivate.h - - extern declaration for _rl_complete_mark_symlink_dirs - -lib/readline/bind.c - - new bindable variable, `mark-symlinked-directories', mirrors the - value of _rl_complete_mark_symlink_dirs - -doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo} - - documented new `mark-symlinked-directories' variable - - 12/4 - ---- -variables.[ch] - - set_pipestatus_array now takes a second argument with the number - of processes in the array - - changed set_pipestatus_array to just modify the value in place if - the existing array has one element and the new array has one - element, and to modify existing values in place if new array has - more elements than existing array - -variables.c, jobs.c - - changed set_pipestatus_array callers - -jobs.c - - moved call to setjstatus() from set_job_status_and_cleanup to - wait_for, since set_job_status_and_cleanup is part of the SIGCHLD - signal handler call path, and race conditions accessing the - PIPESTATUS array will result for things like - - while true; do date; done | cat > /dev/null - - 12/5 - ---- -xmalloc.h - - don't redefine xmalloc, xrealloc, and xfree if DISABLE_MALLOC_WRAPPERS - is #defined - -config.h.in - - #undef for DISABLE_MALLOC_WRAPPERS - -configure.in - - define DISABLE_MALLOC_WRAPPERS if the --with-purify option is - supplied - -lib/malloc/trace.c - - new function, malloc_trace_bin(N), traces allocations and frees - to bucket N (uses the same type of bitmap as `busy') - -lib/malloc/table.c - - fix wraparound search problem in find_entry when searching for a - free entry when the table is full - - 12/6 - ---- -lib/malloc/table.c - - keep an `overflow bucket' around to use when the table is full, - so find_entry always returns a valid pointer when FIND_ALLOC - is set - - new static variable to keep a count of the number of MT_ALLOC - entries in the mem_table - -lib/sh/{oslib,clktck}.c - - if HAVE_LIMITS_H is defined, include - -lib/sh/oslib.c - - new function, getmaxgroups() returns max number of simultaneous - groups - - new function, getmaxchild(), returns max number of simultaneous - user processes - -general.c - - removed forest of #defines for getmaxgroups() - -externs.h - - new extern declaration for getmaxgroups() - - new extern declaration for getmaxchild() - - new extern declaration for isnetconn() - -lib/sh/netconn.c,shell.c - - new file, isnetconn() from shell.c moved here - -Makefile.in, lib/sh/Makefile.in - - necessary changes for netconn.c - -builtins/ulimit.def - - changed getmaxuprc() to just call getmaxchild() and massage the - return value appropriately - -{jobs,nojobs}.c - - use the value returned by getmaxchild() in - mark_dead_jobs_as_notified instead of static CHILD_MAX - -jobs.c - - new function, compact_jobs_list, removes some number of jobs from - the jobs table and reallocates the table, copying the jobs that - are left from the old table to the new. Compaction happens from - the beginning of the list and removes dead jobs, and we make sure - to keep the last CHILD_MAX jobs as POSIX.2 requires - - call compact_jobs_list from stop_pipeline if we're in a subshell, - there are no free jobs in the jobs table, and the jobs table is - at or above some maximum limit - -execute_cmd.c - - change eval_arith_for_expr to set this_command_name to `((' before - calling evalexp, since it might be changed by evaluating the - loop body between evalexp calls - -trap.c - - change reset_signal to turn off the SIG_TRAPPED flag for the - given signal, so shell builtins and functions running in command - substitutions don't run the signal handlers (traps are not supposed - to be inherited by command substitutions) - -parse.y - - changed parse_string_to_word_list to turn off alias expansion - while parsing the array assignment - - 12/9 - ---- -alias.c - - fix add_alias so that redefining an alias's value also resets the - EXPANDNEXT flag - - 12/10 - ----- -parse.y - - new function, token_is_assignment, called to check whether the text - before `=' makes up a valid assignment token before trying to parse - a compound assignment statement - - new function, parse_compound_assignment, to parse a compound - assignment statement instead of using parse_matched_pair; handles - comments and error reporting in the parser instead of waiting until - expansion time - - changed parse_compound_assignment and parse_string_to_word_list to - allow reserved words in compound array assignments - -lib/readline/doc/rltech.texinfo - - changed the documentation for rl_callback_read_char and - rl_callback_handler_remove to say what happens to the terminal - settings and what needs to be done to reset them - - 12/11 - ----- -bashline.c - - add emacs_edit_and_execute_command, bound to C-xC-e, like vi-mode - `v' command - - add bindable command name `edit-and-execute-command', bound to - run emacs_edit_and_execute_command() - -lib/glob/strmatch.c - - add support for ksh93-like [:word:] character class (isalnum + `_') - -doc/{bash.1,bashref.texi} - - add note to section describing lists to clarify that a sequence of - one or more newlines may be used to delimit a command, equivalent - to a semicolon - - document new [:word:] pattern matching character class - -doc/bash.1, lib/readline/doc/rluser.texinfo - - document `edit-and-execute-command' and its default emacs-mode - binding - -include/chartypes.h - - add defines for TOCTRL and UNCTRL if they're not already defined - -lib/readline/chardefs.h - - #undef UNCTRL if it's defined to avoid cpp redefinition warnings - -lib/sh/strtrans.c - - add \cX (Control-X) escape for $'...' to ansicstr() - - change ansic_quote() to allocate at least four chars for each char - in the string argument, to account for \0xx octal values - - change ansic_quote() to no longer call sprintf for non-printable - characters; just translate the string to octal directly - -print_cmd.c - - change xtrace_print_word_list to call ansic_quote() if - ansic_shouldquote() indicates that there are nonprinting characters - in a word - -builtins/type.def - - changed deprecated long option parsing to just replace the word - in the list with the equivalent short option (-type -> -t) instead - of removing words from the list - - changed describe_command to take a single flags argument instead - of two int args; changed caller - - type now has two new options: -f suppresses function lookup (like - command), and -P forces a PATH search for the name(s) - -builtins/common.h - - flags for describe_command are here - - changed extern declaration of describe_command - -builtins/command.def - - changed call to describe_command to use flags from common.h, and - the right number of arguments - -doc/{bash.1,bashref.texi} - - documented new -f and -P options to `type' - - 12/12 - ----- -lib/readline/rldefs.h - - fixed prototype for _rl_strnicmp - -execute_cmd.c - - select_query now takes a new argument, an int flag saying whether - or not to print the menu the first time through the loop. An - empty line in response to the prompt will always cause the menu - to be reprinted - - changed execute_select_command to cause select_query to reprint - the menu only if REPLY is set to NULL, if KSH_COMPATIBLE_SELECT - is defined - -config-top.h - - define KSH_COMPATIBLE_SELECT, with a comment about its meaning - -lib/readline/readline.c - - change rl_insert_comment to toggle if given an explicit numeric - argument: if the first characters on the line don't specify a - comment, insert one; if they do, delete the comment text - -doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo} - - documented new behavior of insert-comment with a numeric argument - - 12/13 - ----- -lib/malloc/watch.c - - new file, implements watchpoint functions - -lib/malloc/watch.h - - new file, define some `events' for watchpoints and extern function - and variable declarations for watchpoint code - -lib/malloc/imalloc.h - - #define MALLOC_WATCH if MALLOC_DEBUG is defined - - add __P define as in include/stdc.h if not already defined - -lib/malloc/malloc.c - - remove __P define, now in imalloc.h - - include watch.h if MALLOC_WATCH is defined - - added calls to _malloc_ckwatch in internal_malloc, internal_free, - and internal_realloc - -include/stdc.h - - augment __P define to allow prototypes if PROTOTYPES is defined - -lib/readline/rlstdc.h - - augment PARAMS define to allow prototypes if PROTOTYPES is defined - -lib/malloc/Makefile.in, Makefile.in - necessary changes to include watch.c in libmalloc - -lib/readline/readline.c - - fix rl_delete_text to make sure that the starting position is >= 0 - - _rl_init_line_state (called by readline via readline_initialize) - now sets rl_mark to 0 - - rl_get_{next,previous}_history set rl_mark to 0 if rl_point is at - the end of the line and rl_end otherwise in emacs mode - -lib/readline/kill.c - - rl_yank_nth_arg_internal and rl_paste_clipboard now set the mark - at point before calling rl_insert_text, like rl_yank - - rl_kill_full_line now resets rl_mark to 0 - - rl_kill_line and rl_backward_kill_line now set rl_mark to the - point after the kill in emacs mode - - rl_kill_word and rl_backward_kill_word now set rl_mark to the - point after the kill in emacs mode - - rl_unix_word_rubout and rl_unix_line_discard now set rl_mark to - the point after the kill in emacs mode - -lib/readline/search.c - - noninc_search saves and restores the mark, since it can be changed - while reading the search string - - noninc_dosearch sets the mark at the end of the line, making the - region bound the `inserted' text since rl_point is set to 0 - - rl_history_search_internal sets the mark at the end of the line, - for the same reason - -lib/readline/isearch.c - - rl_search_history now saves and restores the mark - - if no matching lines are found at all when doing an isearch, leave - point where it was instead of moving it to the end of the line - - 12/17 - ----- -lib/readline/rlmbutil.h - - new file, place for multi-byte character defines and extern - declarations - -lib/readline/{bind.c,readline.c,rlprivate.h} - - new bindable variable, `byte-oriented', tracks value of - rl_byte_oriented variable - -lib/readline/mbutil.c - - new file, with multibyte char utility functions - -lib/readline/{complete,display,readline,util,vi_mode}.c - - new code for multibyte characters, derived from IBM patch - - 12/18 - ----- -lib/sh/tmpfile.c - - include posixtime.h for time() extern declaration - -support/bashversion.c - - include if it's available - -lib/readline/{histexpand,input,isearch,search}.c - - new code for multibyte characters, derived from IBM patch - -lib/readline/readline.h - - include rltypedefs.h - - 12/19 - ----- -lib/readline/complete.c - - slight change to mark-directories code to avoid adding a slash if - point is at the end of the line (rl_line_buffer[rl_point] == '\0') - and the previous character was a slash - - change printable_part to not return empty pathnames, which could - happen when completing filenames and a filename with a trailing - slash was passed as the argument. If the portion following the - trailing slash is NULL, ignore it and look for a previous slash. - If there's no previous slash, just return the filename argument - - new variable, rl_completion_mark_symlink_dirs, mirrors the value - of (user-settable with a variable) _rl_complete_mark_symlink_dirs - but may be modified by application-specific completion functions - when appropriate (set in rl_complete_internal and rl_menu_complete) - -lib/readline/readline.h - - extern declaration for rl_completion_mark_symlink_dirs - -pcomplete.c - - if one of the actions is CA_DIRECTORY, set - rl_completion_mark_symlink_dirs to indicate that we want the - trailing slash (might have to relax this) - -lib/readline/doc/rltech.texinfo - - documented rl_completion_mark_symlink_dirs variable - -lib/readline/doc/rluser.texinfo, doc/bash.1 - - documented the fact that `complete -d' and `complete -o dirnames' - force readline to append a slash to symlinks to directories - -builtins/enable.def - - changed enable_shell_builtin to disallow enabling disabled - builtins in a restricted shell - -doc/{bash.1,bashref.texi} - - documented new enable behavior in restricted shells - -doc/Makefile.in - - new rule to make an `RBASH' file documenting the restrictions - imposed by a restricted shell - -expr.c - - broke the code that evaluates variables and returns results out - of readtok() into a new function: expr_streval() - - expr_streval() now performs the standard unset variable error - behavior if `set -u' has been executed and it's asked to look - up an unset variable - - broke the code that frees up the expression context stack into - a new function: expr_unwind() - -variables.c - - fixed bind_int_variable so it handles array element assignment, - so expressions like `b[7]++' and `b[0] = 42' work right - - new function, get_variable_value, returns the string value of - the SHELL_VAR * passed as an argument - - get_string_value now calls get_variable_value with a non-null - result from find_variable - - 12/20 - ----- -lib/readline/rlmbutil.h, mbutil.c - - combined _rl_find_next_mbchar and _rl_find_next_nonzero_mbchar into - a single function - - combined _rl_find_prev_mbchar and _rl_find_prev_nonzero_mbchar into - a single function - -lib/readline/{display,readline,vi_mode}.c - - changed callers of _rl_find_next_mbchar and - _rl_find_next_nonzero_mbchar - -lib/readline/{complete,display,histexpand,readline,vi_mode}.c - - changed callers of _rl_find_prev_mbchar and - _rl_find_prev_nonzero_mbchar - - 12/20 - ----- -lib/sh/mktime.c - - new file, from glibc/gawk, compiled in if system doesn't have a - working mktime(3) - -lib/sh/strftime.c - - new file, from gawk, compiled in if system doesn't have a - working strftime(3) - -lib/sh/Makefile.in, Makefile.in - - changes for mktime.c, strftime.c - -configure.in - - call AC_FUNC_MKTIME, AC_STRUCT_TM, AC_STRUCT_TIMEZONE - - call AC_REPLACE_FUNC(strftime) - -config.h.in - - add defines for TM_IN_SYS_TIME, HAVE_TZSET, HAVE_TM_ZONE, - HAVE_STRUCT_TM_TM_ZONE, HAVE_STRFTIME - -externs.h - - provide an extern declaration for strftime if HAVE_STRFTIME is - not defined and NEED_STRFTIME_DECL is - -lib/tilde/tilde.h - - header files should not include - -parse.y - - replace code in decode_prompt_string that chops up value returned - by ctime(3) with calls to strftime -- as a result, the expansion - of \@ has changed slightly (since it depends on the locale) - - added new \D{format} prompt string escape; `format' is passed to - strftime(3). Empty format is the same as `%X' (locale-specific - representation of the current time) - - combined cases for '\\', '\a', '\e', and '\r' in same case branch - in decode_prompt_string - -doc/{bash.1,bashref.texi} - - documented new \D{format} prompt string expansion - -builtins/printf.def - - use ISO C PRIdMAX instead of INTMAX_CONV - - pass length of format modifiers to mklong instead of computing it - with strlen() - -lib/sh/{fmtulong,fmtullong}.c - - changes from Paul Eggert to make more general - -arrayfunc.c - - when converting a variable to an array, make sure to unset the - dynamic_value and assign_func members of the struct variable, - since they're not valid anymore - - 12/27 - ----- -configure.in - - use AC_HELP_STRING in AC_ARG_WITH and AC_ARG_ENABLE - - remove AC_ARG_ENABLE for largefile, since AC_SYS_LARGEFILE adds - one - - 1/2/2002 - -------- -{alias,bashline,execute_cmd,general,shell,subst,variables,arrayfunc}.c,general.h - - changed some calls to strchr to calls to xstrchr for multibyte - characters - -include/shmbutil.h - - add extern declaration for xstrchr to avoid including externs.h - where it's not appropriate - -{braces,make_cmd,pathexp,subst,arrayfunc}.c, lib/sh/xstrchr.c - - include shmbutil.h - -{stringlib,subst}.c, {externs,subst}.h - - moved substring() from subst.c to stringlib.c, moved declaration - from subst.h to externs.h - -lib/sh/xmbsrtowcs.c - - new file, replacement function for mbsrtowcs - -lib/sh/Makefile.in - - add entries for xmbsrtowcs.c - -Makefile.in - - add dependencies on shmbutil.h to appropriate object files - -lib/glob/strmatch.c - - break character-class testing out into separate function: - is_cclass, in prep for multibyte changes - -{braces,make_cmd}.c - - changes for multibyte characters - -builtins/printf.def - - changes from Paul Eggert to just use intmax_t everywhere an - int/long/quad is needed and print with "%ld" if the number - fits in a long and %PRIdMAX otherwise - - remove getlong, getulong, getllong, getullong, since they're - no longer needed - - use a new type `floatmax_t' to print floating point numbers, the - widest-available floating point type (like `intmax_t'); new - function `getfloatmax' that calls strtold or strtod as appropriate - - remove getdouble, getldouble, since they're no longer needed - -lib/sh/fmtumax.c - - new file, string-to-[u]intmax_t conversion, just includes - fmtulong.c with the right defines - -Makefile.in, lib/sh/Makefile.in - - additions for fmtumax.c - -bashtypes.h - - include if it's available - -expr.c - - arithmetic is now in intmax_t instead of long - -externs.h - - extern declaration for fmtumax - - change extern declarations for evalexp, itos, inttostr, - uitos, uinttostr since they now return or use intmax_t instead - of long - -{execute_cmd,general,mailcheck,subst,variables}.c, parse.y -{array,general,subst,test,variables}.h -lib/sh/{itos,netopen}.c -builtins/{bashgetopt,common}.c, builtins/common.h -builtins/{break,fc,history,jobs,let,printf,pushd,read,shift,wait}.def - - changes for intmax_t shell arithmetic conversion - -doc/{bashref.texi,bash.1} - - documented long->intmax_t shell arithmetic conversion - -sig.c - - in initialize_terminating_signals, if we've already trapped a - terminating signal, don't reset the signal handler for it - - 1/3 - --- -{arrayfunc,pathexp}.c, parse.y - - changes for multibyte chars - -parse.y, lib/sh/strtrans.c - - moved ansiexpand from parse.y to lib/sh/strtrans.c - -parse.y, locale.c - - moved mk_msgstr and localeexpand from parse.y to locale.c - -parse.y - - new function, yy_input_name, returns name of input file from - bash_input.name - - broke the code that parses ((...)) constructs out of read_token - into a new function, parse_dparen() - -externs.h - - new extern declaration for ansiexpand(), mk_msgstr(), and - localeexpand() - -input.h - - new extern declaration for yy_input_name() - -{error,locale}.c - - use yy_input_name for error and other messages - -execute_cmd.c - - change shell_execve to make sure that the file is executable - before looking at the interpreter to find out why the execve() - failed (avoids misleading error message) - -lib/glob/glob.c - - move code that matches leading `.' and skips those filenames into - a separate function: skipname(), so there can be unibyte and - multibyte versions of that function - - 1/7 - --- -subst.c - - more changes for multibyte characters - -print_cmd.c - - change semicolon() so it doesn't output a `;' immediately after a - newline, since that results in a null command, which is a syntax - error - -variables.c - - fix indirection_level_string to turn off set -x while evaluating - PS4 - - 1/8 - --- -builtins/set.def - - make -o options into one struct, instead of separate structs for - option names corresponding to flags and non-flag option names. - This has the side effect of sorting the option names in output - -lib/glob/glob.c - - new function, mbskipname(), multibyte char version of skipname() - - removed all #ifndef SHELL code, this will never be used outside - the shell - -include/posixdir.h - - move REAL_DIR_ENTRY define here from lib/glob/glob.c - -lib/glob/glob_loop.c - - new file, included in glob.c for unibyte and multibyte versions of - glob_pattern_p - - added some forward static function declarations with prototypes - - more changes for multibyte character handling - -lib/glob/Makefile.in - - make glob.c depend on glob_loop.c - - changes for xmbsrtowcs.[co] - -lib/glob/xmbsrtowcs.c - - moved here from lib/sh, since the matching functions use it, and - libglob.a is linked after libsh.a - - 1/9 - --- -lib/glob/smatch.c - - new file, with strmatch (now xstrmatch) and associated functions, - with changes for multibyte chars - -lib/glob/sm_loop.c - - new file, included by smatch.c, with `generic' versions of matching - functions that are compiled twice: once each for single-byte and - multibyte characters - -lib/glob/strmatch.c - - strip out everything except strmatch(), which either calls fnmatch - (if HAVE_LIBC_FNM_EXTMATCH is defined) or xstrmatch - -lib/glob/collsyms.c - - changes for multibyte chars - -lib/glob/Makefile.in, Makefile.in - - changes for new source files - - 1/10 - ---- -lib/readline/complete.c - - new function, rl_completion_mode (rl_command_func_t *func), returns - the appropriate value to pass to rl_complete_internal depending on - FUNC and the value of `show-all-if-ambiguous'. This allows - application completion functions to present the same interface as - rl_complete - -lib/readline/readline.h - - new extern declaration for rl_completion_mode() - -lib/readline/doc/rltech.texinfo - - documented rl_completion_mode - -lib/readline/readline.[ch] - - bumped the version number to 4.3, changing the relevant cpp defines - -configure.in - - require that an installed readline version be at least readline-4.3 - -bashline.c - - converted bash-specific completion functions to use - rl_completion_mode instead of passing TAB unconditionally - -builtins/bashgetopt.c - - the `#' option specifier now means a required numeric argument, - not an optional one - -builtins/type.def - - when converting [-]-{path,type,all} to -[pta], don't bother - freeing and reallocating the option string; just change opt[1] - and null opt[2] - -lib/sh/snprintf.c - - support %ls/%S and %lc/%C for wide strings and characters, - respectively, if HANDLE_MULTIBYTE is defined - -mailcheck.c - - don't print a message about new mail if the file has not grown, - even if the access time is less than the modification time - - 1/14 - ---- -lib/readline/readline.c - - new function, rl_replace_line, to replace the readline line buffer - with the text supplied as an argument - - new function, rl_replace_from_history, replaces readline line - buffer with text from history entry passed as argument (undocumented, - not in readline.h because it requires a definition of - HIST_ENTRY for the prototype) - -lib/readline/readlne.h - - new extern declaration for rl_replace_line - -lib/readline/doc/rltech.texinfo - - documented rl_replace_line - -lib/readline/{isearch,readline,search}.c - - use rl_replace_line and rl_replace_from_history where appropriate - -lib/readline/readline.c - - broke the code that sets point after moving through the history - (_rl_history_preserve_point and _rl_history_saved_point) out - into a separate function, _rl_history_set_point() - -lib/readline/{complete.c,rlprivate.h} - - find_completion_word -> _rl_find_completion_word - - free_match_list -> _rl_free_match_list - -lib/readline/complete.c - - postprocess_matches and _rl_free_match_list now return immediately - if passed a null match list - -variables.c - - new function, find_local_variable, finds a local variable by name - at the current variable context - - in find_variable_internal, call find_local_variable before searching - any of the temporary environments if variable_context > 0 (meaning - we're in a shell function). This lets a local variable - override a variable whose value was passed in the `function - environment' - - 1/15 - ---- -variables.h, execute_cmd.c - - declare variables describing the temporary environments in - variables.h instead of in C files - -findcmd.c, builtins/setattr.def - - instead of calling find_tempenv_variable, use find_variable_internal - and check whether the returned SHELL_VAR * has the tempvar - attribute - -variables.c - - tentative change to lookup order in find_variable_internal so that - function local variables are found before variables in - function_env when executing a shell function - - change make_local_variable to handle making a local variable when - a variable with the same name already appears in one of the - temporary environments - - broke the body of make_var_array out into a new function: - static char **make_env_array_from_var_list (SHELL_VAR **vars) - - new function, make_var_array_internal, takes a hash table to look - in and a pointer to a mapping function and returns a char ** - environment-style list - - make_var_array now just calls make_var_array_internal - - new mapping function, local_and_exported, returns all local variables - in the current variable context with the export attribute set - - new function, make_local_export_array, returns an environment-style - char ** array of exported local variables in current context - - change environment creation order in maybe_make_export_env to - add variables to the environment in opposite order that - find_variable_internal uses. This means that local variables in - shell functions override variables with the same name in the - function_env - - change make_local_variable to set the initial value of the - variable it creates to NULL to make the `is set' and `is null' - tests that the expansion code does work right - - change make_local_variable to inherit the value of a variable with - the same name from the temporary enviroment - - 1/16 - ---- -Makefile.in - - link bashversion with buildversion.o instead of version.o, for - cross-compiling. version.o is for the target system; - buildversion.o is for the build system - -error.c - - add line numbers to internal_error() messages if the shell is - not interactive and running a shell script or a -c command - - report_error now prints non-zero line numbers for non-interactive - shells - -test.c - - test_syntax_error now calls builtin_error() instead of printing - its own messages - -builtins/common.c - - builtin_error now prints line numbers if a non-interactive shell - is running a shell script or a -c command - -print_cmd.c - - in cprintf, remove free_argp, since it's not used - -builtins/history.def - - make `history -n' increment the number of history lines in this - session by the number of lines read from the history file - -arrayfunc.c - - fix array_value_internal to expand the subscript even if the - variable is unset, so side effects produced by the arithmetic - evaluation will take place - -lib/readline/doc/{rluser,rltech}.texinfo - - some fixes for printing in @smallbook format from Brian - Youmans - - 1/17 - ---- -jobs.h - - new PRUNNING, PSTOPPED, PDEADPROC defines for PROCESSes, analogous - to RUNNING, STOPPED, and DEADJOB defines for jobs - -jobs.c - - use PS_RUNNING, PS_DONE, PS_STOPPED values for `running' field - of a PROCESS - - find_pipeline and find_job now take an additional flags argument - that, if non-zero, means to find only running processes; changed - all callers - - changed calls to find_pipeline and find_job made from waitchld - to find only running processes - - find_pipeline takes a third argument: an int *. If it looks in - the jobs list to find the pid, and the arg is non-null, it passes - the job index back to the caller. Used to avoid calls to - find_pipeline immediately followed by find_job with the same PID - -nojobs.c - - a couple of changes to make sure that set_pid_status is never - called with a pid argument of 0 or -1 - -trap.c - - change trap_handler to longjmp to wait_intr_buf (set by wait_builtin) - if a signal is received for which a trap has been set during - execution of the wait builtin (need to include builtins.h and - builtins/builtext.h and declare some extern variables for the - right things to check) - - new variable to keep track of which signal caused the longjmp to - wait_intr_buf, set by trap_handler (wait_signal_received) - -builtins/wait.def - - set the return value of wait when a longjmp(wait_intr_buf, 1) is - done to 128 + wait_signal_received - -{jobs,nojobs}.c - - set wait_signal_received to SIGINT in wait_sigint_handler before - the longjmp(wait_intr_buf, 1) - - 1/18 - ---- -bashline.c - - turn off rl_filename_completion_desired when completing a command - name with a single match only if the first char of that match is - not a `/' - - if there are multiple identical matches for a command name in - attempt_shell_completion, turn off rl_filename_completion_desired - if the first char is not a `/' to avoid readline appending a - slash if there's a directory with the same name in the current - directory - - 1/22 - ---- -lib/readline/complete.c - - new variable, _rl_page_completions, to control whether we want to - run the internal pager when listing completions (defaults to 1) - -lib/readline/rlprivate.h - - extern declaration for _rl_page_completions - -lib/readline/bind.c - - new bindable variable, `page-completions', controls value of - _rl_page_completions - -lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1 - - documented `page-completions' variable - -Makefile.in - - use $(INSTALL_SCRIPT) instead of $(INSTALL_PROGRAM) to install - `bashbug' - -aclocal.m4 - - fix small quoting problem in RL_LIB_READLINE_VERSION macro - -lib/readline/terminal.c - - fetch and save terminal's `vs' and `ve' cursor control attributes - - fetch and save terminal's `kI' attribute (string sent by Insert) - - new function, _rl_set_cursor, sets cursor to normal (insert mode) - or very visible (overwrite mode) - -lib/readline/readline.c - - new global variable, rl_insert_mode - - new function to toggle overwrite mode, rl_overwrite_mode - - each new line starts in insert mode - - switching to vi mode or emacs mode resets to insert mode - - reset cursor to normal before returning line - - _rl_replace_text now returns the number of characters inserted, - the return value from rl_insert_text - - new function, _rl_insert_or_replace_text (const char *string, int insert), - either inserts STRING or replaces the number of chars in STRING - with STRING starting at rl_point, depending on value of INSERT - - renamed rl_insert to _rl_insert_char, rl_insert just calls - _rl_insert_char with the same arguments when in insert mode - - new function, _rl_overwrite_char, handles self-insert in overwrite - mode. Does multibyte chars by reading an entire multibyte character - before entering overwrite loop - - new function, _rl_overwrite_rubout, handles RUBOUT when in - overwrite mode, called from rl_rubout - - new function, _rl_rubout_char, old body of rl_rubout; rl_rubout - calls this when not in overwrite mode - -lib/readline/readline.h - - extern declarations for rl_insert_mode and rl_overwrite_mode() - -lib/readline/rldefs.h - - define constants for values of rl_insert_mode - -lib/readline/rlprivate.h - - extern declarations for _rl_set_cursor and _rl_set_insert_mode - - change type of _rl_replace_text to return int - - extern declarations for _rl_insert_char, _rl_rubout_char - -lib/readline/funmap.c - - new bindable name `overwrite-mode', bound to rl_overwrite_mode - -lib/readline/rlconf.h - - define CURSOR_MODE if you want the cursor to show insert or - overwrite mode (only available if both `vs' and `ve' capabilities - are present) - -lib/readline/{complete,parens,readline,search,vi_mode}.c - - change calls to rl_insert to _rl_insert_char - -lib/readline/{readline,search}.c - - change calls to rl_rubout to _rl_rubout_char to avoid overwrite - mode problems - -lib/readline/vi_mode.c - - fix rl_vi_overstrike to just call _rl_overwrite_char, which - handles multibyte chars - -lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1 - - document new `overwrite-mode' command - - 1/23 - ---- -lib/readline/readline.c - - return 0 immediately from rl_insert_text if the string to insert - is NULL or "" - -bashline.c - - if a numeric argument is given to one of the bash-specific glob - pattern completion functions (including TAB), append a `*' to - the word before generating matches - - in attempt_shell_completion, when doing glob completion, only - set the match list to NULL if rl_completion_type == TAB and - there is more than one completion. This permits listing completions - with double tabs and displaying ambiguous completions - - new function, bash_glob_complete_word, appends a `*' to the word - to be completed and then globs it. It uses a new filename - quoting function (bash_glob_quote_filename) to avoid quoting - globbing characters in the filename if there are no matches or - multiple matches - -lib/readline/complete.c - - set completion_changed_buffer to 0 in rl_complete_internal if - no matches were produced by the completion generator function - - new variable, rl_completion_suppress_append, suppresses appending - of rl_completion_append_character. Settable by application - completion functions, always 0 when application completion - functions are called (set to 0 by rl_complete_internal and - rl_menu_complete) - - broke the code that assigns default values to readline completion - variables out of rl_complete_internal and rl_menu_complete into - a new function, set_completion_defaults (int what_to_do) - -lib/readline/readline.h - - extern declaration for rl_completion_suppress_append - -lib/readline/doc/rluser.texinfo, doc/bash.1 - - documented behavior of glob-expand-word and glob-list-expansions - when supplied a numeric argument - - documented glob-complete-word - -lib/readline/doc/rltech.texinfo - - documented rl_completion_suppress_append - - 1/24 - ---- -lib/readline/text.c - - new file, text and character handling functions from readline.c - -lib/readline/misc.c - - new file, miscellanous bindable functions and their supporting - code from readline.c - -Makefile.in, lib/readline/Makefile.in - - changes for text.c, misc.c - -lib/readline/bind.c - - change ISKMAP case of rl_invoking_keyseqs_in_map to output - ESC as "\M-" instead of "\e" -- it's closer to the documentation - - change _rl_get_keyname to output ESC as \e instead of \C-[ - (it's easier to understand) - -pcomplete.h - - new flag, COPT_NOSPACE - -builtins/complete.def - - new `-o nospace' option for complete and compgen (though it doesn't - really do anything for compgen, since that doesn't hand anything - off to readline) - -bashline.c - - if a programmable completion specifies COPT_NOSPACE, set - rl_completion_suppress_append = 1 - -lib/readline/doc/rluser.texinfo - - documented new `-o nospace' option to complete and compgen - -doc/{bash.1,bashref.texi} - - documented $'\cX' escape sequence (forgot to before) - - 1/28 - ---- -variables.c - - make_new_variable now takes the HASH_TABLE * as its second - argument; changed callers - - new function, bind_variable_in_table, takes the HASH_TABLE * as - its third paramter; bind_variable calls bind_variable_in_table - with shell_variables as third argument - -variables.h - - new struct var_context, variable context (per-scope -- global, - function local, etc.) - -variables.[ch],builtins/common.[ch] - - moved functions that push and pop a variable context from - builtins/common.c to variables.c; move extern function - declarations to variables.h - - new function, all_local_variables - - variable_in_context is now static, used only by all_local_variables - -variables.[ch],execute_cmd.c - - push_context now takes the function name as an argument for - future use - - push_context takes an indication of whether or not the function is - executing in a subshell and saves the positional parameters only - if not in a subshell - - new functions for managing a stack of variable contexts and - scopes: new_var_context, dispose_var_context, push_var_context, - pop_var_context, push_scope, pop_scope - -builtins/declare.def - - call all_local_variables instead of map_over (...) in declare_internal - - don't call make_local_variable if we're looking at functions - ((flags_on & att_function) != 0), since it's wasted - - make sure VAR is set to NULL if check for variable_context fails - and we didn't just create or fetch a local variable in - declare_internal - - in non-function branch of declare_internal, only call find_variable - if VAR is NULL -- if it's not null, we just created or fetched a - local variable and don't need to do it again - - 1/29 - ---- -variables.[ch] - - the temporary environments (temporary_env, builtin_env, function_env) - are now HASH_TABLEs instead of argv-style arrays of strings (this - is an intermediate step on the way to the new lcc-inspired symbol - table scope structure) - - new internal attribute for variables: att_propagate. This means - to propagate the value out of the temporary environment up the - (for now implicit) chain of variable scopes when the containing - temporary environment is deleted - -variables.c - - assign_in_env now adds to the HASH_TABLE temporary_env instead - of making environment-style strings in an array of strings - - changed the way the temporary environments are merged into the - shell variable table to account for the new HASH_TABLE temp - environments - - changed the way the export environment is created due to the new - structure of the temporary environments - - new function, bind_variable_internal (name, value, table), binds - NAME to have VALUE in TABLE without searching the temporary - environments - - removed: shell_var_from_env_string, bind_name_in_env_array - - variable_in_context now checks the att_local attribute and makes - sure the variable is not invisible - - local_and_exported now makes sure the variable is not invisible - -execute_cmd.c - - we no longer need to copy the temporary environment to function_env - or builtin_env, we can simply use variable assignments - -{findcmd,subst,variables}.c, builtins/{declare,setattr}.def - - since variables from the temporary environments are no longer turned - into SHELL_VARs on the fly, don't dispose the SHELL_VAR returned - by find_variable or find_variable_internal - - need to savestring() the value returned by find_variable if it has - the tempvar attribute before calling bind_variable on it, because - bind_variable will search and bind into the temporary environments - and will free the old value before binding the new. For temporary - environments, these two pointers will be the same, and - bind_tempenv_variable will end up using freed memory - -builtins/{declare,setattr}.def - - set the att_propagate attribute when exporting or making readonly - variables from the temp environment (i.e., `var=value declare -x var' - or `var=value export var' sets the propagate attribute on the entry - for `var' in the temporary environment HASH_TABLE) - -lib/readline/isearch.c - - ^W when reading isearch string yanks the current word out of the - current line into the search string, skipping the portion already - matched - - ^Y when reading isearch string yanks the rest of the current line - into the search string, skipping the portion already matched - - 1/30 - ---- -{print_cmd,variables}.c - - moved indirection_level_string() from variables.c to print_cmd.c - -{externs,variables}.h - - moved extern declaration of indirection_level_string to externs.h - -{general,variables}.c - - moved assignment() from variables.c to general.c - -{general,variables}.h - - moved extern declaration of assignment() to general.h - -{externs,input}.h - - moved extern declaration of decode_prompt_string to externs.h - -print_cmd.c - - include flags.h, don't include stdc.h - -variables.c - - moved some functions around to group functions better - - changed new_shell_variable to explicitly initialize each member - of the created struct variable instead of calling bzero() - - make_new_variable now just calls new_shell_variable instead - of duplicating what it does - - removed some code in bind_function that duplicated what - new_variable does on the newly-created SHELL_VAR - - since there are no local function variables (functions are always - made at the global scope), kill_all_local_variables() doesn't - need to consider functions - - 1/31 - ---- -variables.c - - sort the array of special variables - - short-circuit the search in stupidly_hack_special_variables if - the passed name can't be found in the rest of the array - (that is, if name[0] < special_vars[i].name[0]) - -lib/readline/history.c - - unstifle_history() was returning values exactly opposite of - the documentation - -lib/readline/doc/{hsuser.texinfo,history.3} - - clarified the unstifle_history() documentation a little - - 2/4 - --- -variables.c - - in bind_variable, don't call bind_tempenv_variable after a - find_tempenv_variable succeeds -- just change the value inline. - There's no reason to look it up twice - - change makunbound to only call stupidly_hack_special_variables - if we're not unsetting a function - -variables.[ch] - - new function, unbind_function, like makunbound but doesn't mess - with previous contexts or calling stupidly_hack_special_variables - -builtins/set.def - - change unset_builtin to call either unbind_func or unbind_variable - -builtins/getopts.def - - call unbind_variable(name) instead of makunbound(name, shell_variables) - - 2/5 - --- -lib/glob/sm_loop.c - - use malloc instead of xmalloc in BRACKMATCH and handle failures - -error.c - - add extern declaration of executing_line_number with prototype, - since execute_cmd.h can't be included without including other - files - -lib/readline/parens.c - - include - -lib/malloc/stats.c - - include - - add extern declaration of malloc_free_blocks() with prototype - -pathexp.c - - added some forward declarations with prototypes for static functions - -lib/readline/rlprivate.h - - removed declarations of rl_untranslate_keyseq, rl_discard_argument, - rl_stop_output, rl_alphabetic since they appear in readline.h - - 2/6 - --- -{arrayfunc,execute_cmd,pcomplete,shell}.c - - change calls to makunbound(name, shell_variables) to - unbind_variable (name) - - 2/7 - --- -builtins/getopt.c - - don't defer incrementing of OPTIND when an invalid option is - encountered until the next call to sh_getopt() -- what if OPTIND - is reset before that next call? This means that OPTIND is always - incremented to the next option to be handled when an option is - returned, whether it's valid or not. This is what POSIX-2002 - says to do. - -syntax.h - - new #define, CSUBSTOP - -mksyntax.c - - add "-=?+" with value CSUBSTOP to the syntax table. These are the - valid expansion operators OP in ${param[:]OPword} - -subst.c - - use table lookup for CSUBSTOP in VALID_PARAM_EXPAND_CHAR - - new flags for the string extraction functions: EX_NOALLOC. This - indicates that the functions are being used only to skip over - strings and the result won't be used, so the substring shouldn't - be allocated, copied, and freed - - new flag for string_extract: EX_VARNAME. This serves the same - purpose as the old `varname' parameter. parameter_brace_expand() - changed appropriately - - extract_delimited_string and extract_dollar_brace_string now take - an additional `flags' argument, which may include EX_NOALLOC - - changed callers of extract_delimited_string and - extract_dollar_brace_string appropriately - - string_extract now understands EX_NOALLOC; callers changed - - some smaller code cleanups - - converted char_is_quoted(), unclosed_pair(), and skip_to_delim() - to understand multibyte characters - - 2/11 - ---- -variables.[ch] - - moved to a symbol organization inspired by lcc. The basic structure - is no longer a HASH_TABLE, but a VAR_CONTEXT, which includes a hash - table as one of its members. VAR_CONTEXTs are linked together to do - variable scoping. One nice thing about this is that the entire - symbol table doesn't need to be searched at function scope exit to - remove local variables. Fixes problems with only one instance of - builtin_env and function_env, even though it really is a stack - - shell_variables is now a VAR_CONTEXT *, with a global_variables - variable that points to the bottom of the stack for fast access - - function-scope local variables (assignments specified on the command - line before a function call) and function-local variables (declared - with the `local' builtin) have been unified in the same variable - context, replacing function_env - - assignment statements preceding the `.' and `eval' builtins are now - a separate variable scope VAR_CONTEXT, replacing builtin_env - - temporary_env (a HASH_TABLE) is now the only separate environment - - changes to export environment creation, variable binding, variable - lookup, local variable propagation all changed to work with the - new symbol table/scope structure - - a SHELL_VAR no longer has a `prev_context' member; it's not needed - -execute_cmd.c - - changes to push_context calls to include any temporary variables in - temporary_env; pop_context takes care of propagating any temporary - variables if necessary - - calls to push_scope if `eval' or `.' is called with a list of - preceding variable assignments, and pop_scope called at end of - builtin's execution. pop_scope takes care of merging temporary - variables into the shell environment when appropriate - -builtins/{setattr,declare}.def - - changes to account for variable assignments preceding `local', - `export', `readonly', `declare', etc. to work with the new - variable scoping implementation - -shell.c - - since shell_variables is now a VAR_CONTEXT, call - delete_all_contexts() when the shell is reinitializing instead of - delete_all_variables() - -builtins/common.c - - new function, get_job_by_name(), used by execute_simple_command() - for the `auto_resume' stuff and get_job_spec() - -builtins/common.h - - new set of #defined constants for flags argument to - get_job_by_name() - - 2/12 - ---- -command.h - - new redirection operator: r_reading_string for `here strings' - -parse.y - - new token, LESS_LESS_LESS, for new redirection `here string' - operator: [N]<<< word - - recognize LESS_LESS_LESS and create the appropriate redirection - -{dispose_cmd,copy_cmd,make_cmd,print_cmd}.c - - recognize r_reading_string and do the right thing (dispose_redirects, - copy_redirect, print_redirection, and make_redirection, respectively) - -redir.c - - here_document_to_fd now takes the redirection operator as its - second argument - - new function, write_here_string, expands a here string and writes it - to the here document file descriptor - - here_document_to_fd calls write_here_string for r_reading_string - operator - - handle r_reading_string in do_redirection_internal() and - stdin_redirection() - - 2/18 - ---- -doc/{bash.1,bashref.texi} - - documented here strings - -{configure,Makefile}.in - - bumped version number up to bash-2.05b and the release status - to alpha1 - -expr.c - - make expr_streval understand that variables with the `invisible' - attribute are really unset, and accessing such a variable when - `set -u' is set should be an error - -variables.h - - new accessor macros: var_isset(var) and var_isnull(var), test - whether var->value is NULL - -{eval,subst,variables}.c, builtins/{declare,setattr}.def - - be more consistent about using value_cell(var) instead of - directly referencing var->value - - use var_isset and var_isnull where appropriate - -builtins/help.def - - augmented a couple of help strings with pointers to `info' and - `man -k' - - 2/14 - ---- -variables.h - - new macros to use when setting variable values directly instead of - through bind_variable and its siblings - -{arrayfunc,variables}.c - - use var_setarray and other lvalue macros instead of assigning to - var->value directly - -builtins/setattr.def - - change show_var_attributes to show function definitions separately - from function attributes. This allows the output of `declare -f' - (with other flags), `export -f', and `readonly -f' to be reused as - shell input, instead of the old - - declare -f[flags] func() - { - foo - } - - which has syntax errors. When in posix mode, `export -fp' and - `readonly -fp' still don't print function definitions - - 2/16 - ---- -parse.y - - comment out calls to discard_parser_constructs; no need to call - empty functions - - 2/18 - ---- -lib/sh/memset.c - - replacement function for memset(3) - -lib/sh/Makefile.in, Makefile.in - - additions for memset.c - -configure.in,config.h.in - - check for memset, define HAVE_MEMSET if found, add memset.o to - LIBOBJS if not - -lib/malloc/malloc.c - - removed zmemset(), replaced with calls to memset(3) - -{subst,execute_cmd,lib/sh/netopen}.c - - replaced calls to bzero with calls to memset - -subst.c - - word_split() now takes a second argument: the value of $IFS, so - it doesn't have to look up IFS every time - - word_list_split() now calls getifs() and passes the result to - each call to word_split() as its second arg - - do a quick scan for CTLNUL in remove_quoted_nulls before allocating - new string, copying old string to it, copying over original string - and freeing new string - -eval.c - - don't bother calling dispose_used_env_vars if temporary_env is NULL - -execute_cmd.c - - fix fix_assignment_words to only look up the builtin corresponding - to the first word if one of the words in the list is marked as - W_ASSIGNMENT - -hashlib.c - - renamed hash_string to hash_bucket, which better reflects what it - does - - extracted the portion of hash_bucket that computes the hash out - into a new hash_string() - - made new body of hash_bucket into a macro HASH_BUCKET; function - just calls the macro - - calls to hash_bucket in this file now call HASH_BUCKET macro - - in add_hash_item, just add a new item at the front of the appropriate - bucket list instead of at the end - -hashcmd.h - - reduced FILENAME_HASH_BUCKETS to 53 from 107 - - 2/19 - ---- -hashlib.[ch] - - find_hash_item, remove_hash_item, add_hash_item all take a new - third `flags' argument - - add_hash_item doesn't call find_hash_item if HASH_NOSRCH passed in - flags arg - - find_hash_item will create a new hash table entry if HASH_CREATE is - passed in flags arg - - new function, hash_walk, takes a pointer to a function and a table - and calls the function for each item in the table. If the function - returns < 0, the walk is terminated - - fixed flush_hash_table to set table->nentries to 0 after freeing - all entries - - BUCKET_CONTENTS now has a new `khash' member, what key hashes to; - set by HASH_BUCKET macro (which calls hash_string), assigned in - find_hash_item (HASH_CREATE) and add_hash_item - - find_hash_item and remove_hash_item check `khash' against the - hash of the string argument before calling strcmp - -{alias,hashlib,hashcmd,pcomplib,variables}.c - - changed all calls to {find,remove,add}_hash_item - -builtins/hash.def - - return immediately from print_hashed_commands if there are no - entries in the hash table (this eliminates need for `any_printed' - variable) - - change print_hashed_commands to use hash_walk - -alias.c - - short-circuit all_aliases and map_over_aliases if - HASH_ENTRIES(aliases) == 0 - - simplify map_over_aliases by just allocating enough room in the - returned list for all entries in the aliases hash table, instead - of doing the check and xrealloc - - add_alias now calls add_hash_item with HASH_NOSRCH argument - -pcomplete.h - - sh_csprint_func_t is no more; use hash_wfunc instead - -pcomplib.c - - short-circuit print_all_compspecs if HASH_ENTRIES(prog_completes) - is 0 - - print_all_compspecs now takes a `hash_wfunc *' argument - - print_all_compspecs now just calls hash_walk - -builtins/complete.def - - new function, print_compitem, takes a BUCKET_CONTENTS *, extracts - the right info, and calls print_one_completion - -variables.c - - short-circuit map_over_funcs if HASH_ENTRIES(shell_functions) == 0 - - short-circuit flatten if the passed table has no entries - - bind_variable_internal takes a new fourth argument: `hflags', - to pass to hash table functions - - make_new_variable now passes HASH_NOSRCH flag to add_hash_item - - set_if_not now calls bind_variable_internal and passes - HASH_NOSRCH as flags argument - - bind_function now calls add_hash_item with HASH_NOSRCH argument - - fixed make_local_variable: old_var == 0 && was_tmpvar can never - be true - - if we didn't find an old variable in make_local_variable, call - bind_variable_internal with HASH_NOSRCH argument - - fix push_temp_var to reset variable context to 0 if binding into - global_variables->table - -parse.y - - fix to parse_compound_assignment to avoid core dumps on empty - compound array assignments - -subst.c - - getifs() is now global so read_builtin can call it - -subst.h - - extern declaration for getifs() - - 2/20 - ---- -hashlib.c - - changed hash_string to use a better hash function - - changed HASH_BUCKET to use masking rather than modulus to hash a - string to a bucket -- HASH TABLES MUST NOW BE SIZED BY POWERS - OF TWO - -hashlib.h - - DEFAULT_HASH_BUCKETS is now 64 - -hashcmd.h - - FILENAME_HASH_BUCKETS is now 64 - -pcomplib.c - - COMPLETE_HASH_BUCKETS is now 32 - -variables.c - - TEMPENV_HASH_BUCKETS is now 4 - -alias.c - - new define, ALIAS_HASH_BUCKETS, set to 16, used to size alias table - -hashlib.c - - removed initialize_hash_table; folded code into make_hash_table - - fixed copy_bucket_array to copy the `khash' member of an item - - renamed functions to be more systematic and easier for me: - make_hash_table -> hash_create - hash_table_nentries -> hash_size - copy_hash_table -> hash_copy - find_hash_item -> hash_search - remove_hash_item -> hash_remove - add_hash_item -> hash_insert - flush_hash_table -> hash_flush - dispose_hash_table -> hash_dispose - print_table_stats -> hash_pstats - get_hash_bucket -> hash_items - - changed hash_search to short-circuit if table->nentries == 0 and - HASH_CREATE has not been passed in the flags argument - -{alias,variables,hashcmd,pcomplib}.c - - renamed calls to all renamed functions from hashlib.c - -builtins/kill.def - - don't drop a leading `-' in a pid argument - - call kill_pid with an explicit third argument of 1 if the pid - argument to kill is < -1, rather than rely on the behavior of - kill(2) - - 2/21 - ---- -subst.c - - quoted_strchr is no longer declared `inline' - - skip_double_quoted is no longer declared `inline' - - string_extract_double_quoted is no longer declared `inline' - -lib/readline/input.c - - rl_gather_tyi is now an `int' valued function; returns the number - of characters read (0 or 1) or -1 on error - - if rl_gather_tyi() returns -1 to rl_read_key(), set rl_done to 1 - and return a newline; something is wrong with the input fd - - 2/25 - ---- -variables.[ch] - - IFS is now a special variable - - new special var function, sv_ifs(), called when IFS is set or unset - - call setifs() when IFS is first set in initialize_shell_variables - - call setifs() from make_local_variable and assign_in_env if - appropriate - - if assign_in_env() is called with a var assignment like `VAR=', - make the value in the new SHELL_VAR created be "" like - do_assignment_internal does, since certain parts of the shell use - a NULL value as evidence that the variable is unset (though - attributes may have been assigned) - - if push_temp_var pushes something up to the global_variables table, - make sure that the context is set to 0 - - new function dispose_temporary_env, called by both - dispose_used_env_vars and merge_temporary_env with different `free - func' function pointers; calls sv_ifs after disposing the temporary - environment - - push_exported_var now calls bind_variable_internal instead of - bind_variable - - pop_scope and pop_context now call sv_ifs - -subst.[ch] - - new global variables used to keep track of IFS state, to avoid - having to call find_variable("IFS") all the time: - - ifs_var the SHELL_VAR for IFS - ifs_value ifs_var ? value_cell (ifs_var) : " \t\n" - ifs_cmap bitmap of characters in ifs_value - ifs_firstc first character in ifs_value - - - new function setifs(), sets the aforementioned ifs variables each - time IFS is set or unset, and at nested scope exit - - instead of calling getifs() from inside subst.c, use ifs_value - - getifs() now just returns ifs_value - - use ifs_firstc in string_list_dollar_star() - - only call member() in issep() if separators is more than one char - - don't cache a bitmap every time expand_word_internal() is called; - use ifs_cmap instead - - new macro, isifs(c), checks whether C is in ifs_cmap - -builtins/read.def - - use issep() and isifs() macros instead of looking at $IFS directly - -syntax.h - - make sure macros that access sh_syntaxtab cast the argument to - `unsigned char' before array access - - new macros: issyntype(c, type) and notsyntype(c, type), check - sh_syntaxtab[c] for a particular flag value `type' - - 2/26 - ---- -hashlib.h - - the `data' member of a `BUCKET_CONTENTS' is now a PTR_T - -{hashlib,alias,variables,hashcmd,pcomplib}.c - - removed some casts when assigning to and using `data' member of a - `BUCKET_CONTENTS' - -subst.c - - in split_at_delims, call make_word_list instead of allocating and - initializing a WORD_LIST * directly - -make_cmd.[ch] - - add_string_to_list is now just a macro that calls make_word_list - - make_simple_command now calls make_word_list instead of allocating - a WORD_LIST * directly - - 2/27 - ---- -copy_cmd.c - - copy_word now calls make_bare_word to allocate the copy - - copy_word_list now calls make_word_list to allocate the copy - -shell.h - - include `ocache.h' for simple object caching - - call cmd_init() to initialize the WORD_DESC and WORD_LIST object - caches - -{make,dispose}_cmd.c - - allocate WORD_DESC * and WORD_LIST * vars from their respective - ocaches, and return them to the cache when disposing - -jobs.c - - renamed old `waiting_for_job' variable to `queue_sigchld', which - better reflects its intent: sigchld_handler does not call waitchld - if `queue_sigchld' is non-zero, it simply increments the count of - waiting children - - cleanup_dead_jobs now just sets and clears queue_sigchld instead of - blocking and unblocking SIGCHLD; it calls waitchld at the end if - `sigchld' is non-zero, but that's not really necessary - - in setjstatus, only call xrealloc if `statsize' is less than the - number of processes passed -- no reason to do it if they're the - same - - 2/28 - ---- -sig.[ch] - - reinitialize_signals is no more; initialize_signals takes an - argument saying whether or not we are reinitializing - -builtins/exec.def - - reinitialize_signals() -> initialize_signals(1) - -test.c - - fix filecomp() to work right when one file has a non-positive - timestamp and the other file does not exist - -doc/{bash.1,bashref.texi} - - document what happens for test's -nt and -ot operators when one - file operand exists and the other does not - -jobs.c - - if we haven't messed with SIGTTOU, just manipulate queue_sigchld - in notify_of_job_status instead of calling sigprocmask() - - list_one_job now calls pretty_print_job directly instead of going - through print_job - - pretty_print_job now must be called with SIGCHLD blocked or held - instead of blocking SIGCHLD itself - - changed start_job so that it doesn't call UNBLOCK_CHILD and then - immediately call BLOCK_CHILD again (explicitly or via last_pid()), - call find_last_pid instead of last_pid and then UNBLOCK_CHILD - - changed wait_for_job the same way - - find_last_pid now takes a second argument: block; uses BLOCK_CHILD - if `block' is 1, not otherwise. Changed existing calls: - find_last_pid(j) -> find_last_pid(j, 0) - last_pid(j) -> find_last_pid(j, 1) - `last_pid()' is now gone - - rewrote wait_for_background_pids(); it was a little strange - -copy_cmd.c - - copy_if_command: don't copy null false_case commands - - copy_simple_command: don't copy a null redirection list - -subst.c - - in get_word_from_string and list_string, just check for " \t\n" - directly rather than calling strcmp - - in get_word_from_string and strip_trailing_ifs_whitespace, use - isifs() instead of issep(), since they're never called with - separators != $IFS - - change issep() to call isifs if separators is longer than one - character, since it's never called with anything but "", " ", - or $IFS - - 3/1 - --- -sig.h - - enclose the BLOCK_SIGNAL macro in a do {...} while (0) loop, at it - should have been all along - -lib/readline/doc/rltech.texinfo - - document that readline defaults to stdin/stdout if rl_instream/ - rl_outstream are NULL - -lib/readline/terminal.c - - if an application is using a custom redisplay function, - rl_resize_terminal just calls rl_forced_update_display to tell - (*rl_redisplay_func) to update the display, otherwise call - _rl_redisplay_after_sigwinch - -lib/readline/readline.c - - change readline_internal_setup() so the change to vi insertion mode - happens even if readline_echoing_p is 0 - - don't print the prompt to rl_outstream in readline_internal_setup - if we're not echoing and the caller has defined a custom redisplay - function -- let the redisplay function deal with it - -configure.in - - new option: --enable-mem-scramble, controls memory scrambling on - free() (on by default; only affects use of bash malloc) - -config.h.in - - new option MEMSCRAMBLE, controlled by --enable-mem-scramble - - 3/5 - --- -parse.y - - added ksh-like behavior of [...] to read_token_word: if a `[' is - seen in an assignment context and the previous characters in the - token form a valid identifier, parse the [...] with - parse_matched_pair to allow spaces (and newlines) in the subscript - -bashline.c - - new function bash_servicename_completion_function, for completing - service names from /etc/services - -bashline.h - - new extern declaration for bash_servicename_completion_function - -builtins/complete.def - - allow new `-s/-A service' option to complete and compgen builtins - -pcomplete.h - - new CA_SERVICE define, new ITEMLIST variable it_services - -pcomplete.c - - add callback to bash_servicename_completion_function to generate - list of matching service names for completion - -doc/bash.1,lib/readline/doc/rluser.texinfo - - documented new `-s/-A service' option to complete and compgen - - 3/6 - --- -builtins/read.def - - change hard-coded `0' to new variable `fd' (initially 0) in - preparation for adding `-u fd' option - -bashline.c - - bash_directory_completion_hook calls expand_prompt_string instead - of expand_string (it does the right thing). This keeps expansion - errors from causing a longjmp, which shouldn't happen because of - completion - - command_subst_completion_function was augmented very slightly to - do filename completion on a non-command-word in a command - substitution - - command_subst_completion_function now skips over the lcd that - rl_completion_matches puts in matches[0] if there is more than - one possible completion - - 3/7 - --- -builtins/read.def - - only add the unwind_protect to free `rlbuf' if `edit' is non-zero, - since we won't be using readline otherwise - -lib/sh/zread.c - - renamed zread1 -> zreadintr - -redir.c - - small change to redirection_error() to make a slightly better - guess about the invalid file descriptor if the redirection op is - r_duplicating_input or r_duplicating_output - -include/stdc.h - - new macro, SH_VA_START, to encapsulate the difference between - stdarg va_start and varargs va_start - -{error,pcomplete,print_cmd}.c,builtins/common.c,lib/sh/snprintf.c - - use SH_VA_START - - 3/8 - --- -builtins/read.def - - support for the ksh-like `-u fd' option - -general.c - - new function sh_validfd(fd), returns 1 if fd is a valid open file - descriptor - -general.h - - extern decl for sh_validfd - -bashline.c - - don't call posix_readline_initialize() from initialize_readline(); - sv_strict_posix() should already have taken care of it - - 3/11 - ---- -{error,pcomplete,print_cmd}.c, builtins/common.c - - removed non-varargs versions of functions - -builtins/printf.def - - if the string argument to %q has non-printing characters, call - ansic_quote to quote it rather than sh_backslash_quote - -variables.h - - new attribute: att_trace (and corresponding trace_p() macro). - Functions with this attribute will inherit the DEBUG trap. - Currently ignored for variables - -builtins/declare.def - - new `-t' option to declare/typeset toggle the `att_trace' attribute - -builtins/setattr.def - - check for att_trace and output `-t' flag in show_var_attributes - -execute_cmd.c - - if a function is being traced (it has the `-t' attribute set), - don't turn off the DEBUG trap when it executes - -doc/{bash.1,bashref.texi} - - document the new `-t' option to declare/typeset - - 3/12 - ---- -execute_cmd.c - - don't execute the debug trap in the `cm_simple:' case of - execute_command_internal; run it in execute_simple_command so we - get the line number information right when executing in a shell - function - - run a DEBUG trap before executing ((...)) arithmetic commands, - like ksh93 - - run a DEBUG trap before executing [[...]] conditional commands, - like ksh93 - -eval.c - - add a static forward declaration for alrm_catcher() - -general.c - - add static forward declarations for bash_special_tilde_expansions, - unquoted_tilde_word, initialize_group_array - -variables.h - - add extern declarations for sh_get_env_value, map_over_funcs, - local_exported_variables - -variables.c - - add static forward declarations for dispose_temporary_env, - make_func_export_array - -bashhist.c - - add static forward declaration for check_history_control - -configure.in - - add a call to AC_CHECK_DECLS for strcpy - -config.h.in - - add placeholder for HAVE_DECL_STRCPY define, set by configure - -general.h - - don't declare strcpy if HAVE_DECL_STRCPY is defined with a non-zero - value - -sig.h - - add prototype to typedef of SigHandler - -lib/readline/histlib.h - - removed extern declaration of strcpy() - - include string.h/strings.h directly in histlib.h instead of source - files - -lib/readline/{histexpand,histfile,history,histsearch}.c - - don't include string.h/strings.h now that histlib.h includes it - -lib/tilde/tilde.c - - removed extern declaration of strcpy(), rely on string.h/strings.h - -command.h - - four new redirection types: r_move_input, r_move_output, - r_move_input_word, r_move_output_word, for - [N]<&word- and [N]>&word- from ksh93 - -print_cmd.c - - changes to print r_move_input[_word] and r_move_output[_word] - -copy_cmd.c - - changes to copy r_move_input[_word] and r_move_output[_word] - -dispose_cmd.c - - changes to dispose r_move_input_word and r_move_output_word - -make_cmd.c - - changes to make r_move_input[_word] and r_move_output[_word] from - r_duplicating_{input,output}_word, which is how the new redirs - are passed by the parser - -redir.c - - changes to make r_move_input[_word] and r_move_output[_word] do - the right thing when executed - -builtins/read.def - - print an error message and return failure immediately if zread/zreadc - return < 0 - -doc/{bash.1,bashref.texi} - - documented new [n]<&word- and [n]>&word- redirections - - 3/13 - ---- -lib/readline/isearch.c - - enabled code to allow chars bound to rl_rubout to delete characters - from the incremental search string - -shell.c - - add `-l' invocation option to parse_shell_options; equivalent to - `--login' - - fixed set_login_shell to check first char of base pathname of argv0 - for `-', like other shells - - move the check for make_login_shell after the call to - parse_shell_options because the `-l' option might set it - -doc/{bash.1,bashref.texi} - - documented new `-l' invocation option - -array.c - - new function, array_shift, shifts an array left by a specified - number of elements - - array_walk is now compiled in by default - - array_to_assignment_string now takes a second argument: int quoted. - If non-zero, the result is single-quoted before being returned - - quoted_array_assignment_string has been removed - -array.[ch] - - renamed most of the array functions so that all have an array_ - prefix and are more systematically named - - array_slice now preserves the indicies from the original array - - change array_to_assign to use a static buffer for expanding the - array indices, instead of malloc/free - -{arrayfunc,subst,variables}.c, builtins/read.def - - changed calls to various array functions to use new names - -lib/sh/stringvec.c, externs.h - - renamed all of the functions to have a strvec_ prefix and to have - a more sensible name scheme - - strvec_search's arguments are now supplied in reverse order, so - the char **array is first, like the other functions - - new function, strvec_resize, xrealloc for strvecs - -{alias,array,bracecomp,braces,bashline,execute_cmd,findcmd,general,pathexp, -pcomplete,variables}.c -lib/sh/stringlist.c -builtins/{bind,complete,exec,getopts,pushd,set}.def - - change calls to all functions from lib/sh/stringvec.c - - use strvec_resize where appropriate - -externs.h - - only declare dup2() if HAVE_DUP2 is undefined or DUP2_BROKEN is - defined - -lib/readline/{macro,readline,util}.c, lib/readline/rlprivate.h - - _rl_defining_kbd_macro is gone, use RL_ISSTATE(RL_STATE_MACRODEF) - -lib/readline/readline.h - - new struct readline_state, encapsulates most of readline's internal - state in case you need reentrancy or nested calls to readline() - - extern declarations for rl_save_state, rl_restore_state - -lib/readline/readline.c - - add (undocumented) int rl_save_state (struct readline_state *), - int rl_restore_state (struct readline_state *) - - 3/14 - ---- -array.[ch] - - new function, array_rshift, shifts an array right by a specified - number of elements, optionally inserting a new element 0 - -examples/bashdb/bashdb - - new single-file version of bash debugger, originally modified from - version in bash-2.04 by Gary Vaughan (the old debugger still - appears in examples/obashdb). This version has a more gdb-like - command set - -examples/bashdb/bashdb.el - - new emacs bashdb debugger mode from Masatake YAMATO - -execute_cmd.c - - don't make $LINENO relative to function start unless the shell is - currently interactive -- this is what ksh93 does and what I - believe to be the intent of POSIX.2 (this required changing some - of the test checks because the output has changed) - - run the debug trap for each command in an arithmetic for expression, - like ksh93 does - -lib/readline/vi_mode.c - - redid rl_vi_subst (binding func for `s' and `S') in terms of - rl_vi_change_to: `S' == `cc' and `s' == `c '. This makes undo - work right - - 3/18 - ---- -hashlib.c - - fixed hash_walk to return if the item function returns < 0, instead - of breaking out of the current hash chain - -array.c - - fixed array_walk to return if the item function returns < 0, like - hash_walk - -lib/sh/stringlist.c, externs.h - - new function: strlist_walk, takes a stringlist and a pointer to an - item func. Like other _walk funcs, if item func returns < 0 the - walk is cancelled - - new function: strlist_flush, frees items in the contained list - with strvec_flush - - renamed functions to have a strlist_ prefix and be more systematic - -pcomplib.c,pcomplete.h - - removed redundant `progcomp_initialized' variable - - renamed functions to have `progcomp_' or `compspec_' prefixes - like the hash library - -{bashline,pcomplete}.c,builtins/complete.def - - fixed calls to stringlist functions to use new names - - fixed calls to functions in pcomplib.c to use new names - -pcomplete.c - - made the debugging code #ifdef DEBUG -- it should be mature enough - -builtins/hash.def,parse.y - - use REVERSE_LIST(x, t) instead of (t)reverse_list(x) - -list.c,{externs,general}.h - - renamed the list functions to have a list_ prefix, changed callers - -externs.h,{execute_cmd,stringlib,subst}.c,builtins/common.c,lib/sh/stringvec.c - - word_list_to_argv -> strvec_from_word_list - - argv_to_word_list -> strvec_to_word_list - - moved functions to lib/sh/stringvec.c - -lib/sh/stringvec.c - - changed name of second argument to strvec_from_word_list from `copy' - to `alloc' so the use of `copy' between strvec_from_word_list and - strvec_to_word_list isn't as confusing - - changed name and sense of second argument to - strvec_to_word_list from `copy' to `alloc' for the same reason -- - now both functions agree on semantics of second argument - -lib/sh/stringlist.c - - ditto for strlist_from_word_list and strlist_to_word_list - -subst.c - - changed callers of strvec_to_word_list - - 3/19 - ---- -builtins/hash.def - - added `-l' option to list table or individual targets in reusable - format - - added `-d' option to remove one or more names from the table of - hashed commands (provides `unhash' or `unalias -t' functionality) - -doc/{bash.1,bashref.texi} - - documented new `-l' and `-d' options to `hash' - -hashcmd.[ch] - - renamed functions to have a `phash_' prefix and follow new naming - convention - - phash_remove now returns an int: 1 if command not in hash table, - 0 if filename removed OK - -{findcmd,variables}.c, builtins/{hash,type}.def - - changed callers to use new names from hashcmd.c - -builtins/common.[ch] - - new function, sh_notfound(s), prints standard `not found' message - - new function, sh_invalidid(s), prints standard `invalid identifier' - message - - new function, sh_restricted(s), prints standard `restricted' message - for restricted shells - - new function, sh_invalidnum(s), prints standard `invalid number' - message - - renamed bad_option to sh_invalidopt, changed to print - `invalid option' instead of `unknown option' - - new function, sh_invalidoptname, prints standard `invalid option - name' for long options - - new function, sh_badjob (s), prints standard `no such job' message - - new function, sh_invalidsig (s), prints standard `invalid signal - specification' message - - new function, sh_nojobs (s), prints standard `no job control' message - - new function, sh_needarg (s), prints standard `option requires an - argument' message - - new function, sh_neednumarg (s), prints standard `numeric - argument required' message - - new function, sh_badpid(s), prints standard `not a pid...' message - - new function, sh_erange (s, desc) prints standard `out of range' - message, optionally using `desc' to say what the argument is - -builtins/{alias,command,declare,exec,hash,type}.def - - call sh_notfound() instead of calling builtin_error directly - -builtins/{declare,getopts,read,set,setattr}.def - - call sh_invalidid() instead of calling builtin_error directly - -builtins/{cd,command,enable,exec,hash,source}.def - - call sh_restricted() instead of calling builtin_error directly - -builtins/{printf,read,ulimit}.def, builtins/common.c - - call sh_invalidnum instead of calling builtin_error directly - -builtins/{complete,declare,pushd,set}.def, builtins/bashgetopt.c - - call sh_invalidopt instead of bad_option or builtin_error directly - -builtins/{complete,set,shopt}.def - - call sh_invalidoptname instead of builtin_error directly - -builtins/{fg_bg,jobs,kill,wait}.def - - call sh_badjob instead of calling builtin_error directly - -builtins/common.c, builtins/{kill,signal}.def - - call sh_invalidsig instead of calling builtin_error directly - -builtins/{fg_bg,suspend,wait}.def - - call sh_nojobs instead of calling builtin_error directly - -builtins/{common,bashgetopt}.c, builtins/{hash,kill}.def - - call sh_neednumarg and sh_needarg where required - -builtins/{kill,wait}.def - - call sh_badpid where required - -builtins/{break,fc,history,pushd,shift,ulimit,umask}.def - - call sh_erange where appropriate - -builtins/printf.def - - new static function, printf_erange, prints standard out-of-range - warning message - -builtins/set.def - - changed so that calls to sh_invalidopt always include the leading - `+' or `-' - -builtins/shopt.def - - changed SHOPT_ERROR macro to shopt_error function - -builtins/bind.def - - regularized error messages to `bind: object: error string' like - other error messages - -builtins.h - - the `short_doc' member of a `struct builtin' is now of type - `const char *' - - the strings in `long_doc' array of a struct builtin are now const - -builtins/mkbuiltins.c - - changes for new `const' members of struct builtin - - 3/20 - ---- -lib/readline/histfile.c - - use pointers instead of indexing into buffer when reading the - contents of the history file in read_history_range and - history_truncate_file - - 3/21 - ---- -lib/readline/histfile.c - - new file, with code to mmap the history file for reading and - writing (depends on HAVE_MMAP, currently nothing checks for that) - - 3/25 - ---- -error.[ch] - - new function, err_badarraysub(s), calls report_error with standard - `bad array subscript' message - - new function, err_unboundvar(s), calls report_error with standard - `unbound variable' message - - new function, err_readonly(s), calls report_error with standard - `readonly variable' message - -{arrayfunc,subst}.c - - call err_badarraysub where appropriate - -{expr,subst}.c - - call err_unboundvar where appropriate - -{arrayfunc,variables}.c - - call err_readonly where appropriate - -shell.c - - changed text of bad option error messages to be the same as that - printed for builtin errors - -builtins/common.c - - changed sh_invalidopt to print the invalid option before the rest - of the error message (required some tests to be modified) - - new function, sh_readonly, calls builtin_error with standard - `readonly variable' message - -variables.c,builtins/declare.def - - call sh_readonly where appropriate - -lib/sh/stringvec.c - - added strvec_remove (sv, s), removes S from SV and shuffles rest of - elements down 1 - -lib/sh/stringlist.c - - added strlist_remove(sl, s), just calls strvec_remove on the - component list - -externs.h - - new extern declarations for strvec_remove and strlist_remove - - fixed extern declaration for strvec_search; the arguments were - reversed (unimportant, it's not compiled into the shell) - -subst.c - - change param_expand to call quote_escapes on values retrieved when - expanding the positional parameters - - change parameter_brace_expand_word to quote escapes on values - retrieved when expanding the positional parameters - - fix parameter_brace_substring to quote escape characters on unquoted - substrings extracted from variable values (needed to separate case - VT_VARIABLE from VT_ARRAYMEMBER for this, since, because - get_var_and_type calls array_value for VT_ARRAYMEMBER, we need to - skip over quoted characters in an already-appropriately-quoted - string to find the substring we want) - - fix parameter_brace_substring to quote escape characters in the - value returned by pos_params when expanding subsets of the - positional parameters and not within double quotes (in which case - pos_params() quotes the string for us) - - fix parameter_brace_substring to quote escape characters in the - value returned by array_subrange when expanding subsets of an - array and not within double quotes (in which case - array_subrange() quotes the string for us) - - new function, quoted_strlen(s), does strlen(s) while skipping over - characters quoted with CTLESC (#ifdef INCLUDE_UNUSED, since it's - not used yet) - - changed pos_params() so it always returns a list whose members are - quoted strings if (quoted&(Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) != 0 - -arrayfunc.c - - fix array_value to consistently call quote_escapes, even when a - non-array variable is being subscripted with element 0, in which - case we return the variable value - -lib/sh/strtrans.c - - make the for_echo parameter to ansicstr a `flags' parameter that - has its old `for echo' meaning if flags&1 is non-zero (which is - consistent with the old code) - - Added code to the `flags' parameter to ansicstr so that if flags&2 - is non-zero, CTLESC and CTLNUL are escaped with CTLESC in the - expanded string - - change ansiexpand() to call ansicstr with a `flags' parameter of 2 - - 3/26 - ---- -lib/readline/histfile.c - - when reading and writing the history file, use malloc instead of - xmalloc and handle failures gracefully, so the application doesn't - abort if the history file or history list is too big - - 3/27 - ---- -arrayfunc.c - - changed array_value_internal to take an additional `int *' - parameter, in which is returned the type of array indexing - performed (array[@] vs. array or array[index]) - - changed array_value and get_array_value to take a corresponding - extra parameter and pass it to array_value_internal - - changed array_value_internal to no longer return newly-allocated - memory or quote CTLESC and CTLNUL in the returned string if - `simple' array indexing (subscript not `@' or `*') is being - performed. This makes it more like a variable lookup - -arrayfunc.h - - changed prototypes for array_value and get_array_value - -expr.c - - added new parameter to call to get_array_value in expr_streval - - don't need to free memory returned by get_array_value any more - -subst.c - - quote_escapes now works with multibyte characters - - dequote_string now works with multibyte characters - - dequote_escapes is now needed, so it's compiled in, and it - now works with multibyte characters - - remove_quoted_escapes now just calls dequote_escapes and copies the - result over the argument string - - remove_quoted_nulls now returns its char * argument, parallels - remove_quoted_escapes - - parameter_brace_expand_word now passes the new argument to - array_value and quotes CTLESC and CTLNUL in the result if it's a - `simple' array expansion by calling quote_escapes - - get_var_and_type now returns VT_ARRAYMEMBER for references like - ${array} where `array' is an array variable (just like ${array[0]}). - Documented (in comment) that a VT_VARIABLE return value means that - quote_escapes has been called at some point - - changed callers of get_var_and_type to no longer free value if - VT_ARRAYMEMBER is returned as type - - changed parameter_brace_substring and parameter_brace_patsub to - call dequote_escapes on the value from get_var_and_type if the - type is VT_VARIABLE, since the substring and pattern substitution - code doesn't understand CTLESC quoting - - parameter_brace_substring no longer needs to call quoted_substring - for the VT_ARRAYMEMBER case - - changed parameter_brace_patsub to call quote_escapes on the result - of pat_subst for the VT_VARIABLE and VT_ARRAYMEMBER cases, and to - quote the returned string in the VT_ARRAYVAR and VT_POSPARAMS cases - if the `MATCH_QUOTED' flag isn't set (if it is, the pattern - substitution functions perform any necessary quoting) - - quoted_substring is no longer used; it's now #ifdef INCLUDE_UNUSED - -lib/malloc/mstats.h - - new member in _malstats: u_bits32_t bytesreq, the total number of - bytes requested by the caller via calls to malloc() and realloc() - -lib/malloc/stats.c - - print bytesreq member in _print_malloc_stats - - don't print statistics for buckets for which nmal == 0 (no mallocs) - -lib/malloc/malloc.c - - modified internal_malloc, internal_realloc to keep running total of - number of bytes requested by calling application - -shell.c - - sh_exit is now compiled in; exit_shell calls sh_exit - -error.c - - changed fatal_error, report_error, parser_error to call sh_exit - - 3/28 - ---- -subst.[ch] - - changed Q_NOQUOTE to Q_PATQUOTE; it makes the intent more clear - -subst.c - - moved code from parameter_brace_expand into a new function that - dispatches for pattern substitution: parameter_brace_remove_pattern - - changed structure of parameter_brace_remove_pattern to be like - parameter_brace_patsub and its ilk: call get_var_and_type to - isolate the variable name, move the pattern isolation code out of - the various *_remove_pattern functions into - parameter_brace_remove_pattern and pass the results to the various - functions, use a switch on the return value from get_var_and_type - to decide which function to call, regularized the arguments to the - separate pattern removal functions - - parameter_brace_remove_pattern now properly quotes escape chars in - the returned value - - changed get_var_and_type to call dequote_escapes on the `value' - parameter for case VT_VARIABLE and return the result in *valp, - so the calling functions don't have to do it themselves; changed - callers appropriately - - fixed getpattern() where it broke posix compliance: if you enclose - a pattern removal spec in double quotes, the outer double quotes - have no effect on the pattern (POSIX.1-200x 2.6.2). This uncovered - a bug in the test suite (!) - -pathexp.c - - fixed a problem with quote_string_for_globbing where it would change - consecutive CTLESC chars all to \ instead of changing every other - quoted char - - 3/31 - ---- -lib/malloc/{malloc,stats}.c - - moved declaration of _mstats to malloc.c so stats.o doesn't get - linked into the shell if the stats functions aren't called - - 4/2 - --- -lib/glob/smatch.c - - introduce `XCHAR' define, which is the type of arguments passed to - strcoll/strcmp/strlen and their wide-character equivalents, added - appropriate casts - - static arrays in single-byte version of rangecmp() are `char', not - `unsigned char', so compilers don't complain about calls to strcoll - -lib/glob/sm_loop.c - - casts for `XCHAR' and `XCHAR *' arguments to libc functions - - use prototype declaration for BRACKMATCH if `PROTOTYPES' is defined - to avoid problems with type promotion (unsigned char -> int) - -lib/glob/collsyms.h - - `name' member of struct _COLLSYM is now of type `XCHAR *', since - some compilers don't like `unsigned char *' initializers from - constant strings - -[bash-2.05b-alpha1 released] - - 4/3 - --- -builtins/{evalstring.c,common.h} - - new flag for parse_and_execute, SEVAL_NOFREE, means to not free - the argument string when finished - -lib/readline/text.c - - fixed a trivial typo in _rl_insert_char when reading multibyte - char sequences - - replace calls to ding() with rl_ding() - -include/chartypes.h - - remove SIGN_EXTEND_CHAR and TOASCII macros; they're unused - -make_cmd.c - - include dispose_cmd.h for extern function declarations - -lib/glob/glob.c - - include `shmbutil.h' and `xmalloc.h' for extern function declarations - -lib/glob/smatch.c - - include `xmalloc.h' for extern function declarations - -shell.c - - fix maybe_make_restricted to use its argument instead of global - `shell_name' - -version.c - - update copyright message to include this year - -lib/readline/display.c - - fixes from Jiro SEKIBA to fix autowrapping - when using multibyte characters - -lib/glob/sm_loop.c - - fixed a problem in BRACKMATCH where not enough memory was allocated - to hold a multibyte character when parsing POSIX.2 char class names - -support/config.{guess,sub} - - updated via patch from Paul Eggert with latest GNU additions - -variables.c - - var_lookup should use its `vcontext' argument instead of - unconditionally using `shell_variables' - - 4/4 - --- -builtins/bind.def,doc/{bash.1,bashref.texi} - - changed the usage summary and help text to make it clear that any - readline command that may appear in ~/.inputrc may be supplied as - one of the non-option arguments to `bind' - -builtins/mkbuiltins.c - - added support for `-H' option, which means to write long documentation - for each builtin to a separate file in the `helpfiles' directory - -builtins/Makefile.in - - new target `helpdoc', just creates long doc files in helpfiles - directory - -lib/sh/zcatfd.c - - new file, with zcatfd(int fd, int ofd, char *fn); dumps data from - FD to OFD - -Makefile.in,lib/sh/Makefile.in - - added zcatfd.c, zcatfd.o member of libsh.a - -builtins/evalstring.c - - changed cat_file to call zcatfd(fd, 1, fn) - -builtins/{shopt,colon}.def - - removed the $DOCNAME directive for `shopt', `true', and `false'; - just use the names - - changed $DOCNAME for `:' to just be `colon' instead of - `colon_builtin' - -builtins/reserved.def - - added help entries for ((, [[, `for ((' - -builtins/let.def - - add id++, id--, ++id, --id, ** to help text - - 4/8 - --- -builtins/bashgetopt.[ch] - - changed to allow options beginning with `+', enabled by a leading - `+' in the option string - - new variable, list_opttype, set to `-' or `+' - -builtins/{common.c,{builtin,eval,exit,fg_bg,let,printf,pushd,return,source,wait}.def - - changes to allow a `--' option for every builtin that accepts - operands but not options, as per posix.1-2001 - -builtins/{declare,setattr}.def - - use internal_getopt for parsing options, now that it supports `+' - -builtins/set.def - - use internal_getopt for initial option parse, now that it supports - a leading `+' - - -{configure,Makefile}.in, builtins/{Makefile.in,help.def,mkbuiltins.c} - - support for a new configure option, ``--enable-separate-helpfiles'', - moves the `long' help text to separate help files, installed by - default into ${datadir}/bash, one file per builtin. Off by - default -- it saves 47K, but it's only 47K, and it's in the text - segment - -flags.c - - build internal_getopt() option string argument from flags array at - runtime in shell.c - -shell.c - - new variable to control writing malloc stats at exit: - malloc_trace_at_exit, 0 by default - -lib/malloc/malloc.c - - heavily updated: - o partial page allocated on first call to malloc to make - subsequent sbrks page-aligned no longer wasted - o begin and end range guards are now the same value: the chunk - requested - o coalescing code was changed to attempt to coalesce first two - adjacent blocks on the free list; enabled by default - o blocks of size 32 are now candidates for larger block - splitting, since 32 is the most popular size - o blocks of size 32 are now candidates for smaller block - coalescing - o the IN_BUCKET check was changed to just make sure that the - size isn't too big for the bucket, since the `busy block' - checking code may increase the bucket by one or more, - meaning that the old check would fail and cause a panic when - a chunk allocated in such a way was freed - o bin sizes are now precomputed and looked up in an array - rather than being computed at runtime - o moved the _mstats declaration here to avoid the stats code - being linked in even when no stats functions were called - (only matters if MALLOC_DEBUG is defined) - o malloc now keeps track of the address of the top of the heap - and will return large chunks to the system with calls to - sbrk with a negative argument when freeing the top chunk. - Two thresholds: LESSCORE_FRC means to unconditionally return - memory to the system; LESSCORE_MIN means to return memory if - there's at least one block already on the free list - -lib/malloc/mstats.h - - stats struct now keeps track of number of block coalesces by bin, - and the number of times memory was returned to the system by bin - -lib/malloc/stats.c - - trace_malloc_stats now takes a second argument: the name of the file - to write to. The first `%p' in the template file name is replaced - by the pid - - 4/9 - --- -lib/malloc/imalloc.h - - added some macros derived from dlmalloc and glibc malloc to inline - memcpy and memset if the requested size is <= 32 bytes - -lib/malloc/malloc.c - - use MALLOC_MEMSET instead of memset in internal_{malloc,free} - -include/ocache.h - - use OC_MEMSET (variant of MALLOC_MEMSET) in ocache_free - -configure.in, config.h.in - - check for getservent(), define HAVE_GETSERVENT if found - -bashline.c - - punt immediately from bash_servicename_completion_function if - HAVE_GETSERVENT is not defined (cygwin seems to not define it) - - include "input.h" for extern save_token_state() and - restore_token_state() declarations - - change bash_execute_unix_command to call parse_and_execute with - SEVAL_NOHIST flag so the command doesn't get saved on the history - list - - change bash_execute_unix_command to save and restore the current - command line count and the token state (last_read_token, etc.). - Everything else is saved by either parse_and_execute directly or - the call it makes to push_stream(). The shell_input_line stuff - doesn't need to be saved and restored; it's not computed until - readline() returns - - 4/10 - ---- -lib/glob/glob.[ch] - - glob_filename and glob_vector now take an additional `flags' arg - - define GX_MARKDIRS as possible flag value for glob_filename and - glob_vector - -lib/sh/snprintf.c - - fixed some bugs with handling of `g' and `G' formats - - make sure numtoa returns the fractional part correctly when passed 0 - - implemented thousands grouping for `'' flag character - -lib/sh/rename.c - - a few changes to make it more bulletproof - - 4/11 - ---- -lib/glob/glob.c - - added the couple of dozen lines of code to glob_dir_to_array to - finish implementing GX_MARKDIRS - -builtins/set.def - - changed unset builtin so that it no longer considers unsetting an - unset variable or function to be an error - -lib/readline/display.c - - fix to rl_redisplay for a problem which caused display to be messed - up when the last line of a multi-line prompt (possibly containing - invisible characters) was longer than the screen width - - 4/15 - ---- -aclocal.m4 - - use AC_DEFINE_UNQUOTED in BASH_SYS_DEFAULT_MAIL_DIR instead of - enumerating all of the possible values and using AC_DEFINE - - 4/16 - ---- -Makefile.in, {builtins,support}/Makefile.in - - new variables, CFLAGS_FOR_BUILD and CPPFLAGS_FOR_BUILD, substituted - by `configure' - - changed CCFLAGS_FOR_BUILD to BASE_CCFLAGS, removing $(CPPFLAGS); - CCFLAGS and CCFLAGS_FOR_BUILD now include $(BASE_CCFLAGS) with - (possibly) different values for CPPFLAGS and CFLAGS - - GCC_LINT_CFLAGS now includes $(BASE_CCFLAGS) and $(CPPFLAGS) - instead of CCFLAGS_FOR_BUILD - - new variable, LDFLAGS_FOR_BUILD, right now equivalent to LDFLAGS - - remove $(CPPFLAGS) from recipes for buildversion, mksignames, and - mksyntax - -configure.in - - compute and substitute CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and - LDFLAGS_FOR_BUILD - - changed qnx to use LOCAL_LDFLAGS and LOCAL_LIBS instead of putting - everything in LOCAL_LDFLAGS - -builtins/Makefile.in - - remove $(PROFILE_FLAGS) from recipe for building `mkbuiltins' - - use LDFLAGS_FOR_BUILD instead of LDFLAGS in recipe for building - `mkbuiltins' - -Makefile.in - - use $(CC_FOR_BUILD) and $(CCFLAGS_FOR_BUILD) to build auxiliary - test programs (printenv, recho, zecho) - -support/Makefile.in - - use CC_FOR_BUILD and CCFLAGS_FOR_BUILD in recipe for building - `man2html' - -lib/tilde/Makefile.in - - substitute PROFILE_FLAGS, use PROFILE_FLAGS in $(CCFLAGS) - - 4/25 - ---- -Makefile.in, configure.in - - moved RELSTATUS to configure.in; configure substitutes it into - the generated Makefile - -lib/sh/snprintf.c - - fix wchars() to deal with systems where MB_CUR_MAX is not a - constant expression - - 5/2 - --- -lib/sh/shquote.c - - add `,' to list of chars that are backslash-quoted. It doesn't - hurt normal usage and prevents filenames with commas from being - inappropriately split by brace expansion after using - complete-into-braces - - 5/6 - --- -lib/sh/xstrchr.c - - we only need the check of MB_CUR_MAX and the slow code for a - few encodings, and even then only for a subset of the charset - -arrayfunc.c - - some speedups for skipsubscript and multibyte chars from Bruno Haible - -locale.c - - changed set_lang to call setlocale(LC_ALL, ...) if LC_ALL doesn't - already have a value, but doesn't change any shell variables - -include/shmbutil.h - - major speedups from Bruno Haible, mostly concerned with reducing - the number of strlen(3) calls - -subst.c - - change callers of macros in shmbutil.h to add extra argument as - necessary - - skip_single_quoted and skip_double_quoted take another argument: - the length of the string; mostly useful when using multibyte chars - - many speedups from precomputing string lengths at function start - - fixed a small bug in de_backslash in the midst of rewriting for - better efficiency - -{braces,make_cmd,pathexp}.c - - change callers of macros in shmbutil.h to add extra argument as - necessary - -pathexp.c - - fix a one-too-far problem with multibyte chars in - unquoted_glob_pattern_p - -braces.c - - brace_gobbler takes a new argument, the length of the passed string - - expand_amble takes a new argument, the length of the passed string - - 5/7 - --- -subst.c - - modified remove_quoted_nulls to eliminate the memory allocation and - do the copy in place using the same strategy as de_backslash - -lib/readline/{rldefs.h,complete.c} - - new define RL_QF_OTHER_QUOTE, so _rl_find_completion_word can note - that it found a quoting character other than \'" that appears in - rl_completer_quote_characters - - 5/9 - --- -jobs.c - - save and restore old value of jobs_list_frozen when calling trap - handlers from set_job_status_and_cleanup to avoid seg faults when - running recursive trap handlers - - 5/10 - ---- -builtins/common.h - - new #defines to use for value of changed_dollar_vars (provides - information about the caller who wants to blow away the old dollar - variables) - -builtins/common.c - - changed set_dollar_vars_changed to set changed_dollar_vars to one - of the ARGS_* values depending on the caller and environment - -builtins/source.def - - source restores the positional parameters unless the `set' builtin - was called to specify a new set while not executing a shell function - - 5/13 - ---- -POSIX - - new file, was in CWRU/POSIX.NOTES - -doc/{Makefile.in,Makefile} - - changed `posix' rule to modify ../POSIX - -doc/mkposix - - write to `POSIX' by default - -lib/sh/strtrans.c - - when ansicstr is parsing a format string for `echo -e' (or the - equivalent xpg_echo option is enabled), obey the POSIX-2001/SUSv3 - standard and accept 0-3 octal digits after a leading `0' - -doc/{bash.1,bashref.texi} - - updated `echo' description to note that up to three octal digits - are now accepted following `\0' - - 5/16 - ---- -doc/Makefile.in - - remove the generated documentation on `make distclean' if the - build directory and source directory are not the same - -Makefile.in - - descend into `support' subdirectory on a `make clean' and - `make distclean' - - remove parser-built, y.tab[ch] on a `make distclean' if the build - directory and source directory are not the same - -support/Makefile.in - - support various `clean' targets and remove man2html.o and man2html - -{configure,Makefile}.in - - move values for DEBUG and MALLOC_DEBUG into configure.in; on by - default for development versions; off by default for releases - (off for profiling, too) - - 5/21 - ---- -parse.y - - modified the grammar to allow a simple_list followed by yacc_EOF - to terminate a command. This fixes problems with things like - a backslash-newline at the end of an `eval'd string - - change handle_eof_input_unit() to reset the token state before - calling prompt_again(), in case the prompt to be evaluated contains - a command substitution - - 5/23 - ---- -lib/readline/vi_mode.c - - fix `r' command (rl_vi_change_char) when HANDLE_MULTIBYTE is defined - but MB_CUR_MAX == 1 - - 5/24 - ---- -lib/malloc/watch.c - - don't try to print `file' argument to _watch_warn if it's null - -lib/malloc/malloc.c - - changed guard checking code in internal_{malloc,free,realloc} to - access memory as (char *) and copy into a union instead of - casting and dereferencing a pointer to u_bits32_t, since that - results in unaligned accesses which will cause Sparcs to upchuck - - 5/30 - ---- -[bash-2.05b-beta1 released] - -lib/readline/text.c - - fixed a problem with rl_transpose_chars on systems supporting - multibyte characters with a locale that doesn't have any multibyte - chars - - 6/4 - --- -expr.c - - fix a/=0 and a%=0 to throw evaluation errors rather than core dumps - -lib/readline/display.c - - fix core dump when line wrapping a multibyte character (line - accidentally dropped from the original patch) - -lib/readline/mbutil.c - - fix reversed return value from _rl_is_mbchar_matched; fixes problem - with backward-char-search - - 6/10 - ---- -lib/sh/getenv.c - - fix getenv to not free value returned by find_tempenv_variable - - add setenv, putenv, unsetenv for completeness - - 6/12 - ---- -shell.c - - change init_noninteractive to init expand_aliases to the value of - posixly_correct - - don't initialize expand_aliases to posixly_correct anywhere else. - This allows the -O expand_aliases invocation option to work correctly - -general.c - - fix move_to_high_fd to not try the dup2 unless the fd loop results - in an fd > 3; just return the passed file descriptor otherwise - - use HIGH_FD_MAX, defined in general.h, instead of hard-coded 256 - as highest file descriptor to try - -subst.c - - in process_substitute, call move_to_high_fd with `maxfd' parameter - of -1 instead of 64, so move_to_high_fd will use its maximum - - 6/21 - ---- -lib/malloc/malloc.c - - don't bother calling MALLOC_MEMSET if the requested size is 0 - -builtins/setattr.def - - note in short doc that export and readonly can take assignment - statements as arguments - -error.c - - new function, error_prolog(), to capture common error message - prefix code (except for parser errors) - - 6/25 - ---- -aclocal.m4 - - add tests for standard-conforming declarations for putenv and - unsetenv in system header files - -{configure,config.h}.in - - call BASH_FUNC_STD_PUTENV and BASH_FUNC_STD_UNSETENV, define - HAVE_STD_GETENV and HAVE_STD_UNSETENV, respectively, if they - succeed - -lib/sh/getenv.c - - change putenv and unsetenv to take differing prototypes in - stdlib.h into account - - 6/27 - ---- -[bash-2.05b-beta2 released] - - 6/28 - ---- -builtins/common.c - - fix get_job_spec so that %N works when N is the size of the jobs - list (%8 means job 8, but the 7th member of the jobs array, so - it's OK if N == job_slots because the function returns N-1) - - 7/1 - --- -shell.c - - turn off line editing if $EMACS is set to `t' - - 7/10 - ---- -builtins/set.def - - remove mention of `-i' from long help doc, since it has no effect - - 7/17 - ---- -[bash-2.05b released] - - 7/18 - ---- - -lib/malloc/malloc.c - - make sure that the `free_return' label has a non-empty statement - to branch to - - 7/19 - ---- -locale.c - - only call setlocale() from set_lang() if HAVE_SETLOCALE is defined; - otherwise just return 0 - -lib/readline/mbutil.c - - only try to memset `ps' in _rl_get_char_len if it's non-NULL. Ditto - for _rl_adjust_point - - 7/23 - ---- -execute_cmd.c - - fix for executing_line_number() when compiling without conditional - commands, dparen arithmetic or the arithmetic for command - - - 7/24 - ---- -support/Makefile.in - - fix maintainer-clean, distclean, mostlyclean targets - -builtins/common.c - - fix bug in sh_nojobs where it doesn't pass the right number of args - to builtin_error - -bashline.c - - when using command completion and trying to avoid appending a slash - if there's a directory with the same name in the current directory, - use absolute_pathname() instead of just checking whether the first - char of the match is a slash to catch things like ./ and ../ - -examples/complete/bashcc-1.0.1.tar.gz - - a package of completions for Clear Case, from Richard S. Smith - (http://www.rssnet.org/bashcc.html) - -input.c - - fix check_bash_input to call sync_buffered_stream if the passed fd - is 0 and the shell is currently reading input from fd 0 -- all it - should cost is maybe an additional read system call, and it fixes - the bug where an input redirection to a builtin inside a script - which is being read from stdin causes the already-read-and-buffered - part of the script to be thrown away, e.g.: - - bash < x1 - - where x1 is - - hostname - read Input < t.in - echo $Input - echo xxx - -execute_cmd.c - - in initialize_subshell(), call unset_bash_input (0) to not mess with - fd 0 if that's where bash thinks it's reading input from. Fixes - bug reported by jg@cs.tu-berlin.de on 17 July 2002. Should be a way - to check whether or not the current fd 0 at the time of the call has - not been redirected, like in the bug report. Also might eventually - want to throw in a sync_buffered_stream if bash is reading input - from fd 0 in a non-interactive shell into a buffered stream, so the - stream is sync'd -- might be necessary for some uses - - 7/25 - ---- -lib/readline/signals.c - - make sure rl_catch_sigwinch is declared even if SIGWINCH is not - defined, so the readline state saving and restoring functions in - readline.c are always the same size even if SIGWINCH is not defined, - and undefined references don't occur when SIGWINCH is not defined - - 7/30 - ---- -bashline.c - - augment patch from 7/24 to not disable rl_filename_completion_desired - if the first char of the match is `~' - -lib/readline/bind.c - - when creating `shadow' keymaps `bound' to ANYOTHERKEY, don't bind - a key whose type is ISFUNC but whose function is the `fake' - rl_do_lowercase_version (fixes debian bash bug #154123) - -lib/readline/readline.c - - don't call _rl_vi_set_last from _rl_dispatch_subseq if - key == ANYOTHERKEY (when truncated to `sizeof(char)', it will be 0, - which strchr will find in `vi_textmod') - - 7/31 - ---- -lib/readline/input.c - - fix rl_gather_tyi to only slurp up one line of available input, even - if more than one line is available (fixes debian bash bug #144585) - - 8/3 - --- -bashline.c - - better fix for command completion problem -- test for directory - explicitly with test_for_directory before turning off - rl_filename_completion_desired, since that's the case we're trying - to protect against - - 8/5 - --- -include/shmbutil.h - - fix ADVANCE_CHAR macro to advance the string pointer if mbrlen - returns 0, indicating that the null wide character (wide string - terminator) was found (debian bash bug #155436) - -lib/readline/mbutil.c - - fix _rl_adjust_point to increment the string pointer if mbrlen - returns 0 - -support/shobj-conf - - fix for the `-install_name' value in SHLIB_XLDFLAGS assignment for - Darwin from the fink folks - - 8/6 - --- -builtins/exit.def - - broke code that runs ~/.bash_logout out into a separate function: - bash_logout() - -builtins/common.h - - extern declaration for bash_logout() - -eval.c - - call bash_logout() from alrm_catcher(), so timed-out login shells - run ~/.bash_logout before processing the exit trap - -lib/sh/strtrans.c - - implemented $'\x{hexdigits}' expansion from ksh93 - -configure.in - - define RECYCLES_PIDS in LOCAL_CFLAGS for cygwin; don't bother to - link with -luser32 - -examples/loadables/strftime.c - - new loadable builtin, interface to strftime(3) - - 8/7 - --- -parse.y - - parse_arith_cmd now takes a second argument, a flag saying whether - or not to add double quotes to a parsed arithmetic command; changed - callers - - changed parse_dparen so it tells parse_arith_cmd to not add the - double quotes and therefore doesn't need to remove them - - change parse_dparen to add W_NOGLOB|W_NOSPLIT|W_QUOTED flags to word - created when parsing (( ... )) arithmetic command, since the double - quotes are no longer added - -make_cmd.c - - in make_arith_for_expr, set the flags on the created word to - W_NOGLOB|W_NOSPLIT|W_QUOTED - -execute_cmd.c - - change execute_arith_command to expand the expression with - expand_words_no_vars, like the arithmetic for command code does - - fix execute_arith_command to handle the case where the expanded - expression results in a NULL word without crashing - -tests/{arith-for,cprint}.tests - - change expected output to account for no longer adding quotes to - ((...)) commands - - 8/8 - --- -print_cmd.c - - take out the space after printing the `((' and before printing the - `))' in print_arith_command, print_arith_for_command, and - xtrace_print_arith_cmd - -tests/{arith-for,cprint}.tests - - change expected output to account for no longer adding leading and - trailing spaces when printing ((...)) and arithmetic for commands - - 8/17 - ---- -subst.c - - fix issep() define to handle case where separators[0] == '\0', in - which case it always returns false - -lib/readline/histexpand.c - - fix off-by-one error in history_expand_internal when using the `g' - modifier that causes it to skip every other match when matching a - single character (reported by gjyun90@resl.auto.inha.ac.kr) - -doc/{bash.1,bashref.texi} - - make sure that the name=word form of argument to declare/typeset, - export, and readonly is documented in the description - - 8/30 - ---- -lib/readline/histexpand.c - - make history_expand_internal understand double quotes, because - single quotes are not special inside double quotes, according to - our shell-like quoting conventions. We don't want unmatched - single quotes inside double-quoted strings inhibiting history - expansion - - make `a' modifier equivalent to `g' modifier for compatibility with - the BSD csh - - add a `G' modifier that performs a given substitution once per word - (tokenized as the shell would do it) like the BSD csh `g' modifier - - 8/31 - ---- -braces.c - - when compiling for the shell, treat ${...} like \{...} instead of - trying to peek backward when we see a `{'. This makes it easier - to handle things like \${, which should be brace expanded because - the $ is quoted - - 9/7 - --- -aclocal.m4 - - redirect stdin from /dev/null in BASH_CHECK_DEV_FD before testing - the readability of /dev/fd/0, so we're dealing with a known quantity - - 9/11 - ---- -[prayers for the victims of 9/11/01] - -shell.c - - fix maybe_make_restricted to handle a restricted login shell with a - base pathname of `-rbash' and skip over any leading `-' - - 9/13 - ---- -builtins/evalstring.c - - in parse_and_execute, make sure we don't try to run unwind-protects - back to `pe_dispose' after a longjmp back to top_level if the - pe_dispose frame hasn't been initialized - -lib/readline/display.c - - fix problem with prompt overwriting previous output when the output - doesn't contain a newline in a multi-byte locale. This also should - fix the problem of bash slowing down drastically on long lines when - using a multi-byte locale, because it no longer tries to rewrite the - entire line each time. Patch from Jiro SEKIBA - -parse.y - - move the typedef for alias_t that is compiled in if ALIAS is not - defined up before the prototype for push_string, since that takes - an alias_t * parameter - -lib/readline/terminal.c - - bind the termcap description's left and right arrow keys to - rl_backward_char and rl_forward_char, respectively, instead of - rl_forward and rl_backward (which are just there for backwards - compatibility) - -aclocal.m4 - - when testing readability of /dev/stdin, redirect stdin from /dev/null - to make sure it's a readable file - - 9/17 - ---- -config-bot.h - - don't test __STDC__ when deciding whether or not to use stdarg.h; - just use it if it's present - -tests/read2.sub - - redirect from /dev/tty when using `read -t' - - 9/20 - ---- -builtins/history.def - - when reading `new' entries from the history file with `history -n', - fix increment of history_lines_this_session by taking any change - in history_base into account - -lib/sh/pathphys.c - - changes to sh_physpath to deal with pathnames that end up being - longer than PATH_MAX without dumping core - -lib/readline/doc/{history.3,hsuser.texinfo},doc/ bash.1 - - documented new `a' and `G' history modifiers - - 9/25 - ---- -lib/readline/misc.c - - when traversing the history list with arrow keys in vi insertion - mode, put the cursor at the end of the line (like in emacs mode) - -mksyntax.c - - don't try to use \a and \v unless __STDC__ is defined; use the - ascii integer equivalents otherwise - - include "config.h" in the generated syntax.c file for a possible - definition of `const' - -doc/{bash.1,bashref.texi} - - document the meaning of a null directory in $PATH - - 9/26 - ---- -parse.y - - fix set_line_mbstate to handle case where mbrlen() returns 0, - indicating the null wide character - - fix set_line_mbstate so we don't directly compare a char variable - to EOF, since char can (and is) unsigned on some machines - -bashline.c - - change bash_execute_unix_command to save a little bit more state: - last_shell_builtin, this_shell_builtin, last_command_exit_value - - 9/27 - ---- -execute_cmd.c - - tentative change to execute_simple_command to avoid freeing freed - memory in the case where bash forks early but still ends up calling - execute_disk_command, without passing newly-allocated memory to - make_child. This may fix the core dumps with the linux-from-scratch - folks - - 9/28 - ---- -Makefile.in,{builtins,lib/sh}/Makefile.in - - fix up dependencies, mostly on ${BUILD_DIR}/version.h, so that - parallel makes work with GNU and BSD makes - -shell.h - - new struct to save partial parsing state when doing things like - bash_execute_unix_command and other operations that execute - commands while a line is being entered and parsed - -parse.y - - new functions, save_parser_state() and restore_parser_state(), to - save and restore partial parsing state - -bashline.c - - change bash_execute_unix_command to call {save,restore}_parser_state - -builtins/jobs.def - - change execute_list_with_replacements to eliminate a run_unwind_frame - in favor of calling the cleanup explicitly and discarding the frame - -execute_cmd.c - - change execute_for_command to avoid a run_unwind_frame in the case - where the loop variable is readonly or otherwise not assignable - - change execute_select_command and execute_simple_command to use - discard_unwind_frame by running the cleanup code explicitly, instead - of using run_unwind_frame - - make sure execute_select_command decreases loop_level even on error - - 9/30 - ---- -doc/{bash.1,bashref.texi} - - fixed description of `unset' now that unsetting a previously-unset - variable is no longer an error - - 10/3 - ---- -{configure,config.h}.in - - augment check for strtold with additional check to detect the - horribly broken hp/ux 11.x implementation that returns `long_double'; - defines STRTOLD_BROKEN if so - -builtins/printf.def - - define floatmax_t as `double' if STRTOLD_BROKEN is defined - - 10/5 - ---- -lib/readline/keymaps.c - - don't automatically bind uppercase keys to rl_do_lowercase_version - in rl_make_bare_keymap - -lib/readline/readline.c - - explicitly check for ANYOTHERKEY binding to rl_do_lowercase_version - and dispatch to lowercase of key when a prefix is not matched - - 10/12 - ----- -bashline.c - - set COMP_WORDBREAKS in enable_hostname_completion to the value - of rl_completer_word_break_characters - -variables.c - - new special variable COMP_WORDBREAKS, controls the value of - rl_completer_word_break_characters - -variables.h - - new extern declaration for sv_comp_wordbreaks() - -subst.c - - change split_at_delims to behave more like shell word splitting if - the passed value for the delimiters is NULL, indicating that the - function is to use $IFS to split - -{execute_cmd,jobs,test,findcmd,input,make_cmd,redir,shell}.c -builtins/mkbuiltins.c,builtins/{fc,history,source,umask}.def -lib/sh/netconn.c -lib/termcap/termcap.c -lib/readline/histfile.c - - make sure all inclusions of are protected by - HAVE_SYS_FILE_H - -bashline.c - - don't turn off rl_filename_completion_desired in - attempt_shell_completion if the partial pathname contains a slash. - This still doesn't solve the problem of partial pathname completion - starting with a directory in the current directory without a - leading `./'. There's no way to tell the difference between that - and a file found in $PATH (which may contain `.') at the point that - attempt_shell_completion acts - - 10/18 - ----- -locale.c - - don't set lc_all to the default locale when LC_ALL is being unset - - new function, reset_locale_vars(), called to recompute the correct - locale variable values when LC_ALL is unset - - changed set_lang to not set LC_ALL, which it never should have been - doing in the first place, and to maintain a local variable `lang' - corresponding to $LANG - - change get_locale_var to use the precedence posix.2 specifies: - LC_ALL overrides individual variables; LANG, if set, is the default - - change set_locale_var to call get_locale_var to get the appropriate - value for the variable being set or unset - - call get_locale_var instead of using passed value in set_locale_var - to get the defaulting and precedence right - -lib/readline/nls.c - - new function, _rl_get_locale_var(), which does the same thing as - locale.c:get_locale_var(), with the right precedence and defaulting, - using sh_get_env_value to get the right bash variable values - - if HAVE_SETLOCALE is defined, _rl_init_eightbit first calls - _rl_get_locale_var to get the right value for LC_CTYPE, and uses - that in the call to setlocale. If _rl_get_locale_var returns NULL, - call setlocale() to get the current international environment, and, - finally, if that returns null, call setlocale with a second argument - of "" to force the implementation's `native' environment - -pcomplete.c - - change gen_wordlist_completions to dequote the text before comparing - it against the expanded word list - - changed gen_matches_from_itemlist to do the same thing - -bashline.c - - new global function, bash_dequote_word, calls bash_dequote_filename - on the text passed. Used by the programmable completion code - -lib/readline/histfile.c - - make sure that whenever read_history_range returns a non-zero value - that it sets errno to some useful value - - 10/19 - ----- -variables.c - - COMP_WORDBREAKS is now a dynamic variable, mirroring value of - rl_completer_word_break_characters. Makes sure that the variable - always points to dynamic memory if it's not null or the readline - default - -bashline.c - - change enable_hostname_completion to manage a dynamic value of - rl_completer_word_break_characters, since assignments to - COMP_WORDBREAKS can change its value unpredictably - -lib/readline/{complete.c,readline.h} - - rl_completer_word_break_characters no longer has `const' attribute - -bashline.c - - clean up necessary places due to rl_completer_word_break_characters - no longer being `const' - -doc/{bash.1,bashref.texi} - - document new COMP_WORDBREAKS variable - - 10/21 - ----- -print_cmd.c - - fix indirection_level_string to handle the case where the decoded - $PS4 is null without seg faulting - - 10/22 - ----- -builtins/shift.def - - make sure that there is actually an argument when reporting a shift - count that exceeds the number of positional paramters and - shift_verbose is enabled - -lib/readline/rltty.c - - change SET_SPECIAL to call a new function, set_special_char, since - it contains a block. It's called infrequently, so the performance - impact of making it a function should be negligible, and it helps - debugging - - 10/29 - ----- -bashline.c - - make sure the editor in VI_EDIT_COMMAND and EMACS_EDIT_COMMAND is - quoted; it might contain spaces (e.g., `emacs -nw') - -aclocal.m4 - - cache ac_cv_rl_version in RL_LIB_READLINE_VERSION macro - -configure.in - - change logic that sets RL_INCLUDEDIR so that it doesn't try to set - a bogus include path if the argument to --with-installed-readline - is `yes' -- helps with cross-compiling - -lib/readline/histexpand.c - - fix history_tokenize_word so that it handles <( and >( better - - 10/30 - ----- -redir.c - - fix write_here_string so it handles the case where `herestr' expands - to NULL without seg faulting - - 10/31 - ----- -mailcheck.c - - reverse logic flip from bash-2.05 that handled systems that don't - change the atime when the mailbox is accessed; make sure the file - is bigger before we report new mail. This is the case in the vast - majority of cases. Reported by jim@jtan.com - - 11/5 - ---- -parse.y - - change action for `for x; { list; }' and corresponding `select' - production to use \"$@\" instead of just $@, as it is with all the - other actions - - 11/9 - ---- -parse.y - - new flag for parse_matched_pair: P_DQUOTE, indicating that the - pair of characters being matched is between double quotes - - parse_matched_pair now passes P_DQUOTE down to recursive calls: - if the open char to be matched is a `"' or the passed-in flags - include P_DQUOTE, set the local `rflags' variable to P_DQUOTE and - pass `rflags' down to recursive calls - - if `rflags' includes P_DQUOTE, don't try to ansiexpand $'...' or - locale expand $"..."; consistent with other quoting constructs - - 11/11 - ----- -doc/{bash.1,bashref.texi} - - explicitly note that variables referenced in arithmetic expressions - without using `$' evaluate to 0 if they are null or unset - - note that a null variable value evaluates to 0 when used in an - arithmetic context, like when a variable with the `-i' attribute is - assigned a null value - - document the ${!prefix@} expansion as equivalent to ${!prefix*} - - 11/12 - ----- -doc/{bash.1,bashref.texi} - - note that the value of an arithmetic expression is as in C - - change the wording to note that `arithmetic evaluation' (not - arithmetic expansion, which has a different meaning) is performed - on the value assigned to a variable whose integer attribute is set - - 11/13 - ----- -execute_cmd.c - - fix execute_disk_command so it calls exit() after printing the error - message in a restricted shell context if the shell has already forked - (nofork != 0 && there are no pipes) - - 11/19 - ----- -builtins/type.def - - don't report on aliases unless expand_aliases is set and the parser - is performing alias expansion; changed tests/type.tests and - tests/type.right accordingly - - 11/25 - ----- -general.c - - fix for full pathnames including drive letters on cygwin from - Corinna (convert to posix-style paths, which the rest of the - code handles much better) - -lib/readline/text.c - - fixes to overwrite mode from jimmy@is-vn.bg: - o in _rl_overwrite_char, do the overwrite mode self-insert - as one group, even when overwriting more than 1 char - o in _rl_overwrite_char, do the insert before the delete so - that an undo positions the cursor on the character restored, - not to the right of it - o in _rl_overwrite_rubout, don't do rl_insert_char(' ') unless - rl_point < rl_end. Since overwrite-mode self-insert acts as - in insert-mode when at eol, make rubout behave like - insert-mode rubout - - 11/30 - ----- -lib/readline/misc.c - - call rl_replace_line with `1' as second parameter if we're going to - immediately overwrite the undo list - -lib/readline/search.c - - in make_history_line_current, use _rl_replace_text to make the line - replacement an undoable operation. Affects all non-incremental - search functions. - -parse.y - - make behavior introduced on 11/9 dependent on extended_quote - variable, controllable by extquote shopt option. Default setting is - on for backwards compatibility - -builtins/shopt.def - - new `extquote' option to control extended_quote variable - - 12/3 - ---- -jobs.c - - change message printed when attempting to put a background job in - the background with `bg' to include the job id and make the - statement declarative - - 12/10 - ----- -bashhist.h - - define explicit flag values for history_control - -variables.c - - change sv_history_control to use new flag values - - change sv_history_control to parse $HISTCONTROL as a colon-separated - list of values for the history_control variable - -bashhist.c - - change check_history_control to use new flag values and restructure - to remove case statement - - new function hc_erasedups(line); removes all entries matching LINE - from the history list - - call hc_erasedups() from check_add_history after we've determined - that we're saving the line - -doc/{bash.1,bashref.texi} - - documented new options available for $HISTCONTROL and that it can - be a colon-separated list of history control options - - 12/11 - ----- -subst.c - - fix pat_subst() to not increment `e' (pointer to the end of the - matched portion of the string) until after we're sure we're going - around the loop again; fixes problem with empty replacements for - a pattern that doesn't match (bug reported by Don Coleman - ) - - 12/17 - ----- -lib/readline/display.c - - fixes to multibyte redisplay from jir@yamato.ibm.com (Jiro SEKIBA): - o speed up calculation of first difference between old and new - lines in the common case - o don't try to see if we're in the middle of a multbyte char - in update_line (we'll see how this one works out) - - 12/18 - ----- -doc/bashref.texi - - make it clear that the `command-list' function definition may be - terminated by an ampersand before the closing brace - - 12/28 - ----- -redir.c - - set `expanding_redir' flag when expanding words in a redirection - -subst.c - - new function, exp_jump_to_top_level(), to do any word expansion - cleanup before a call to jump_to_top_level from within that file; - sets expanding_redir back to 0 before jump_to_top_level - -variables.c - - in find_variable(), don't call find_variable_internal with a second - parameter of 1 if expanding_redir is non-zero - - in find_variable_internal(), don't search the temporary env if - subshell_environment includes SUBSHELL_FORK (indicating a simple - command) and expanding_redir is non-zero - -parse.y - - increment line_number when we read a \ pair - -array.c - - added array_unshift_element and array_shift_element (which just call - array_shift and array_rshift, respectively), for bash debugger - support - - 1/4/2003 - -------- -doc/{bash.1,bashref.texi} - - note in the section describing the execution environment passed to - children that subshells inherit shell functions marked for export - - note in the section describing shell functions the possibility - that exported functions may result in two entries in the environment - with the same name - -parse.y - - when pushing an alias expansion onto the pushed_string list, append - a space to the expanded definition to make the parser's lookahead - work without using the `mustpop' hack in shell_getc - - 1/8 - --- -shell.c - - change calls to exit() with EX_USAGE as a parameter to use - EX_BADUSAGE instead, since EX_USAGE is defined as 258 and is - technically out of range - - 1/14 - ---- -aclocal.m4 - - check for the termcap functions in libc first: if we don't have - to link in another library, let's not do it - - change the test for mbstate_t to use AC_TRY_COMPILE instead of - AC_TRY_RUN - -doc/{bash.1,bashref.texi} - - document that bash turns line editing off if environment variable - EMACS is set to `t' when it starts up - -doc/bash.1 - - minor change to give the ftp url for the latest version of bash in - the bug reports section - -lib/readline/histexpand.c - - in get_history_event, cast a couple of `const char *' variables to - `char *' in function call parameter lists to avoid compiler warnings - - 1/21 - ---- -builtins/cd.def - - change `cd -' so it prints the current working directory after a - successful chdir even when the shell is not interactive - - 1/31 - ---- -lib/readline/doc/rltech.texinfo - - clarified exactly what is meant by the term `application-specific - completion function', made its use consistent, and documented - what variables are changed before such a function is called - -lib/readline/input.c - - new function, _rl_pushed_input_available(), returns non-zero if - there are characters in the input queue managed by rl_get_char - and _rl_unget_char - -lib/readline/rlprivate.h - - new extern declaration for _rl_pushed_input_available - -lib/readline/callback.c - - change rl_callback_read_char to check _rl_pushed_input_available - and loop if there's something there, so characters don't languish - until more keyboard input is read - -execute_cmd.c - - new variable, last_command_exit_signal, non-zero if - last_command_exit_value result from wait_for was result of a signal - -nojobs.c - - keep track of whether or not a given pid was killed by a signal with - a new flag in the pid_list array - - new function int find_termsig_by_pid(pid_t pid) to get the - terminating signal, if any, for a particular pid - - new function int get_termsig(WAIT status) returns the terminating - signal corresponding to status - - set last_command_exit_signal in wait_for and the various wait_for_xx - functions - -jobs.c - - new functions, process_exit_signal and job_exit_signal, return the - signal that killed a given process or job, if a signal caused its - death - - set last_command_exit_signal in wait_for by calling job_exit_signal - or process_exit_signal appropriately - -subst.c - - don't resend SIGINT to ourselves unless last_command_exit_signal is - SIGINT and last_command_exit_value == 128 + SIGINT. This fixes the - $(exit 130) bug reported by Paul Jarc - -expr.c - - new function, expr_bind_variable, calls bind_int_variable and - then stupidly_hack_special_variables. This fixes the - `let OPTIND=1' bug - -bashline.c - - change history_and_alias_expand_line and shell_expand_line to call - history_expand_line_internal so calls to pre_process_line are - localized - - change history_expand_line_internal and cleanup_expansion_error to - temporarily turn off hist_verify before calling pre_process_line - to avoid the effects described by teirllm@dms.auburn.edu - -parse.y - - don't unconditionally turn off PST_ALEXPNEXT in push_string. This - fixes the multiple alias expansion bug reported by Paul Jarc. - -lib/readline/vi_mode.c - - change rl_vi_subst to push `l' instead of ` ' -- it should be - equivalent, but this has been reported to fix a problem in multibyte - locales - -lib/readline/readline.h - - new state flag value RL_STATE_TTYCSAVED, indicates that save_tty_chars - has been called. Since it's only used and visible internally, it's - undocumented - -lib/readline/rltty.h - - changed all of the members of _rl_tty_chars struct to `unsigned char' - -lib/readline/rltty.c - - set the RL_STATE_TTYCSAVED after save_tty_chars is called - - new function, rl_tty_unset_default_bindings(), resets bindings for - everything rl_tty_set_default_bindings() messes with back to - rl_insert, so rl_tty_set_default_bindings can be called again with - possible changes - - new function that does the bulk of the work for - rltty_set_default_bindings: _rl_bind_tty_special_chars() - - change prepare_terminal_settings so that it can track changes to the - terminal special chars made by stty(1): unset the bindings with - rl_tty_unset_default_bindings before calling save_tty_chars, and - _rl_tty_set_default_bindings after, with the new values from - get_tty_settings(). This implements a long-standing request, most - recently made by Tim Waugh of Red Hat. - -lib/readline/readline.h - - extern declaration for rl_tty_unset_default_bindings() - -lib/readline/readline.c - - new function, reset_default_bindings, calls - rl_tty_unset_default_bindings() to reset the terminal special chars - back to rl_insert and then read the new ones - -lib/readline/doc/rltech.texinfo - - documented rl_tty_unset_default_bindings() - - 2/1 - --- -[prayers and condolences to the families of the space shuttle crew members] - -aclocal.m4 - - add checks for mbrtowc and mbrlen in BASH_CHECK_MULTIBYTE - - new check, BASH_FUNC_CTYPE_NONASCII, checks whether or not the ctype - functions handle non-ascii characters correctly - -config.h.in - - add HAVE_MBRTOWC and HAVE_MBRLEN - - add NO_MULTIBYTE_SUPPORT for new configure argument - - add CTYPE_NON_ASCII - -config-bot.h, lib/readline/rlmbutil.h - - make sure that mbrtowc, mbrlen, and wcwidth are all present before - turning on HANDLE_MULTIBYTE - - turn off multibyte chars if NO_MULTIBYTE_SUPPORT is defined - -configure.in - - new argument --enable-multibyte (enabled by default), allows - multibyte support to be turned off even on systems that support it - -lib/readline/chardefs.h - - define NON_NEGATIVE as 1 if CTYPE_NON_ASCII is defined - - 2/3 - --- -config.h.in - - add HAVE_WCTOMB - -aclocal.m4 - - check for wctomb in BASH_CHECK_MULTIBYTE - - 2/4 - --- -lib/readline/vi_mode.c - - in _rl_vi_change_mbchar_case, make sure the result from wctomb() - is NULL-terminated before trying to insert it with rl_insert_text() - - 2/5 - --- -lib/readline/display.c - - fix to update_line to avoid problems on systems with multibyte - characters when moving between history lines when the new line - has more glyphs but fewer bytes (twaugh@redhat.com) - -lib/readline/vi_mode.c - - use wcrtomb() instead of wctomb() in _rl_vi_change_mbchar_case - -pcomplete.c - - fix init_itemlist_from_varlist to handle the case where the - `varlist' is NULL - -doc/{bash.1,bashref.texi} - - clarified when a simple command may fail without the shell exiting - when -e is set - - 2/13 - ---- -parse.y - - when bash is started with --nolineediting, ignore \[ and \] when - decoding the prompt string - -subst.c - - fix remove_quoted_nulls so that a string with a CTLESC appearing - after a CTLNUL (which was removed) does not leave characters in - the string inappropriately - - 2/14 - ---- -builtins/common.h - - new flag value for parse_and_execute(): SEVAL_RESETLINE, which - allows the caller to specify whether or not the internal idea - of the line number should be reset to 1 - -builtins/evalstring.c - - parse_and_execute() now tells push_string to reset the line - number only if the SEVAL_RESETLINE flag is set by the caller - - 2/15 - ---- -builtins/evalfile.c - - pass SEVAL_RESETLINE from _evalfile() to parse_and_execute() - -subst.c - - if the shell is currently interactive, pass SEVAL_RESETLINE to - parse_and_execute() when doing command substitution - -jobs.c - - add SEVAL_RESETLINE to parse_and_execute while running SIGCHLD trap - -command.h - - add `line' members to case_com, for_com, select_com - - rearranged order of members in some of the command structs, so - `flags' and `line' are first - - added a `source_file' member to the function_def struct; keeps - track of where the function was defined - -doc/Makefile.in - - add some new suffix rules: .dvi.ps - -doc/{bash.1,bashref.texi} - - added text to the description of the `trap' builtin tightening up - the language describing when the ERR trap will be run - -error.c - - if $BASH_SOURCE (internally-maintained) exists, use BASH_SOURCE[0] - in get_name_for_error if the shell is not interactive - -array.h - - new convenience defines: array_push and array_pop - -variables.c - - change get_funcname to return this_shell_function->name only if - arrays have not been compiled into the shell - - change init_funcname_var to initialize FUNCNAME as an array variable - if we have arrays - - new function: get_self(SHELL_VAR *self), a degenerate `dynamic_value' - function for dynamic variables - - new function: init_dynamic_array_var(), a generic dynamic array - variable initializer to handle the common case - - use init_dynamic_array_var() instead of explicit init_dirstack_var() - - use init_dynamic_array_var() instead of explicit init_groups_var() - - new dynamic array variables: BASH_ARGC, BASH_ARGV, BASH_SOURCE, - BASH_LINENO, initialized with init_dynamic_array_var - -shell.c - - initialize BASH_LINENO, BASH_SOURCE, FUNCNAME in open_shell_script - -{execute_cmd,trap}.c - - take out trap_line_number, since parse_and_execute doesn't reset the - line number any more when running the trap commands - -make_cmd.c - - augment make_function_def to get source file name and call - bind_function_def to save the entire FUNCTION_DEF - -variables.c - - new hash table: shell_function_defs, keeps table of shell function - definitions including source file and line number info corresponding - to shell_functions table - - new functions: find_function_def and bind_function_def to manage - the shell_function_defs hash table - - new function: unbind_function_def to remove a function definition - from the shell_function_defs table (right now uncalled) - -variables.h - - extern declaration for bind_function_def, find_function_def - - new extern declaration for unbind_function_def - -execute_cmd.c - - in function prologue and epilogue, push and pop FUNCNAME, - BASH_SOURCE, and BASH_LINENO information - -dispose_cmd.c - - broke the code that disposes a FUNCTION_DEF out into two new - functions: dispose_function_def and dispose_function_def_contents - -dispose_cmd.h - - new extern declarations for dispose_function_def_contents and - dispose_function_def - -copy_cmd.c - - move body of copy_function_def (other than allocating a new - FUNCTION_DEF) to copy_function_def_contents - - make sure to copy the new source_file member of a function_def in - copy_function_def_contents - - copy_function_def is no longer static, copy_function_def_contents - is not either - -command.h - - new extern declaration for copy_function_def_contents and - copy_function_def - -parse.y - - keep a stack of line numbers where case, select, and for commands - start, with a maximum nesting level of 128; increment when reading - word after `for', `select' or `case' in read_token_word; decrement - in grammar actions after parsing a complete for, arith_for, select, - or case command - - create for, case, arith_for, and select commands with an extra - line number (word_lineno[word_top]) argument - -make_cmd.c - - make_for_or_select, make_for_command, make_case_command, and - make_select_command all take an extra `line_number' argument - -make_cmd.h - - corresponding changes to extern declarations for those functions - - 2/16 - ---- -{execute_cmd,shell,variables}.c - - follow each call to remember_args with a call to push_args or - pop_args to manage the BASH_ARGV and BASH_ARGC arrays. Only set - when the shell is started to run shell script or runs a shell - function. Doesn't handle `set' or `shift' yet, nor `source'. - -execute_cmd.c - - keep track of the level of subshells with a new variable, manipulated - in execute_in_subshell - - set currently_executing_command in execute_command_internal(), - even if we're running a trap - - better line number management when executing simple commands, - conditional commands, for commands in execute_command_internal() - and the various functions that implement the commands - (execute_cond_command, execute_for_command, execute_etc.) - -variables.c - - new dynamic variable BASH_SUBSHELL, with new get_subshell and - assign_subshell functions to manipulate it - - new functions push_args (WORD_LIST *list) and pop_args (void) to - manage the BASH_ARGC and BASH_ARGV dynamic array variables - -variables.h - - new extern declarations for push_args and pop_args - -builtins/evalfile.c - - in _evalfile, do appropriate things to the FUNCNAME, BASH_ARGV, - BASH_ARGC, BASH_SOURCE, and BASH_LINENO variables - -support/mksignames.c - - add another fake signal for `trap'; make NSIG+2 == `RETURN' - -trap.c - - _run_trap_internal now returns an int: the exit value of the command - run as the result of the trap - - run_debug_trap now returns an int: the exit value of the command - run as the result of the trap - - RETURN is a new special trap - - new function: set_return_trap(char *command) interface for the rest - of the shell, like set_{debug,error}_trap - - new function: run_return_trap() - - command substitution and other child processes don't inherit the - return trap - -trap.h - - new extern declaration for set_return_trap() and run_return_trap - - new defines for RETURN_TRAP; increment BASH_NSIG - - change extern declaration for run_debug_trap() since it now returns - an int - -shell.c - - new invocation long option: --debugger, turns on debugging and - sets internal `debugging_mode' variable - -execute_cmd.c - - new code to save return trap when executing a shell function, so - shell functions don't inherit it - - run debug trap before binding the variable and running the action - list in a `for' command - - run debug trap before binding the selection variable and running - the query in a `select' command - - run debug trap before running matcher in a `case' command - -builtins/set.def - - new `set -o functrace' (set -T), causes DEBUG trap to be inherited - by shell functions - - new `set -o errtrace' (set -E), causes ERR trap to be inherited - by shell functions - -flags.c - - new flags -E and -T, control error_trace_mode and - function_trace_mode respectively - -flags.h - - new extern declarations for error_trace_mode and function_trace_mode - - 2/17 - ---- -doc/bashref.texi - - changed the `dircategory' as per Karl Berry's suggestion - -doc/texinfo.tex - - update to version of 2003/02/04 from texinfo.org - -support/texi2dvi - - update to version 1.14 from texinfo-4.5 distribution - - 2/20 - ---- -support/config.{guess,sub} - - update to versions of 2002/11/30 - -lib/readline/doc/manvers.texinfo - - renamed to version.texi to match other GNU software - - UPDATE-MONTH variable is now `UPDATED-MONTH' - -lib/readline/doc/{hist,rlman,rluserman}.texinfo - - include version.texi - -doc/version.texi - - new file, with standard stuff matching other GNU distributions - -{doc,lib/readline/doc}/Makefile.in - - include right stuff for `version.texi' - -lib/readline/doc/{rluserman,rlman,hist}.texinfo - - use @copying and @insertcopying and @ifnottex instead of @ifinfo - - add FDL as an appendix entitled `Copying This Manual' - -lib/readline/doc/{rltech,rluser,hstech,hsuser}.texi - - changed the suffix from `texinfo' to `texi' - -lib/readline/doc/{rlman,rluserman}.texinfo, doc/bashref.texi - - include rltech.texi,rluser.texi,hstech.texi, and hsuser.texi - -lib/readline/doc/Makefile.in,doc/Makefile.in - - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi - -lib/readline/doc/{rlman,rluserman}.texinfo - - changed the suffix from `texinfo' to `texi' - -lib/readline/doc/hist.texinfo - - renamed to history.texi - - 2/25 - ---- -pathnames.h.in - - moved pathnames.h here so value of DEBUGGER_START_FILE can be - substituted by configure - -aclocal.m4 - - added AM_PATH_LISPDIR for debugger - -configure.in - - added some variables: `bashvers', `relstatus' to use info in more - than one place - - call AM_PATH_LISPDIR - - new option: --enable-debugger, sets DEBUGGER cpp option - - new option with AC_ARG_VAR: DEBUGGER_START_FILE - - make `pathnames.h' a file generated by configure - -Makefile.in - - add rule to create pathnames.h - -builtins/declare.def - - added extra line number and source file name to `declare -F' output - if `--debugger' is used at startup - -builtins/evalfile.c - - call run_return_trap from source_file before returning the result - from _evalfile() - -execute_cmd.c - - call run_return_trap in execute_function before restoring the old - context - -builtins/source.def - - arrange to save and restore DEBUG traps when sourcing files if - function_trace_mode (set -o functrace) is not set - -print_cmd.c - - broke print_for_command, print_select_command, print_case_command - into two functions each: one to print the `header' and one for - the body - - print_cond_command is no longer static - - print_arith_command now takes a WORD_LIST *, since it doesn't - actually do anything with the ARITH_COM it's passed except print - the enclosed WORD_LIST - - print_arith_command is no longer static - -externs.h - - extern declarations for print_{for,select,case}_command_head, - print_cond_command, print_arith_command - -{.,builtins,lib/sh}/Makefile.in - - corrected dependencies on pathnames.h, since it's now created in - the build directory - - 3/5 - --- -lib/glob/glob.c - - handle alloca() failing (it's supposed to return NULL) - - use malloc() (with its attendent bookkeeping) instead of alloca() - in glob_filename() - -subst.c - - check whether shell_glob_filename returns NULL in - glob_expand_word_list - - change parameter_brace_expand_rhs to handle cases like - ${a[2]:=value} by properly creating the array element instead of a - variable named `a[2]' (reported by ) - -variables.c - - change bind_int_variable to use valid_array_reference instead - of looking for `[' - -lib/readline/vi_mode.c - - check for `a' in _rl_vi_done_inserting so the text inserted by an - `a' command can be reinserted with a `.' - -lib/readline/readline.c - - when entering vi insertion mode in readline_internal_setup(), make - sure that _rl_vi_last_key_before_insert is set to `i' so that undo - groups and redo work better (reported by ) - -lib/glob/sm_loop.c - - handle ?(...) in a pattern immediately following a `*', instead of - ignoring the `(' and treating the `?' as a single-char match, as - long as FNM_EXTFLAG is set (reported by ) - -aclocal.m4 - - new test for presence of struct timezone, BASH_STRUCT_TIMEZONE - -config.h.in - - add HAVE_STRUCT_TIMEZONE - -configure.in - - call BASH_STRUCT_TIMEZONE - -execute_cmd.c - - don't try to use `struct timezone' in calls to gettimeofday unless - HAVE_STRUCT_TIMEZONE is defined; use (void *)NULL otherwise - - 3/20 - ---- -execute_cmd.c - - new variable, the_printed_command_except_trap, saves the command - being executed before a trap is executed, for the debugger - -trap.c - - if in debugging mode, let command substitutions and other child - processes inherit the DEBUG and ERR traps if the `functrace' - (which is really a bad name, given this semantic) or `errtrace' - options, respectively, have been set - -shell.c - - local_pending_command renamed to command_execution_string; no longer - static - -variables.c - - new dynamic variable, BASH_COMMAND, set to the command string - currently executing, or the one that caused a trap to execute - (mapped to the_printed_command_except_trap) - - new variable, BASH_EXECUTION_STRING, set to the argument to the - -c invocation option, if the shell was started that way - - 3/22 - ---- -execute_cmd.c - - changed execute_for_command, eval_arith_for_expr, - execute_select_command, execute_arith_command, execute_cond_command, - execute_simple_command to implement new DEBUG trap semantics - for the debugger: if the DEBUG trap commands return a non-zero - status and debugging_mode is non-zero, we skip the command to be - executed - -trap.c - - change run_debug_trap for the debugger: if we're in the debugger - and the DEBUG trap returns 2 while we're in a function or sourced - script, we force a `return' - -shell.c - - new function, start_debugger(), that sources the debugger start file - and turns the debugger on - -builtins/shopt.def - - new settable option, `extdebug', turns on debugging_mode, as if - --debugger had been supplied at invocation (but does not source - debugger startup file) - -trap.c - - make sure that run_exit_trap arranges for `returns' to come back - there, too, so a `return' executed by an `exit' invoked within a - shell function behaves correctly - -support/shobj-conf - - change darwin/MacOS X stanza based on advice from mac os x developers - -lib/sh/mailstat.c - - set the atime member of the synthesized stat struct to 0 if `cur/' - is empty, rather than leaving it undefined - - 3/24 - ---- -builtins/caller.def - - new builtin to provide a call stack for the debugger - -builtins/evalfile.c - - added a second `flags' argument to source_file() - - new flag value for flags argument to _evalfile(): FEVAL_NOPUSHARGS. - If included in flags arg, it means to not manipulate the BASH_ARGV - and BASH_ARGC arrays - -builtins/common.h - - change prototype for source_file() - -builtins/source.def - - add flag value to call to source_file(): set to 1 if we replaced - the positional parameters - - add call to push_args if additional arguments supplied to the - source builtin - - add call to pop_args in maybe_pop_dollar_vars - -execute_cmd.c - - run the debug trap in execute_function so the debugger can stop - before the first command in a function body is executed - - modify subshell_level before executing a builtin or function in a - subshell - - print `for', `select', `case' command heads when set -x is enabled - -print_cmd.c - - `xtrace_print_word_list' now takes an additional flags argument, - which, if non-zero, says to print indirection_level_string() - - new functions to print for, select, and case command heads when - set -x is enabled - - add spaces after `((' and before `))' in xtrace_print_arith_command - -externs.h - - changed extern declaration for xtrace_print_word_list - - new declarations for xtrace_print_{for,case,select}_command_head() - -subst.c - - modify subshell_level when executing a command substitution - - 3/25 - ---- -execute_cmd.c - - use `line_number' in executing_line_number instead of looking into - the current command if it's a simple command; rearrange code to - make this simpler to compile in and out - - need to save and restore value of currently_executing_command around - calls to debug trap and return trap in execute_function - -make_cmd.c - - make sure make_arith_for_command() disposes the WORD_LIST * it is - passed, since nothing else does and it's not used directly - - 3/28 - ---- -Makefile.in - - fixed dependencies for `error.o' on shell.h and version.h -- makes - parallel makes (gmake -j 4) work correctly - -doc/{bash.1,bashref.texi} - - documented all new features added to support the debugger - - 4/1 - --- -lib/sh/shquote.c - - make sure CTLESC and CTLNUL characters are escaped with CTLESC - by sh_double_quote, sh_backslash_quote and - sh_backslash_quote_for_double_quotes - Fixes vulnerability reported by svdb@stack.nl - -shell.h - - new `pipestatus' member of sh_parser_state_t, to save and restore - $PIPESTATUS - -parse.y - - changes to save_parser_state and restore_parser_state to save and - restore $PIPESTATUS - -builtins/read.def - - add a call to word_list_remove_quoted_nulls before assigning the - word list read from standard input to an array variable. Fixes - bug reported by holzhey@ppprs1.phy.tu-dresden.de - - 4/3 - --- -execute_cmd.c - - in execute_null_command, if redirections are supplied, make sure - things like 3 for possible definitions of intmax_t, uintmax_t - (reported by ro@techfak.uni-bielefeld.de) - - 7/30 - ---- -parse.y - - remove checking for `time' reserved word from special_case_tokens(); - use regular mechanism in CHECK_FOR_RESERVED_WORD. This allows `time' - to be aliased. (Reported by Glenn Morris - ) - - 7/31 - ---- -lib/readline/history.h - - extern declaration for history_write_timestamps - -lib/readline/histfile.c - - don't write timestamps to the history file in history_do_write - unless history_write_timestamps is set to non-zero by the application - (set to 0 by default) - -lib/readline/doc/{hstech.texi,history.3} - - document history_write_timestamps - -variables.[ch] - - new special variable function, HISTTIMEFORMAT; special function - sets history_write_timestamps to 1 if HISTTIMEFORMAT is set - - 8/4 - --- -builtins/history.def - - added support for printing time stamps based on the value of the - HISTTIMEFORMAT variable when displaying history entries - -doc/{bash.1,bashref.texi} - - added description of new HISTTIMEFORMAT variable - - 8/5 - --- -config-top.h - - remove /usr/ucb from any default paths - -mailcheck.c - - make_default_mailpath now returns NULL if DEFAULT_MAIL_DIRECTORY - is not defined - - remember_mail_dates now returns if make_default_mailpath returns - NULL - -config-bot.h - - reorganized the sections; provide an explicit placeholder for - builders to #undef any feature defines they don't want that - configure creates for them, like the default mail path - - 8/9 - --- -config.h.in - - add HAVE_REGEX_H, HAVE_REGCOMP, HAVE_REGEXEC for detection of POSIX.2 - regular expression functions - - add COND_REGEXP define to enable and disable the =~ operator for - matching extended regular expressions in [[...]] commands - -configure.in - - new option, --enable-cond-regexp, enables =~ and code to perform - regular expression matching in [[...]] - -config-bot.h - - undef COND_REGEXP if the OS doesn't provide posix regexp support - -doc/bashref.texi - - documnent new --enable-cond-regexp option to configure - - 8/18 - ---- -support/shobj-conf - - support for shared objects on FreeBSD-gnu (from Robert Millan) - - 8/25 - ---- -lib/sh/shmatch.c - - new file, shell interface to posix extended regular expression - matching - -externs.h - - new extern declarations for functions in shmatch.c - -execute_cmd.c - - incorporate code into execute_cond_node that does extended regular - expression matching for the =~ operator - -parse.y - - add `=~' to the list of binary operators accepted by the conditional - command parser - -doc/{bash.1,bashref.texi} - - documented =~ conditional binary operator and the BASH_REMATCH - variable - - 8/27 - ---- -lib/readline/display.c - - take multibyte characters into account when looking for quoted - substrings on which to do completion (fix from jir@yamato.ibm.com) - -lib/readline/util.c - - fix typo in _rl_strpbrk - -lib/readline/rldefs.h - - use function version of _rl_strpbrk in multibyte locales, because - it understands to skip over special characters in multibyte - character sequences - - 8/28 - ---- -jobs.c - - in wait_for, check for window size changes if a job that exits due - to a signal or is stopped was in the foreground, not just if it's - the current job - - 9/10 - ---- -support/config.{guess,sub} - - add support to recognize FreeBSD running on the amd64 - -subst.c - - if the new `fail_glob_expansion' variable is non-zero, globbing that - fails to match anything causes an expansion error - -builtins/shopt.def - - new `failglob' expansion: if enabled, failed globs cause an error - -test/shopt.right - - take `failglob' into account - -doc/{bash.1,bashref.texi} - - documented new `failglob' option and its effects - - 9/12 - ---- -findcmd.c - - fix file_status to treat the mode bits and uid right -- in particular, - don't assume the `other' bits always apply. Bug reported by - ; fix inspired by - -command.h - - new word flag: W_NOCOMSUB, meaning to not perform command - substitution on a word - -subst.c - - new flag for param_expand: PF_NOCOMSUB. If non-zero, $(...) - command substitutions are not expanded, but returned unchanged - - change expand_word_internal to pass through `` command substitutions - unchanged if (word->flags & W_NOCOMSUB) != 0 - - change expand_word_internal to pass PF_NOCOMSUB to param_expand - if (word->flags & W_NOCOMSUB) != 0 - -builtins/shopt.def - - rename set_interactive_comments to set_shellopts_after_change, which - more accurately reflects its purpose - -syntax.h - - add a define for isblank() in case the system doesn't provide one - -jobs.c - - change raw_job_exit_status to understand `pipefail', using the new - `pipefail_opt' variable - -flags.[ch] - - declare pipefail_opt - - reset pipefail_opt to 0 in reset_shell_flags - -builtins/set.def - - add `set -o pipefail' and document it in help output - -doc/{bash.1,bashref.texi} - - document `set -o pipefail' and the effect of the pipefail option - -mksyntax.c,syntax.h - - sh_syntaxtab is no longer `const' - - new generated variable, sh_syntabsiz, set to number of entries in - sh_syntaxtab, written to generated syntax.c - -locale.c - - new function, locale_setblanks(), sets each member of the current - locale's class to have the CSHBRK flag in sh_syntaxtab - - 9/17 - ---- -arrayfunc.c - - change convert_var_to_array to not set array[0] to a NULL value - (if the scalar variable had no value; e.g., after being created - with `local arrayvar') - -lib/readline/display.c - - save and restore the value of prompt_invis_chars_first_line in - rl_{save,restore}_prompt, and reinitialize it to 0 before printing - something in the message area - -lib/readline/bind.c - - new functions: rl_bind_keyseq_if_unbound_in_map(ks, func, kmap); - binds key sequence KS to function FUNC in keymap KMAP, and - rl_bind_keyseq_if_unbound (ks, func); binds key sequence KS to - function FUNC in the current keymap - -lib/readline/readline.h - - extern function declarations for rl_bind_keyseq_if_unbound_in_map and - rl_bind_keyseq_if_unbound - -lib/readline/{readline,terminal}.c - - _rl_bind_if_unbound -> rl_bind_keyseq_if_unbound - -lib/readline/{bind.c,rlprivate.h} - - remove _rl_bind_if_unbound - - 9/18 - ---- -lib/readline/doc/rltech.texi - - document rl_bind_keyseq_if_unbound and - rl_bind_keyseq_if_unbound_in_map - - 9/19 - ---- -lib/readline/bind.c - - new functions rl_bind_key_if_unbound_in_map and - rl_bind_key_if_unbound; analogous to (and implemented in terms of) - keyseq functions - - rl_bind_keyseq_in_map: a new function, equivalent to rl_set_key - (which remains for backwards compatibility); changed callers to - use it - - new function, rl_bind_keyseq, equivalent to rl_bind_keyseq_in_map - with a third argument of _rl_keymap - -lib/readline/readline.h - - extern declarations for rl_bind_key_if_unbound_in_map and - rl_bind_key_if_unbound - - extern declarations for rl_bind_keyseq_in_map and rl_bind_keyseq - -lib/readline/doc/rltech.texi - - document rl_bind_keyseq and rl_bind_keyseq_in_map - -configure.in - - require at least readline-5.0 - -config-bot.h - - define SYS_SIGLIST_DECLARED if it's not defined, but - HAVE_DECL_SYS_SIGLIST is, to deal with differences between - autoconf versions - -bashline.c - - use rl_bind_key_if_unbound_in_map when binding bash keybindings in - initialize_readline(), so inputrc files can override them - - 9/22 - ---- -lib/readline/histsearch.c - - do better bounds checking for history_offset and history_length in - history_search_internal - -builtins/history.def - - in delete_last_history(), make sure we don't leave the history - offset longer than the history length after calling delete_histent - - 9/23 - ---- -jobs.c - - small change to notify_of_job_status so job status messages get - printed even if the shell was started to run `-c command'. The - old behavior was intentional, but I cannot remember why, so we'll - try it the other way for a while (debian bash bug #211693) - - 9/24 - ---- -jobs.c - - slightly modify change from 9/23 so that jobs started to run - command substitutions don't print job status messages - - 9/25 - ---- -lib/readline/search.c - - when reading a non-incremental search string from the terminal, - use a separate undo list rather than chaining it to the undo list - from the rest of the line, since the whole undo list will get - freed when the search string is complete - -lib/readline/readline.h - - changed the defines guarding the stdarg prototype for rl_message to - match what's actually used in display.c, where it's defined - - 9/26 - ---- -[bash-3.0-alpha released] - - 9/29 - ---- -lib/sh/shmatch.c - - fix to build correctly when arrays are not compiled into the shell - -subst.c - - fix command substitution to run any exit trap defined in the - command substitution before returning; the exit trap is not inherited - from the calling shell - -lib/readline/shell.c - - change sh_set_lines_and_columns to free the memory allocated and - passed to setenv(), since setenv is specified by POSIX to allocate - new memory and copy its arguments - -jobs.c - - change logic in make_child so that every child process attempts to - set the terminal's process group to the pipeline's process group - when PGRP_PIPE is defined, just like when it's undefined. This is - reported to fix some tricky synchronization problems on Red Hat - Enterprise Linux 3. Fix from Ernie Petrides . - - 9/30 - ---- -builtins/printf.def - - tescape no longer needs a `trans_squote' argument, since it's the - same as the `sawc' argument. The `sawc' argument now means to do - the %b argument processing if non-null - - fix processing of octal constants for %b arguments (\0 followed by - up to three octal digits) and other escape sequences (\ followed by - up to three octal digits) - - hex constants `\xHHH' are now allowed to contain any positive - number of digits; previously they were restricted to two [removed] - - allow two new escape sequences: \" and \?, for compatibility with - ksh93 and ANSI C - -doc/{bash.1,bashref.texi} - - documented processing that printf performs for arguments to %b - escape sequences - -lib/sh/strtrans.c - - add \" and \? to escape sequences recognized by `echo -e' - - 10/1 - ---- -version.c - - use snprintf instead of sprintf if configure tells us we have it - - 10/3 - ---- -subst.c - - in list_remove_pattern, take into account the fact that one of the - list elements may be NULL, and don't free the result of - remove_pattern() without checking - - in remove_pattern, return savestring(param) if *param == '\0', - since callers expect to free() non-null return values - - 10/4 - ---- -subst.c - - change verify_substring_values to make it clearer that the first - offset deals with array indices and the second deals with numbers - of elements, when doing array subranges with ${a[@]:e1:e2} - -array.c - - change array_subrange to make it explicit that the second offset - argument is a count of the desired number of elements, not an - ending index. This deals with sparse arrays correctly. - - 10/6 - ---- -variables.c - - fix memory leak in assign_in_env - - 10/8 - ---- -subst.c - - in parameter_brace_expand, check that the last characters are `]}' - before checking for ${!array[@]} - -execute_cmd.c,builtins/source.def - - push and pop the args (BASH_ARGV and BASH_ARGC) when executing a - shell function or sourcing a script only when in debugging mode - - 10/11 - ----- -arrayfunc.c - - make sure array_variable_name returns values for the SUBP and LENP - arguments if they're non-null, since callers expect to use them - even if the array subscript is bad - -error.c - - call exit_shell instead of sh_exit from parser_error and - report_error so the right things happen (running exit trap, doing - the right interactive cleanup, etc.) - -lib/readline/complete.c - - new variable, rl_completion_quote_character, set to any quote char - readline thinks it finds before any application completion - function is called - - new variable, rl_completion_suppress_quote, settable by an - application-specific completion function. If set to non-zero, the - completion code does not append a closing quote in append_to_match - -lib/readline/readline.h - - extern declarations for rl_completion_quote_character and - rl_completion_suppress_quote - -bashline.c - - set rl_completion_suppress_quote in command_subst_completion_function - because that would be inserted before any closing "`" or ")", which - is somewhat disconcerting - -lib/readline/doc/rltech.texi - - documented rl_completion_suppress_quote and - rl_completion_quote_character - - 10/13 - ----- -bashhist.c - - use sv_histchars instead of setting history_comment_char directly in - bash_initialize_history so assignments to $histchars made in - ~/.bashrc are honored - - 10/21 - ----- -trap.c - - make sure run_exit_trap sets `running_trap' appropriately - - new variable, trap_saved_exit_value, set to last_command_exit_value - before running any trap commands; available to the rest of the - shell; use trap_saved_exit_value to replace some function-local - variables - -builtins/exit.def - - if the shell is running the exit trap, and no argument is given - to `exit', use trap_saved_exit_value as the exit status instead - of the last command exit value (which could be the previous command - run in the exit trap), as required by POSIX.2 - - 10/25 - ----- -doc/{bash.1,bashref.texi} - - add `alias' to the list of documented `assignment statement' builtins - - 11/1 - ---- -doc/bash.1 - - remove the `.' from the sample $PATH value - -parse.y - - make sure parse_compound_assignment prompts with $PS2 if it reads - a newline while parsing the compound assignment statement. Bug - reported by Stephane Chazelas - - parse_string_to_word_list now takes a new second argument: `int flags' - - new parser state flag: PST_COMPASSIGN; indicates that the shell is - parsing a compound assignment statement - - parse_string_to_word_list turns on PST_COMPASSIGN if `flags' arg - has low bit set - - turn PST_COMPASSIGN on and off in parse_compound_assignment - -externs.h - - change prototype declaration for parse_string_to_word_list - -arrayfunc.c - - change call to parse_string_to_word_list to add new flags arg - -general.c - - assignment() takes a new `flags' second argument - - if `flags' is non-zero, accept `[' as a legal assignment statement - starter character (for parsing compound array assignments) - -general.h - - add new argument to prototype declaration for assignment() - -parse.y,{subst,variables}.c, builtins/{setattr,declare}.def - - change calls to assignment() (parse.y calls with flags == 1 when - parser_state inlcudes PST_COMPASSIGN) - -arrayfunc.c - - in assign_array_var_from_string(), don't treat an expanded word - of the form [ind]=value specially unless the W_ASSIGNMENT flag is - set. This means that words that are the result of expansions but - happen to have the same format as compound assignment statement - words will not be treated as such. For instance - - v='[12]=foobar' - a=( $v ) - - will result in a[0]='[12]=foobar' instead of a[12]=foobar. This - is closer to how `regular' assignment statements are treated and - compatible with ksh93. Bug reported by Stephane Chazelas - -shell.c - - new --protected argument, disables command substitution when used - with --wordexp (like --wordexp, it remains undocumented) - - change run_wordexp to turn on the W_NOCOMSUB flag in each word - to be expanded if protected_mode is set - - 11/7 - ---- -doc/{bash.1,bashref.texi} - - clarified the language concerning inherited signal dispositions and - when traps are run - -support/shobj-conf - - slight changes to the darwin (Mac OS X) stanza for MacOS X 10.3 - (for the readline shared library builds, which shares this script) - -lib/readline/histexpand.c - - change to make `^' behave as equivalent to word one, as csh does, - and as the documentation states - -lib/readline/display.c - - in update_line, make sure to use col_lendiff in all calculations - where the cursor position is concerned (like when calculating - the value of _rl_last_c_pos). Fixes bug reported by Andreas - Schwab - - 11/12 - ----- -trap.c - - make _run_trap_internal catch `return' builtin longjmps and clean - up before longjmping on to where the return was intended to go - (fixes bug with not turning off SIG_INPROGRESS flag when `return' - executed in trap command) - - 11/18 - ----- -builtins/cd.def - - in posix mode, set errno to ENOTDIR if canonicalization fails, - unless the canonicalization functions leave it set to ENOENT - - 11/25 - ----- -make_cmd.c - - in make_simple_command, don't blindly dereference element.redirect - -parse.y - - the list_terminator production now has an `int' value so it can be - used in other grammar productions - - add a rule that makes `time' on a line by itself time a null - command (this is iffy) - - 11/28 - ----- -subst.c - - change the pattern substitution code (${var//pat/rep}) to use the - same pattern expansion function (getpattern()) as the pattern - removal expansions. This has the effect of no longer performing - quote removal on the pattern before trying to match it. This - fixes an incompatibility with ksh93 reported on comp.unix.shell - -nojobs.c - - add replacement function for siginterrupt on the off chance that a - system has posix signals but lacks siginterrrupt - -lib/readline/display.c - - fix from Tim Waugh at Red Hat to speed up inserting characters into - long lines in a UTF-8 environment by optimizing the calculation of - the first difference between old and new lines by checking to see - whether the old line is a subset of the new - - 11/29 - ----- -lib/malloc/stats.c - - break code that opens file (and interprets %p) into separate function - _imalloc_fopen(char *s, char *fn, char *def, char *defbuf, size_t defsiz) - for use by rest of library - - default stats file is now `stats.PID' - -lib/malloc/trace.c - - new function, malloc_set_tracefn (char *s, char *fn), sets tracing - to the file named by FN (with %p interpolated as the pid), using - some default if FN is NULL - -lib/malloc/shmalloc.h - - new extern declaration for malloc_set_tracefn - - 12/4 - ---- -execute_cmd.c - - combined several common strings from do_piping() into one - dup_error() function - -builtins/common.[ch] - - new function, `sh_notbuiltin(s)' prints error message about s not - being a shell builtin - -builtins/{builtin,enable}.def - - call sh_notbuiltin instead of using literal string - -{arrayfunc,expr,error}.c - - use one string variable for `bad array subscript' error message; use - in calls to various error reporting functions - -Makefile.in - - add variables for localedir and the PACKAGE_* variables, auto-set - by configure - -configure.in - - un-cache values for gettext, textdomain, and bindtextdomain if they're - not in libc but in libintl so the right variables get set - -bashintl.h - - add necessary defines for marking strings to be translated using - gettext - -locale.c - - set textdomain and directory in set_default_locale - - don't call textdomain with the value of $TEXTDOMAIN, since we don't - want to override the default domain ("bash") - - don't call bindtextdomain unless default_domain already has a value - - when translating $"..." strings, use dgettext with the script's - default domain (value of $TEXTDOMAIN) - - 12/9 - ---- -builtins/mkbuiltins.c - - include "bashintl.h" in the generated "builtins.c" - -support/{config.rpath,mkinstalldirs} - - new files to support gettext i18n - -ABOUT-NLS - - new readme file for gettext internationalization - -po/{Makefile.in.in,Rules-quot,boldquot.sed,en@boldquot.header,en@quot.header,insert-header.sin,quot.sed,remove-potcdate.sin} -po/{POTFILES.in,bash.pot} - - new files for gettext - -lib/intl - - new directory, with libintl stuff from gettext - -aclocal.m4 - - add m4 files from gettext distribution needed by libintl - -configure.in - - create po/Makefile.in and lib/intl/Makefile in AC_OUTPUT - - add call to AM_GNU_GETTEXT to initialize gettext stuff - -Makefile.in - - use mkinstalldirs instead of mkdirs in the `installdirs' target - - changes for intl/ and po/ subdirectories in build and install - - changes to have libintl linked in, as determined by configure - - changes to have libintl built, just in case it's used (though I'd - rather not) - - 12/10 - ----- -config.h.in - - additional #defines required by the libintl library - - add ENABLE_NLS define for AM_GNU_GETTEXT - - take out defines for HAVE_{BINDTEXTDOMAIN,GETTEXT,TEXTDOMAIN} - -configure.in - - removed old tests for libintl and gettext/textdomain/bindtextdomain - -locale.c - - remove HAVE_GETTEXT code; we have gettext unconditionally now - -bashintl.h - - change to include "gettext.h" and remove the conditional code based - on whether or not gettext is present - - 12/16 - ----- -lib/readline/vi_mode.c - - fix problem with rl_vi_eWord that caused it to skip over the last - character of a word if invoked while point was on the next-to-last - character - - 12/18 - ----- -{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c -{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c -{subst,test,trap,variables,version,xmalloc}.c -parse.y -builtins/{common,evalfile,getopt}.c -builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def -builtins/{hash,help,history,jobs,kill,printf,pushd,read,return,set,setattr}.def -builtins/{shift,shopt,source,suspend,type,ulimit,umask}.def -lib/sh/{fmtulong,netopen}.c - - include "bashintl.h" for gettext defines - -Makefile.in - - add `-DBUILDTOOL' to CFLAGS for buildversion.o - -bashintl.h - - if `BUILDTOOL' is defined, define ENABLE_NLS to 0 so we don't have - to compile and link in the gettext stuff - -Makefile.in,lib/sh/Makefile.in,builtins/Makefile.in - - update dependencies on bashintl.h and include/gettext.h - - 12/19 - ----- -{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c -{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c -{subst,test,trap,variables,version,xmalloc}.c -builtins/{common,evalfile,getopt}.c -builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def -builtins/{hash,help,history,jobs,kill,let,printf,pushd,read,return,set}.def -builtins/{setattr,shift,shopt,source,suspend,type,ulimit,umask}.def -lib/sh/{fmtulong,netopen}.c -lib/malloc/{malloc,stats,table,watch}.c - - mark up strings in source files for gettext processing - -lib/malloc/imalloc.h - - include "bashintl.h" if SHELL is defined, otherwise make _(x) an - identity define - -lib/malloc/Makefile.in - - add dependencies on ${topdir}/bashintl.h and ${BASHINCDIR}/gettext.h - - 12/21 - ----- -bashline.c - - make sure we index into rl_line_buffer with indexes > 0 in - attempt_shell_completion - - 12/31 - ----- -Makefile.in - - descend into `po' and run make recursively for the various clean - targets - - 1/4 - --- -include/shmbutil.h - - two new macros: BACKUP_CHAR(str, strsize, i), which backs up one - multibyte character in STR starting at index I, and - BACKUP_CHAR_P(str, strsize, p), which backs up one multibyte - character in STR starting at P, which is a char * - - 1/6 - --- -pcomplete.c - - in pcomp_filename_completion_function, use the quote character - readline found (and assigned to rl_complete_quote_character) when - dequoting the filename by a completion call from readline (when - rl_dispatching != 0) - -bashline.c - - ditto for bash_directory_completion_matches - - 1/7 - --- -lib/readline/complete.c - - new variable, rl_completion_found_quote, set to non-zero value if - readline finds what it thinks is quoting in the word to be completed - -lib/readline/readline.h - - extern declaration for rl_completion_found_quote - - 1/8 - --- -lib/readline/doc/rltech.texi - - documented rl_completion_found_quote - -lib/readline/complete.c - - in compute_lcd_of_matches, if it looks like what the user typed was - dequoted before generating filename matches, dequote the user's - text again before figuring out the case-insensitive lcd - - 1/9 - --- -lib/readline/display.c - - fix from Edward Catmur to logic that handles - invisible characters in prompt string. Original code was wrong - about local_prompt_prefix; it gave incorrect results when prompt - contained invisible characters after a line break - - 1/10 - ---- -subst.c - - new function, mb_substring(), does character (possibly multibyte) - oriented rather than strictly byte-oriented substring extraction. - The passed indices, rather than strictly indexing into the string, - indicate character positions that need to be calculated. From - Tim Waugh - - change parameter_brace_substring to use mb_substring if necessary - -included/shmbutil.h - - new define SADD_MBQCHAR_BODY, common code for adding a quoted - (preceded by CTLESC) multibyte character to an accumulating string - in the subst.c expansion code - -subst.c - - use SADD_MBQCHAR_BODY in expand_word_internal - - new static function, mb_getcharlens, allocates and returns an array - of character lengths for (possibly multibyte) characters in the - argument string - - change pattern matching operations to use while loops instead of - for loops to handle multibyte characters better (no more simple - increment or decrement) - - change pattern matching operations to use multibyte character - operations instead of simple increments and decrements. Don't - use BACKUP_CHAR_P -- use the mblen array instead, because that - avoids the N**2 behavior of having to count from the beginning - of the string each time you want to back up one character. Changes - to remove_pattern and match_pattern - - 1/12 - ---- -lib/readline/display.c - - make expand_prompt count multbyte characters in the prompt string - by using _rl_find_next_mbchar (and copying possibly more than one - byte) instead of a simple increment and single byte copy - - 1/13 - ---- -lib/readline/display.c - - expand_prompt takes a new reference argument -- it returns - the actual count of (possibly multibyte) characters displayed - on the screen - - don't short-circuit in expand_prompt unless we're not going to - be using any multibyte characters - - change calls to expand_prompt to pass an argument for the - number of physical characters the prompt occupies - (prompt_physical_chars) - - initialize `lpos' (the physical cursor position) from - prompt_physical_chars in rl_redisplay - -lib/readline/mbutil.c - - in _rl_find_prev_mbchar_internal, if mbrtowc returns -1 or -2, and - we assume that the character is a single-byte char, make sure we - update `prev' so it doesn't get lost. Fixes problems encountered - when a non-ascii char is the last char on the line and we're moving - back past it with ^B, and other display problems caused by the same - situation - - 1/15 - ---- -lib/readline/doc/rltech.texi - - document RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE in the - description of rl_expand_prompt() - - 1/20 - ---- -bashline.c - - in initialize_readline, make sure M-C-j and M-C-m are still bound to - vi-editing-mode before unbinding them -- they may have been rebound - in an inputrc - -variables.c - - in unbind_variable, unset attributes other than `local' and exported - (if the variable came from a temporary environment) when unsetting a - local variable inside a function - - 1/21 - ---- -configure.in - - add libintl build directory to the list of include directories if - it's being built (using INTL_BUILDDIR) - -Makefile.in,{builtins,lib/{sh,malloc}}/Makefile.in - - substitute LIBBUILD as ${BUILD_DIR}/${LIBSUBDIR} - - define INTL_BUILDDIR as ${LIBBUILD}/intl - -{builtins,lib/sh}/Makefile.in - - make sure INTL_INC is added to the list of include directories - - make sure INTL_LIBSRC is defined with the correct value - -{configure,Makefile,{builtins,lib/sh}/Makefile}.in - - substitute LIBINTL_H as ${INTL_BUILDDIR}/libintl.h - -Makefile.in,builtins/Makefile.iin - - all files depending on bashintl.h also depend on ${LIBINTL_H} - (which may be empty) - -Makefile.in - - make a rule telling how to build lib/intl/libintl.h if necessary - - 1/24 - ---- -builtins/read.def - - make sure that the array name supplied as an argument to -a is a - valid identifier - -parse.y - - make the \W expansion abbreviate $HOME with a ~ (seems to be more - useful) - -doc/{bash.1,bashref.texi} - - document new behavior of \W - -subst.c - - make sure parameter_brace_expand_rhs uses the first character of - $IFS when making the string to return from the expanded word - (which, in the case of "$@" or $@, contains multiple words that - need to be separated) - - 1/25 - ---- -builtins/common.c - - change get_job_spec to make `%' by itself or an empty argument - return NO_JOB - -jobs.h - - new possible value for a job spec return value: BAD_JOBSPEC - (for syntactically invalid specs, like the empty string) - -shell.c - - in open_shell_script, check to see whether or not we can find and - open the filename argument before setting dollar_vars[0] or - manipulating BASH_SOURCE, so the error messages come out better - -subst.c - - in string_list_internal, short-circuit right away to savestring() - if the list only has a single element - - 1/28 - ---- -lib/readline/rltypedefs.h - - new set of typedefs for functions returning char * with various - arguments (standard set) - -lib/readline/complete.c - - new function pointer, rl_completion_word_break_hook, called by - _rl_find_completion_word, used to set word break characters at - completion time, allowing them to be position-based - -lib/readline/doc/rltech.texi - - documented rl_completion_word_break_hook - -lib/readline/kill.c - - added new rl_unix_filename_rubout, which deletes one filename - component in a Unix pathname backward (delimiters are whitespace - and `/') - -lib/readline/readline.h - - extern declaration for rl_unix_filename_rubout - -lib/readline/funmap.c - - new bindable readline command `unix-filename-rubout' - -lib/readline/doc/{readline.3,rluser.texi},doc/bash.1 - - documented `unix-filename-rubout' - - 1/29 - ---- -lib/readline/histexpand.c - - change history_tokenize_internal to handle non-whitespace delimiter - characters by creating separate fields (like the shell does when - splitting on $IFS) - - 1/30 - ---- -lib/glob/xmbsrtowcs.c - - new function, xdupmbstowcs, for convenience: calls xmbsrtowcs - while allocating memory for the new wide character string - - some small efficiency improvments to xmbsrtowcs - -include/shmbutil.h - - extern declaration for xdupmbstowcs - -lib/glob/strmatch.h - - include config.h for definition of HANDLE_MULTIBYTE - - remove the HAVE_LIBC_FNM_EXTMATCH tests - - new extern declaration for wcsmatch(whchar_t *, wchar_t *, int) - -configure.in - - remove call to BASH_FUNC_FNMATCH_EXTMATCH; it's no longer used - -lib/glob/smatch.c - - simplify xstrmatch() by using xdupmbstowcs() instead of inline code - -lib/glob/glob.c - - modify mbskipname() to avoid the use of alloca - - simplify mbskipname() by using xdupmbstowcs() instead of inline code - - simplify glob_pattern_p() by using xdupmbstowcs() instead of - inline code - - fix memory leak in wdequote_pathname - - simplify wdequote_pathname() by using xdupmbstowcs() instead of - inline code - -lib/glob/strmatch.c - - new function, wcsmatch(), `exported' wide-character equivalent of - strmatch() - -subst.c - - old match_pattern is now match_upattern - - match_pattern now either calls match_upattern or converts - mbstrings to wide chars and calls match_wpattern - - match_upattern reverted to old non-multibyte code - - new function: match_pattern_wchar, wide character version of - match_pattern_char - - 2/1 - --- -subst.c - - old remove_pattern is now remove_upattern - - remove_upattern reverted to old non-multibyte code (pre-Waugh patch) - - new multibyte version of remove_pattern: remove_wpattern - - remove_pattern now calls either remove_upattern or converts a - multibyte string to a wide character string and calls - remove_wpattern - - new function, wcsdup, wide-character version of strdup(3) - - 2/4 - --- -print_cmd.c - - temporarily translate a >&filename redirection from - r_duplicating_output_word to r_err_and_out (as the expansion code - in redir.c does) so it prints without a leading `1' (file - descriptor) - - 2/5 - --- -aclocal.m4 - - add a check for wcsdup to BASH_CHECK_MULTIBYTE - -config.h.in - - add HAVE_WCSDUP define - - 2/9 - --- -builtins/shift.def - - fix a call to sh_erange that possibly dereferences a NULL pointer - - 2/12 - ---- -general.c - - start at a general set of file property checking functions: - file_isdir(), file_iswdir() (is writable directory) - -general.h - - extern declarations for new functions - -lib/sh/tmpfile.c - - use file_iswdir() to make sure the temporary directory used for - here documents and other temp files is writable in get_sys_tmpdir() - - 2/17 - ---- -bashline.c - - fix conditional binding of emacs-mode M-~ -- there is a default - binding for it (rl_tilde_expand), so a straight call to - rl_bind_key_if_unbound_in_map doesn't do the right thing - - 2/27 - ---- -[bash-3.0-beta1 released] - - 2/29 - ---- -subst.c - - fixed expansion so referencing $a, when a is an array variable - without an element assigned to index 0, exits the shell when - `-u' is enabled - -expr.c - - make the exponentiation operator (**) associative, so things like - 2**3**4 work right (change `if' to `while') - - 3/3 - --- -lib/sh/strftime.c - - SCO Unix 3.2, like Solaris, requires that the system's `timezone' - variable be declared as long - -lib/readline/{bind,histfile,input,parens}.c - - changes for Tandem (including `floss.h' (?)) - - 3/4 - --- -subst.c - - change param_expand to quote the entire expanded string instead - of just the escape characters if the expansion appears between - double quotes or in a here-document (for simple variable expansions - or expansions of positional parameters) - - 3/8 - --- -subst.c - - analogous changes to parameter_brace_expand_word to fix the same - quoting problem as on 3/4; fix callers to understand that the - value returned might be quoted now and should be dequoted if - necessary - - add a `quoted' argument to get_var_and_type, change callers - - change today's fix and fix from 3/4 to not call quote_string if the - value is "" (because quote_string turns that into CTLNUL\0) - - 3/9 - --- -builtins/cd.def - - resetpwd() now takes a `caller' argument so it can be used by pwd - as well as cd - - change pwd_builtin to call resetpwd() if sh_physpath() fails to - return a valid pathname - - 3/14 - ---- -expr.c - - reworked exp0 and readtok() to make post-increment and post-decrement - into real tokens, which may be separated from their accompanying - variables by whitesapce - - made analogous changes to readtok() to make pre-increment and - pre-decrement work when separated from their accompanying identifier - by whitespace - - 3/18 - ---- -lib/readline/misc.c - - in rl_maybe_unsave_line, don't force rl_replace_line to clear - the undo_list, since it might point directly at an undo list - from a history entry (to which we have no handle) - - 3/19 - ---- -lib/readline/display.c - - rl_save_prompt and rl_restore_prompt now save and restore the value - of prompt_physical_chars - - set prompt_physical_chars in rl_redisplay when expand_prompt has - not been called (e.g., when rl_display_prompt is set and is not - equal to rl_prompt, like when searching) - -lib/readline/histexpand.c - - don't call add_history in history_expand if the `:p' modifier is - supplied; leave that to the calling application. This means that - `history -p', for example, will not add anything to the history - list (as documented), nor will history expansions invoked by - emacs-mode M-C-e line editing - -config-bot.h - - check whether HAVE_DECL_SYS_SIGLIST is defined to 1 rather than just - defined, to work around newer versions of autoconf defining it to 0 - -config.h.in - - change default status of HAVE_MALLOC to #undef instead of #define - -bashhist.c - - extern declarations for rl_done and rl_dispatching - - don't call re_edit from pre_process_line unless rl_dispatcing is zero, - so we don't call it from something like shell-expand-line - - change pre_process_line to add an expanded history specification - that returned `print only' to the history list, since history_expand - no longer does it (and, when using readline, do it only when - rl_dispatching is zero) - - 3/22 - ---- -config.h.in,aclocal.m4 - - change bash-specific functions that look in struct dirent to define - HAVE_STRUCT_DIRENT_xxx, like AC_CHECK_MEMBERS does (though the - functions are otherwise the same) - - new function, BASH_STRUCT_DIRENT_D_NAMLEN, define - HAVE_STRUCT_DIRENT_D_NAMLEN if struct dirent has a `d_namlen' member - -configure.in - - call BASH_STRUCT_DIRENT_D_NAMLEN - -include/posixdir.h - - use new and renamed HAVE_STRUCT_DIRENT_D_xxx defines - - 4/7 - --- -builtins/cd.def - - ensure that we print out a non-null pathname after getting a - directory from CDPATH and canonicalizing it (e.g., if the result - exceeds PATH_MAX in length and the_current_working_directory is - set to NULL) - - 4/12 - ---- -print_cmd.c - - new function to print out assignment statements when `set -x' has - been enabled: xtrace_print_assignment - -externs.h - - extern declaration for xtrace_print_assignment - - 4/13 - ---- -{subst,variables}.c - - call xtrace_print_assignment instead of using inline code - -jobs.c - - if turning on job control when it was previously off, set - pipeline_pgrp to 0 in set_job_control so make_child puts - subsequent children in their own process group - - 4/14 - ---- -general.c - - new function, legal_alias_name, called to decide whether an - argument to add_alias is a valid alias name -- essentially any - character except one which must be quoted to the shell parser - and `/' - -general.h - - new extern declaration for legal_alias_name - -builtins/alias.def - - `unalias' now returns failure status if no NAME arguments are - supplied and -a is not given - - call legal_alias_name to make sure alias name is valid before - calling add_alias from alias_builtin - - 4/19 - ---- -include/shmbutil.h - - include for definition of HANDLE_MULTIBYTE rather than - duplicating logic - - 4/20 - ---- - -doc/{bash.1,bashref.texi} - - make sure $0 is consistently referred to as a `special parameter' - - document which characters are now not allowed in alias names - - 4/23 - ---- - -builtins/{jobs,kill,wait}.def - - removed requirement that job control be enabled to use job control - notation, as SUSv3 implies - -subst.c - - based on a message from David Korn, change param_expand to not call - string_list_dollar_star if the only quoting is Q_HERE_DOCUMENT -- - quoted here documents are like double quoting, but not exactly - - analogous changes to list_remove_pattern and pos_params - - 4/24 - ---- -lib/readline/doc/rluser.texi - - fix error in description of emacs-mode C-xC-e command (uses $VISUAL - instead of $FCEDIT) - - 4/28 - ---- -support/bashbug.sh - - integrate a patch from Stefan Nordhausen - that reduces race conditions - by using a temporary directory inside $TMPDIR and creating the - temp files in that - - 4/30 - ---- -builtins/common.c - - use pathconf(".", _PC_PATH_MAX) where available to size the argument - to getcwd() rather than using a straight PATH_MAX - -builtins/cd.def - - if get_working_directory fails and returns null (causing resetpwd - to return NULL), use set_working_directory to set $PWD to the - absolute pathname for which chdir just succeeded - - 5/1 - --- -lib/readline/vi_mode.c - - in rl_vi_change_to, call _rl_vi_set_last with rl_numeric_arg instead - of `last', since they're equal at call time and rl_vi_domove can - change rl_numeric_arg (which vi apparently updates). Fixes redo bug - of `c2....' reported by Marion Berryman - - 5/4 - --- -parse.y - - fix decode_prompt_string to properly deal with strftime() returning 0 - - 5/6 - --- -variables.c - - in make_local_array_variable, return an already-existing local array - variable immediately rather than creating a new array (causing a - memory leak) - - 5/8 - --- -lib/readline/vi_mode.c - - change rl_vi_domove to set rl_explicit_arg before calling - rl_digit_loop1 so that multi-digit numeric arguments work right - - _rl_vi_last_command is no longer static - -lib/readline/rlprivate.h - - new extern declaration for _rl_vi_last_command - -lib/readline/text.c - - change rl_newline to only call _rl_vi_reset_last if the last command - (_rl_vi_last_command) is not a text modification command. This lets - the last-command and last-argument work across command lines - - 5/13 - ---- -builtins/common.c - - use getcwd(0,0) rather than providing a fixed pathname with a fixed - length (PATH_MAX) so getcwd() will allocate sufficient memory - -aclocal.m4 - - change BASH_FUNC_GETCWD to check whether or not getcwd(0,0) will - allocate memory for the returned value -- nobody implements that - and getcwd-via-popen, so it should capture the old test as well - - 5/27 - ---- - -builtins/trap.def - - the historical behavior of assuming that a signal's handling should - be set to its original disposition is only in effect if a single - argument is given, otherwise the first argument is assumed to be a - command to execute - - when in posix mode, if trap gets a single argument, display an - error message and return EX_USAGE - - change the help message and usage string to better explain trap's - behavior - -doc/{bash.1,bashref.texi} - - describe the new default behavior when the first argument is a - signal spec - - note that signal names are case insensitive and the SIG prefix is - optional in arguments to `trap' - - note that signal name arguments to `kill' are case-insensitive - -lib/readline/display.c - - make sure rl_on_new_line_with_prompt sets rl_display_prompt to - rl_prompt (just to make sure it's set) - - have rl_on_new_line_with_prompt use local_prompt if it's set - - 6/2 - --- -subst.c - - in string_extract_double_quoted, cope with extract_delimited_string - returning NULL, as it can when attempting completion on an unclosed - command substitution - - 6/24 - ---- -lib/readline/complete.c - - change print_filename to add a `/' to listed directory names if - `mark-directories' has been enabled - -builtins/umask.def - - make sure that the mask passed to parse_symbolic_mode has all but - the operative low eight bits masked off, to avoid complementing - all 0s to -1, which is the error return code. This makes things - like `a=rwx' and `ugo=rwx' work and turn off the umask - - 6/26 - ---- -builtins/getopts.def - - when `getopts' reaches the end of options, unset OPTARG before - returning EOF. In response to a bug report from Apple - -configure.in - - when cross-compiling, don't set CPPFLAGS_FOR_BUILD and - LDFLAGS_FOR_BUILD from CPPFLAGS and LDFLAGS, respectively, since - those are for the target instead of the build platform (report - from robert@schwebel.de) - -shell.c - - a shell whose standard error (but not standard output) is directed - to a terminal should be interactive, according to POSIX/SUS. This - means that sh > sh.out will start an interactive shell. Bug report - from llattanzi@apple.com - -doc/{bash.1,bashref.texi} - - change mention of standard output to standard error in definition - of interactive shell - -lib/readline/vi_mode.c - - new convenience function, rl_vi_start_inserting, calls - _rl_vi_set_last to save the last textmod command state and then calls - rl_vi_insertion_mode to enter insert mode - - change functions to use rl_vi_start_inserting - -lib/readline/readline.h - - extern declaration for rl_vi_start_inserting - -bashline.c - - new function for vi-mode completion, bash_vi_complete. Does - filename expansion as POSIX specifies, unlike the default readline - bindings (which don't know about globbing). Bound to `\', `*', - and `=' in vi command keymap. Internals very similar to - rl_vi_complete; just calls bash glob expansion functions - -lib/readline/vi_mode.c - - change rl_vi_change_char so that an entire change is a single - undoable event, rather than each individual change in a [count]r - command - - fix rl_vi_change_char so that replacing characters up to EOL works - rather than generating rl_ding - - fix rl_vi_change_case so that replacing characters up to EOL works - rather than generating rl_ding - - 6/28 - ---- -builtins/echo.def - - call clearerr(stdout) before writing anything and testing its - failure or success - - 6/29 - ---- -bashline.c - - only set rl_explicit_arg in bash_glob_complete_word if readline is - in emacs mode; let bash_vi_complete take care of setting it in vi - mode - - fix bash_vi_complete to only set rl_explicit_arg unless the posix - conditions are met: no globbing characters in the vi `bigword' - being completed - - 6/30 - ---- -[bash-3.0-rc1 released] - - 7/1 - --- -lib/readline/complete.c - - make sure `extension_char' is initialized before deciding whether - or not the append a `/' to a possible completion when visible-stats - is not enabled - - 7/2 - --- -subst.c - - fix a boundary overrun in string_extract_double_quoted that could - occur when the word completion code attempts to expand an incomplete - construct (like a quoted unclosed command substitution) - - 7/4 - --- -subst.c - - set tempenv_assign_error to non-zero if an assignment to the - temporary environment fails for some reason (e.g., attempted - assignment to a readonly variable) - -execute_cmd.c - - fix execute_simple_command to force a non-interactive shell in - POSIX mode to exit if an assignment to the temporary environment - preceding a special builtin fails (bug report from - llattanzi@apple.com) - - 7/5 - --- -bashline.c - - in bash_directory_completion_hook, don't perform word expansions - if the filename appears to have been completed from the file - system rather than typed in by the user. Bug reported by Tim - Waugh - - 7/7 - --- -lib/readline/misc.c - - if _rl_maybe_save_line is being asked to save a line other than - what's already saved, free up the current saved line and save the - current contents of rl_line_buffer. Bug reported by - llattanzi@apple.com - - 7/12 - ---- -lib/readline/input.c - - do better EOF detection in rl_gather_tyi -- if a read returns 0 when - the fd is in non-blocking mode, stuff an EOF into the input stream - (reported by mattias@virtutech.se) - - 7/13 - ---- -lib/readline/vi_mode.c - - make sure rl_vi_put honors `count' arguments and yanks things - multiple times if requested - - 7/16 - ---- -builtins/umask.def - - make sure that the `who' part of the umask symbolic mode argument - defaults to `a' if it's missing - -flags.c - - make sure that maybe_make_restricted only gets called after the - shell is initialized, so `bash -r' doesn't result in inappropriate - error messages - -[bash-3.0 frozen] diff --git a/CWRU/changelog b/CWRU/changelog new file mode 120000 index 00000000..d2d81b30 --- /dev/null +++ b/CWRU/changelog @@ -0,0 +1 @@ +CWRU.chlog \ No newline at end of file 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/MANIFEST b/MANIFEST index 121135fe..b5b377d6 100644 --- a/MANIFEST +++ b/MANIFEST @@ -463,7 +463,6 @@ po/Rules-builtins f po/Rules-quot f po/bash.pot f po/boldquot.sed f -po/builtins.pot f po/en@quot.header f po/en@boldquot.header f po/en@quot.po f diff --git a/array.c b/array.c index 7b0a5d7b..bfc83c38 100644 --- a/array.c +++ b/array.c @@ -451,7 +451,7 @@ char *v; */ array_dispose_element(new); free(element_value(ae)); - ae->value = savestring(v); + ae->value = v ? savestring(v) : (char *)NULL; return(0); } else if (element_index(ae) > i) { ADD_BEFORE(ae, new); diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0 index 141a689b..703bc0bd 100644 --- a/autom4te.cache/output.0 +++ b/autom4te.cache/output.0 @@ -1,5 +1,5 @@ @%:@! /bin/sh -@%:@ From configure.in for Bash 3.0, version 3.165, from autoconf version AC_ACVERSION. +@%:@ From configure.in for Bash 3.0, version 3.166, from autoconf version AC_ACVERSION. @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.57 for bash 3.0-release. @%:@ @@ -13074,223 +13074,6 @@ done -for ac_header in stdlib.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -@%:@include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -@%:@include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -@%:@@%:@ ------------------------------------ @%:@@%:@ -@%:@@%:@ Report this to bug-autoconf@gnu.org. @%:@@%:@ -@%:@@%:@ ------------------------------------ @%:@@%:@ -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -@%:@@%:@ ------------------------------------ @%:@@%:@ -@%:@@%:@ Report this to bug-autoconf@gnu.org. @%:@@%:@ -@%:@@%:@ ------------------------------------ @%:@@%:@ -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -@%:@define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 -echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6 -if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_malloc_0_nonnull=no -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if STDC_HEADERS || HAVE_STDLIB_H -# include -#else -char *malloc (); -#endif - -int -main () -{ -exit (malloc (0) ? 0 : 1); - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_malloc_0_nonnull=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_malloc_0_nonnull=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 -echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6 -if test $ac_cv_func_malloc_0_nonnull = yes; then - -cat >>confdefs.h <<\_ACEOF -@%:@define HAVE_MALLOC 1 -_ACEOF - -else - cat >>confdefs.h <<\_ACEOF -@%:@define HAVE_MALLOC 0 -_ACEOF - - LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" - -cat >>confdefs.h <<\_ACEOF -@%:@define malloc rpl_malloc -_ACEOF - -fi - - - - for ac_header in stdlib.h unistd.h do diff --git a/autom4te.cache/requests b/autom4te.cache/requests index f2d7826a..9f0cac67 100644 --- a/autom4te.cache/requests +++ b/autom4te.cache/requests @@ -15,96 +15,96 @@ 'configure.in' ], { - 'AC_HEADER_DIRENT' => 1, - 'AC_PROG_CC' => 1, - 'AC_TYPE_PID_T' => 1, - 'AC_FUNC_MALLOC' => 1, - 'AC_FUNC_MBRTOWC' => 1, - 'AC_FUNC_LSTAT' => 1, - 'AC_HEADER_TIME' => 1, - 'AH_OUTPUT' => 1, - 'AC_FUNC_GETMNTENT' => 1, - 'AC_PROG_CPP' => 1, - 'AC_TYPE_MODE_T' => 1, - 'm4_pattern_allow' => 1, - 'AC_PROG_YACC' => 1, - 'AC_FUNC_MKTIME' => 1, - 'AC_CHECK_TYPES' => 1, - 'AC_PROG_CXX' => 1, - 'AC_HEADER_MAJOR' => 1, - 'AC_CHECK_FUNCS' => 1, - 'AC_CHECK_HEADERS' => 1, - 'AC_INIT' => 1, - 'AC_STRUCT_TIMEZONE' => 1, - 'AM_MAINTAINER_MODE' => 1, - 'AC_PROG_MAKE_SET' => 1, - 'AC_FUNC_CHOWN' => 1, - 'AC_FUNC_ERROR_AT_LINE' => 1, - 'AC_CONFIG_FILES' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AC_LIBSOURCE' => 1, - 'AC_PROG_RANLIB' => 1, - 'AC_FUNC_MMAP' => 1, - 'AC_CHECK_MEMBERS' => 1, - 'AC_FUNC_STRTOD' => 1, - 'AM_PROG_CC_C_O' => 1, - 'AC_FUNC_CLOSEDIR_VOID' => 1, - 'AC_FUNC_VPRINTF' => 1, - 'AC_PROG_LEX' => 1, - 'AC_FUNC_STAT' => 1, - 'AC_REPLACE_FNMATCH' => 1, 'AC_STRUCT_TM' => 1, - 'AC_FUNC_STRCOLL' => 1, - 'AC_FUNC_STRNLEN' => 1, - 'm4_include' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - 'AC_FUNC_STRERROR_R' => 1, + 'AC_TYPE_PID_T' => 1, 'AC_CANONICAL_SYSTEM' => 1, - 'AC_CHECK_LIB' => 1, - 'AC_STRUCT_ST_BLOCKS' => 1, - 'AC_PATH_X' => 1, - 'AC_FUNC_SELECT_ARGTYPES' => 1, - 'AC_FUNC_MEMCMP' => 1, - 'include' => 1, - 'AC_C_VOLATILE' => 1, - 'AM_GNU_GETTEXT' => 1, - 'AC_DECL_SYS_SIGLIST' => 1, - 'AC_FUNC_SETPGRP' => 1, - 'AC_FUNC_OBSTACK' => 1, - 'AM_CONDITIONAL' => 1, - 'AC_FUNC_REALLOC' => 1, - 'AC_FUNC_WAIT3' => 1, - 'AC_FUNC_STRFTIME' => 1, - 'AC_SUBST' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AC_FUNC_FSEEKO' => 1, - 'AC_HEADER_STAT' => 1, - 'AC_C_INLINE' => 1, - 'AC_DEFINE_TRACE_LITERAL' => 1, - 'AC_FUNC_GETGROUPS' => 1, - 'AC_FUNC_GETLOADAVG' => 1, - 'AC_PROG_INSTALL' => 1, 'm4_pattern_forbid' => 1, - 'AC_FUNC_SETVBUF_REVERSED' => 1, - 'AC_TYPE_SIGNAL' => 1, - 'AC_PROG_GCC_TRADITIONAL' => 1, - 'AC_PROG_LN_S' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'AC_FUNC_ALLOCA' => 1, - 'AC_PROG_AWK' => 1, - 'AC_CONFIG_HEADERS' => 1, + 'AC_FUNC_OBSTACK' => 1, + 'AC_PROG_LEX' => 1, + 'AC_FUNC_GETMNTENT' => 1, + 'AC_FUNC_REALLOC' => 1, + 'AC_FUNC_MEMCMP' => 1, 'AC_FUNC_GETPGRP' => 1, - 'AC_TYPE_OFF_T' => 1, - 'AC_FUNC_UTIME_NULL' => 1, - 'AC_TYPE_SIZE_T' => 1, - 'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AC_FUNC_FORK' => 1, - 'AC_TYPE_UID_T' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_HEADER_DIRENT' => 1, + 'AC_PROG_AWK' => 1, 'AC_HEADER_SYS_WAIT' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_FUNC_ALLOCA' => 1, + 'AC_FUNC_MMAP' => 1, + 'AC_TYPE_MODE_T' => 1, + 'AC_TYPE_SIZE_T' => 1, + 'AC_C_INLINE' => 1, + 'AC_FUNC_GETGROUPS' => 1, + 'AC_FUNC_FSEEKO' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AC_FUNC_STRCOLL' => 1, + 'AC_INIT' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AC_FUNC_STRFTIME' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_TYPE_OFF_T' => 1, + 'AC_PROG_LN_S' => 1, + 'AC_FUNC_MKTIME' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AC_TYPE_UID_T' => 1, + 'AC_FUNC_MALLOC' => 1, + 'AC_HEADER_MAJOR' => 1, + 'AC_FUNC_MBRTOWC' => 1, + 'AC_PROG_CPP' => 1, + 'AC_FUNC_UTIME_NULL' => 1, + 'AC_DECL_SYS_SIGLIST' => 1, + 'AC_CHECK_HEADERS' => 1, + 'm4_include' => 1, + 'AC_HEADER_STAT' => 1, + 'AC_FUNC_GETLOADAVG' => 1, + 'AC_PROG_GCC_TRADITIONAL' => 1, + 'AC_TYPE_SIGNAL' => 1, + 'AC_PROG_RANLIB' => 1, + 'AC_FUNC_VPRINTF' => 1, + 'AC_PROG_YACC' => 1, + 'AC_FUNC_STRNLEN' => 1, + 'AC_FUNC_FORK' => 1, + 'AH_OUTPUT' => 1, + 'AC_STRUCT_TIMEZONE' => 1, + 'AC_HEADER_TIME' => 1, + 'AC_FUNC_STAT' => 1, + 'AC_FUNC_SELECT_ARGTYPES' => 1, + 'AC_PROG_CC' => 1, + 'include' => 1, + 'AC_CHECK_MEMBERS' => 1, + 'AC_PROG_INSTALL' => 1, + 'AC_FUNC_ERROR_AT_LINE' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_FUNC_STRTOD' => 1, 'AC_HEADER_STDC' => 1, - 'AC_C_CONST' => 1 + 'AC_CHECK_FUNCS' => 1, + 'AC_LIBSOURCE' => 1, + 'AC_REPLACE_FNMATCH' => 1, + 'AC_CONFIG_FILES' => 1, + 'AC_CHECK_TYPES' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_FUNC_CLOSEDIR_VOID' => 1, + 'AC_C_CONST' => 1, + 'AC_FUNC_STRERROR_R' => 1, + 'AC_FUNC_CHOWN' => 1, + 'AC_FUNC_SETPGRP' => 1, + 'AC_FUNC_SETVBUF_REVERSED' => 1, + 'AC_CHECK_LIB' => 1, + 'AC_FUNC_WAIT3' => 1, + 'AC_PROG_MAKE_SET' => 1, + 'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' => 1, + 'AC_FUNC_LSTAT' => 1, + 'm4_pattern_allow' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'AC_PROG_CXX' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AC_C_VOLATILE' => 1, + 'AC_PATH_X' => 1, + 'AC_STRUCT_ST_BLOCKS' => 1, + 'AC_SUBST' => 1 } ], 'Request' ) ); diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0 index 64b184d2..542a0a61 100644 --- a/autom4te.cache/traces.0 +++ b/autom4te.cache/traces.0 @@ -823,20 +823,6 @@ m4trace:configure.in:682: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you #undef HAVE_MALLOC_H]) m4trace:configure.in:682: -1- AH_OUTPUT([HAVE_STDIO_EXT_H], [/* Define to 1 if you have the header file. */ #undef HAVE_STDIO_EXT_H]) -m4trace:configure.in:684: -1- AC_FUNC_MALLOC -m4trace:configure.in:684: -1- AC_CHECK_HEADERS([stdlib.h]) -m4trace:configure.in:684: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H]) -m4trace:configure.in:684: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) -m4trace:configure.in:684: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and - to 0 otherwise. */ -#undef HAVE_MALLOC]) -m4trace:configure.in:684: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) -m4trace:configure.in:684: -1- AC_LIBSOURCE([malloc.c]) -m4trace:configure.in:684: -1- AC_SUBST([LIB@&t@OBJS]) -m4trace:configure.in:684: -1- AC_DEFINE_TRACE_LITERAL([malloc]) -m4trace:configure.in:684: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ -#undef malloc]) m4trace:configure.in:685: -1- AC_FUNC_MMAP m4trace:configure.in:685: -1- AC_CHECK_HEADERS([stdlib.h unistd.h]) m4trace:configure.in:685: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ diff --git a/bashline.c b/bashline.c index 6a4963ad..6e8c8141 100644 --- a/bashline.c +++ b/bashline.c @@ -292,7 +292,7 @@ enable_hostname_completion (on_or_off) /* See if we have anything to do. */ at = strchr (rl_completer_word_break_characters, '@'); if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0)) - return; + return old_value; /* We have something to do. Do it. */ nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + on_or_off); diff --git a/builtins/evalfile.c b/builtins/evalfile.c index c17e547b..c87991a7 100644 --- a/builtins/evalfile.c +++ b/builtins/evalfile.c @@ -39,6 +39,7 @@ #include "../flags.h" #include "../input.h" #include "../execute_cmd.h" +#include "../trap.h" #if defined (HISTORY) # include "../bashhist.h" diff --git a/builtins/reserved.def b/builtins/reserved.def index 0f293d39..50a942f8 100644 --- a/builtins/reserved.def +++ b/builtins/reserved.def @@ -145,9 +145,8 @@ $BUILTIN variables $DOCNAME variable_help $SHORT_DOC variables - Some variable names and meanings BASH_VERSION Version information for this Bash. -CDPATH A colon separated list of directories to search - when the argument to `cd' is not found in the current - directory. +CDPATH A colon-separated list of directories to search + for directries given as arguments to `cd'. GLOBIGNORE A colon-separated list of patterns describing filenames to be ignored by pathname expansion. #if defined (HISTORY) diff --git a/doc/FAQ-2.05b b/doc/FAQ-2.05b new file mode 100644 index 00000000..f0f3d1b6 --- /dev/null +++ b/doc/FAQ-2.05b @@ -0,0 +1,1771 @@ +This is the Bash FAQ, version 3.26, 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 Shell and Utilities 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? +E12) Why don't negative offsets in substring expansion work like I expect? + +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 Shell and Utilities 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 was originally developed by +IEEE Working Group 1003.2 (POSIX.2). Today it has been merged with +the original 1003.1 Working Group and is maintained by the Austin +Group (a joint working group of the IEEE, The Open Group and +ISO/IEC SC22/WG15). Today the Shell and Utilities are a volume +within the set of documents that make up IEEE Std 1003.1-2001, and +thus now the former POSIX.2 (from 1992) is now part of the current +POSIX.1 standard (POSIX 1003.1-2001). + +The Shell and Utilities volume concentrates on the command +interpreter interface and utility programs commonly executed from +the command line or by other programs. The standard is freely +available on the web at http://www.UNIX-systems.org/version3/ . +Work continues at the Austin Group on maintenance issues; see +http://www.opengroup.org/austin/ to join the discussions. + +Bash is concerned with the aspects of the shell's behavior defined +by the POSIX Shell and Utilities volume. 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 not +devoted to the shell which are commonly (and in some cases must +be) implemented as builtin commands, such as `read' and `test'. +POSIX 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 latest version of the POSIX Shell and Utilities standard is +available (now updated to the 2003 Edition incorporating the +Technical Corrigendum 1), as part of the Single UNIX Specification +Version 3 at + +http://www.UNIX-systems.org/version3/ + +A10) What is the bash `posix mode'? + +Although bash is an implementation of the POSIX 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'. + +E12) Why don't negative offsets in substring expansion work like I expect? + +When substring expansion of the form ${param:offset[:length} is used, +an `offset' that evaluates to a number less than zero counts back from +the end of the expanded value of $param. + +When a negative `offset' begins with a minus sign, however, unexpected things +can happen. Consider + + a=12345678 + echo ${a:-4} + +intending to print the last four characters of $a. The problem is that +${param:-word} already has a well-defined meaning: expand to word if the +expanded value of param is unset or null, and $param otherwise. + +To use negative offsets that begin with a minus sign, separate the +minus sign and the colon with a space. + +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 2003. 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/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/FAQ.save b/doc/FAQ.save new file mode 100644 index 00000000..1cff3c8e --- /dev/null +++ b/doc/FAQ.save @@ -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/bash.1.orig b/doc/bash.1.orig new file mode 100644 index 00000000..828ec966 --- /dev/null +++ b/doc/bash.1.orig @@ -0,0 +1,8583 @@ +.\" +.\" MAN PAGE COMMENTS to +.\" +.\" Chet Ramey +.\" Information Network Services +.\" Case Western Reserve University +.\" chet@po.CWRU.Edu +.\" +.\" Last Change: Mon Apr 14 17:57:24 EDT 2003 +.\" +.\" bash_builtins, strip all but Built-Ins section +.if \n(zZ=1 .ig zZ +.if \n(zY=1 .ig zY +.TH BASH 1 "2003 April 14" "GNU Bash-3.0" +.\" +.\" There's some problem with having a `@' +.\" in a tagged paragraph with the BSD man macros. +.\" It has to do with `@' appearing in the }1 macro. +.\" This is a problem on 4.3 BSD and Ultrix, but Sun +.\" appears to have fixed it. +.\" If you're seeing the characters +.\" `@u-3p' appearing before the lines reading +.\" `possible-hostname-completions +.\" and `complete-hostname' down in READLINE, +.\" then uncomment this redefinition. +.\" +.de }1 +.ds ]X \&\\*(]B\\ +.nr )E 0 +.if !"\\$1"" .nr )I \\$1n +.}f +.ll \\n(LLu +.in \\n()Ru+\\n(INu+\\n()Iu +.ti \\n(INu +.ie !\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X +.br\} +.el \\*(]X\h|\\n()Iu+\\n()Ru\c +.}f +.. +.\" +.\" File Name macro. This used to be `.PN', for Path Name, +.\" but Sun doesn't seem to like that very much. +.\" +.de FN +\fI\|\\$1\|\fP +.. +.SH NAME +bash \- GNU Bourne-Again SHell +.SH SYNOPSIS +.B bash +[options] +[file] +.SH COPYRIGHT +.if n Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc. +.if t Bash is Copyright \(co 1989-2002 by the Free Software Foundation, Inc. +.SH DESCRIPTION +.B Bash +is an \fBsh\fR-compatible command language interpreter that +executes commands read from the standard input or from a file. +.B Bash +also incorporates useful features from the \fIKorn\fP and \fIC\fP +shells (\fBksh\fP and \fBcsh\fP). +.PP +.B Bash +is intended to be a conformant implementation of the IEEE +POSIX Shell and Tools specification (IEEE Working Group 1003\.2). +.SH OPTIONS +In addition to the single-character shell options documented in the +description of the \fBset\fR builtin command, \fBbash\fR +interprets the following options when it is invoked: +.PP +.PD 0 +.TP 10 +.BI \-c "\| string\^" +If the +.B \-c +option is present, then commands are read from +.IR string . +If there are arguments after the +.IR string , +they are assigned to the positional parameters, starting with +.BR $0 . +.TP +.B \-i +If the +.B \-i +option is present, the shell is +.IR interactive . +.TP +.B \-l +Make +.B bash +act as if it had been invoked as a login shell (see +.SM +.B INVOCATION +below). +.TP +.B \-r +If the +.B \-r +option is present, the shell becomes +.I restricted +(see +.SM +.B "RESTRICTED SHELL" +below). +.TP +.B \-s +If the +.B \-s +option is present, or if no arguments remain after option +processing, then commands are read from the standard input. +This option allows the positional parameters to be set +when invoking an interactive shell. +.TP +.B \-D +A list of all double-quoted strings preceded by \fB$\fP +is printed on the standard ouput. +These are the strings that +are subject to language translation when the current locale +is not \fBC\fP or \fBPOSIX\fP. +This implies the \fB\-n\fP option; no commands will be executed. +.TP +.B [\-+]O [\fIshopt_option\fP] +\fIshopt_option\fP is one of the shell options accepted by the +\fBshopt\fP builtin (see +.SM +.B SHELL BUILTIN COMMANDS +below). +If \fIshopt_option\fP is present, \fB\-O\fP sets the value of that option; +\fB+O\fP unsets it. +If \fIshopt_option\fP is not supplied, the names and values of the shell +options accepted by \fBshopt\fP are printed on the standard output. +If the invocation option is \fB+O\fP, the output is displayed in a format +that may be reused as input. +.TP +.B \-\- +A +.B \-\- +signals the end of options and disables further option processing. +Any arguments after the +.B \-\- +are treated as filenames and arguments. An argument of +.B \- +is equivalent to \fB\-\-\fP. +.PD +.PP +.B Bash +also interprets a number of multi-character options. +These options must appear on the command line before the +single-character options to be recognized. +.PP +.PD 0 +.TP +.B \-\-debugger +Arrange for the debugger profile to be executed before the shell +starts. Turns on extended debugging mode (see the description of the +.B extdebug +option to the +.B shopt +builtin below) and shell function tracing (see the description of the +\fB\-o functrace\fP option to the +.B set +builtin below). +.TP +.B \-\-dump\-po\-strings +Equivalent to \fB\-D\fP, but the output is in the GNU \fIgettext\fP +\fBpo\fP (portable object) file format. +.TP +.B \-\-dump\-strings +Equivalent to \fB\-D\fP. +.TP +.B \-\-help +Display a usage message on standard output and exit successfully. +.TP +\fB\-\-init\-file\fP \fIfile\fP +.PD 0 +.TP +\fB\-\-rcfile\fP \fIfile\fP +.PD +Execute commands from +.I file +instead of the standard personal initialization file +.I ~/.bashrc +if the shell is interactive (see +.SM +.B INVOCATION +below). +.TP +.B \-\-login +Equivalent to \fB\-l\fP. +.TP +.B \-\-noediting +Do not use the GNU +.B readline +library to read command lines when the shell is interactive. +.TP +.B \-\-noprofile +Do not read either the system-wide startup file +.FN /etc/profile +or any of the personal initialization files +.IR ~/.bash_profile , +.IR ~/.bash_login , +or +.IR ~/.profile . +By default, +.B bash +reads these files when it is invoked as a login shell (see +.SM +.B INVOCATION +below). +.TP +.B \-\-norc +Do not read and execute the personal initialization file +.I ~/.bashrc +if the shell is interactive. +This option is on by default if the shell is invoked as +.BR sh . +.TP +.B \-\-posix +Change the behavior of \fBbash\fP where the default operation differs +from the POSIX 1003.2 standard to match the standard (\fIposix mode\fP). +.TP +.B \-\-restricted +The shell becomes restricted (see +.SM +.B "RESTRICTED SHELL" +below). +.TP +.B \-\-verbose +Equivalent to \fB\-v\fP. +.TP +.B \-\-version +Show version information for this instance of +.B bash +on the standard output and exit successfully. +.PD +.SH ARGUMENTS +If arguments remain after option processing, and neither the +.B \-c +nor the +.B \-s +option has been supplied, the first argument is assumed to +be the name of a file containing shell commands. +If +.B bash +is invoked in this fashion, +.B $0 +is set to the name of the file, and the positional parameters +are set to the remaining arguments. +.B Bash +reads and executes commands from this file, then exits. +\fBBash\fP's exit status is the exit status of the last command +executed in the script. +If no commands are executed, the exit status is 0. +An attempt is first made to open the file in the current directory, and, +if no file is found, then the shell searches the directories in +.SM +.B PATH +for the script. +.SH INVOCATION +A \fIlogin shell\fP is one whose first character of argument zero is a +.BR \- , +or one started with the +.B \-\-login +option. +.PP +An \fIinteractive\fP shell is one started without non-option arguments +and without the +.B \-c +option +whose standard input and output are +both connected to terminals (as determined by +.IR isatty (3)), +or one started with the +.B \-i +option. +.SM +.B PS1 +is set and +.B $\- +includes +.B i +if +.B bash +is interactive, +allowing a shell script or a startup file to test this state. +.PP +The following paragraphs describe how +.B bash +executes its startup files. +If any of the files exist but cannot be read, +.B bash +reports an error. +Tildes are expanded in file names as described below under +.B "Tilde Expansion" +in the +.SM +.B EXPANSION +section. +.PP +When +.B bash +is invoked as an interactive login shell, or as a non-interactive shell +with the \fB\-\-login\fP option, it first reads and +executes commands from the file \fI/etc/profile\fP, if that +file exists. +After reading that file, it looks for \fI~/.bash_profile\fP, +\fI~/.bash_login\fP, and \fI~/.profile\fP, in that order, and reads +and executes commands from the first one that exists and is readable. +The +.B \-\-noprofile +option may be used when the shell is started to inhibit this behavior. +.PP +When a login shell exits, +.B bash +reads and executes commands from the file \fI~/.bash_logout\fP, if it +exists. +.PP +When an interactive shell that is not a login shell is started, +.B bash +reads and executes commands from \fI~/.bashrc\fP, if that file exists. +This may be inhibited by using the +.B \-\-norc +option. +The \fB\-\-rcfile\fP \fIfile\fP option will force +.B bash +to read and execute commands from \fIfile\fP instead of \fI~/.bashrc\fP. +.PP +When +.B bash +is started non-interactively, to run a shell script, for example, it +looks for the variable +.SM +.B BASH_ENV +in the environment, expands its value if it appears there, and uses the +expanded value as the name of a file to read and execute. +.B Bash +behaves as if the following command were executed: +.sp .5 +.RS +.if t \f(CWif [ \-n "$BASH_ENV" ]; then . "$BASH_ENV"; fi\fP +.if n if [ \-n "$BASH_ENV" ]; then . "$BASH_ENV"; fi +.RE +.sp .5 +but the value of the +.SM +.B PATH +variable is not used to search for the file name. +.PP +If +.B bash +is invoked with the name +.BR sh , +it tries to mimic the startup behavior of historical versions of +.B sh +as closely as possible, +while conforming to the POSIX standard as well. +When invoked as an interactive login shell, or a non-interactive +shell with the \fB\-\-login\fP option, it first attempts to +read and execute commands from +.I /etc/profile +and +.IR ~/.profile , +in that order. +The +.B \-\-noprofile +option may be used to inhibit this behavior. +When invoked as an interactive shell with the name +.BR sh , +.B bash +looks for the variable +.SM +.BR ENV , +expands its value if it is defined, and uses the +expanded value as the name of a file to read and execute. +Since a shell invoked as +.B sh +does not attempt to read and execute commands from any other startup +files, the +.B \-\-rcfile +option has no effect. +A non-interactive shell invoked with the name +.B sh +does not attempt to read any other startup files. +When invoked as +.BR sh , +.B bash +enters +.I posix +mode after the startup files are read. +.PP +When +.B bash +is started in +.I posix +mode, as with the +.B \-\-posix +command line option, it follows the POSIX standard for startup files. +In this mode, interactive shells expand the +.SM +.B ENV +variable and commands are read and executed from the file +whose name is the expanded value. +No other startup files are read. +.PP +.B Bash +attempts to determine when it is being run by the remote shell +daemon, usually \fIrshd\fP. +If +.B bash +determines it is being run by \fIrshd\fP, it reads and executes +commands from \fI~/.bashrc\fP, if that file exists and is readable. +It will not do this if invoked as \fBsh\fP. +The +.B \-\-norc +option may be used to inhibit this behavior, and the +.B \-\-rcfile +option may be used to force another file to be read, but +\fIrshd\fP does not generally invoke the shell with those options +or allow them to be specified. +.PP +If the shell is started with the effective user (group) id not equal to the +real user (group) id, and the \fB\-p\fP option is not supplied, no startup +files are read, shell functions are not inherited from the environment, the +.SM +.B SHELLOPTS +variable, if it appears in the environment, is ignored, +and the effective user id is set to the real user id. +If the \fB\-p\fP option is supplied at invocation, the startup behavior is +the same, but the effective user id is not reset. +.SH DEFINITIONS +.PP +The following definitions are used throughout the rest of this +document. +.PD 0 +.TP +.B blank +A space or tab. +.TP +.B word +A sequence of characters considered as a single unit by the shell. +Also known as a +.BR token . +.TP +.B name +A +.I word +consisting only of alphanumeric characters and underscores, and +beginning with an alphabetic character or an underscore. Also +referred to as an +.BR identifier . +.TP +.B metacharacter +A character that, when unquoted, separates words. One of the following: +.br +.RS +.PP +.if t \fB| & ; ( ) < > space tab\fP +.if n \fB| & ; ( ) < > space tab\fP +.RE +.PP +.TP +.B control operator +A \fItoken\fP that performs a control function. It is one of the following +symbols: +.RS +.PP +.if t \fB\(bv\(bv & && ; ;; ( ) | \fP +.if n \fB|| & && ; ;; ( ) | \fP +.RE +.PD +.SH "RESERVED WORDS" +\fIReserved words\fP are words that have a special meaning to the shell. +The following words are recognized as reserved when unquoted and either +the first word of a simple command (see +.SM +.B SHELL GRAMMAR +below) or the third word of a +.B case +or +.B for +command: +.if t .RS +.PP +.B +.if n ! case do done elif else esac fi for function if in select then until while { } time [[ ]] +.if t ! case do done elif else esac fi for function if in select then until while { } time [[ ]] +.if t .RE +.RE +.SH "SHELL GRAMMAR" +.SS Simple Commands +.PP +A \fIsimple command\fP is a sequence of optional variable assignments +followed by \fBblank\fP-separated words and redirections, and +terminated by a \fIcontrol operator\fP. The first word +specifies the command to be executed, and is passed as argument zero. +The remaining words are passed as arguments to the invoked command. +.PP +The return value of a \fIsimple command\fP is its exit status, or +128+\fIn\^\fP if the command is terminated by signal +.IR n . +.SS Pipelines +.PP +A \fIpipeline\fP is a sequence of one or more commands separated by +the character +.BR | . +The format for a pipeline is: +.RS +.PP +[\fBtime\fP [\fB\-p\fP]] [ ! ] \fIcommand\fP [ \fB|\fP \fIcommand2\fP ... ] +.RE +.PP +The standard output of +.I command +is connected via a pipe to the standard input of +.IR command2 . +This connection is performed before any redirections specified by the +command (see +.SM +.B REDIRECTION +below). +.PP +If the reserved word +.B ! +precedes a pipeline, the exit status of that +pipeline is the logical NOT of the exit status of the last command. +Otherwise, the status of the pipeline is the exit status of the last +command. +The shell waits for all commands in the pipeline to +terminate before returning a value. +.PP +If the +.B time +reserved word precedes a pipeline, the elapsed as well as user and +system time consumed by its execution are reported when the pipeline +terminates. +The \fB\-p\fP option changes the output format to that specified by POSIX. +The +.SM +.B TIMEFORMAT +variable may be set to a format string that specifies how the timing +information should be displayed; see the description of +.SM +.B TIMEFORMAT +under +.B "Shell Variables" +below. +.PP +Each command in a pipeline is executed as a separate process (i.e., in a +subshell). +.SS Lists +.PP +A \fIlist\fP is a sequence of one or more pipelines separated by one +of the operators +.BR ; , +.BR & , +.BR && , +or +.BR \(bv\(bv , +and optionally terminated by one of +.BR ; , +.BR & , +or +.BR . +.PP +Of these list operators, +.B && +and +.B \(bv\(bv +have equal precedence, followed by +.B ; +and +.BR &, +which have equal precedence. +.PP +A sequence of one or more newlines may appear in a \fIlist\fP instead +of a semicolon to delimit commands. +.PP +If a command is terminated by the control operator +.BR & , +the shell executes the command in the \fIbackground\fP +in a subshell. The shell does not wait for the command to +finish, and the return status is 0. Commands separated by a +.B ; +are executed sequentially; the shell waits for each +command to terminate in turn. The return status is the +exit status of the last command executed. +.PP +The control operators +.B && +and +.B \(bv\(bv +denote AND lists and OR lists, respectively. +An AND list has the form +.RS +.PP +\fIcommand1\fP \fB&&\fP \fIcommand2\fP +.RE +.PP +.I command2 +is executed if, and only if, +.I command1 +returns an exit status of zero. +.PP +An OR list has the form +.RS +.PP +\fIcommand1\fP \fB\(bv\(bv\fP \fIcommand2\fP +.PP +.RE +.PP +.I command2 +is executed if and only if +.I command1 +returns a non-zero exit status. The return status of +AND and OR lists is the exit status of the last command +executed in the list. +.SS Compound Commands +.PP +A \fIcompound command\fP is one of the following: +.TP +(\fIlist\fP) +\fIlist\fP is executed in a subshell. Variable assignments and builtin +commands that affect the shell's environment do not remain in effect +after the command completes. The return status is the exit status of +\fIlist\fP. +.TP +{ \fIlist\fP; } +\fIlist\fP is simply executed in the current shell environment. +\fIlist\fP must be terminated with a newline or semicolon. +This is known as a \fIgroup command\fP. +The return status is the exit status of +\fIlist\fP. +Note that unlike the metacharacters \fB(\fP and \fB)\fP, \fB{\fP and +\fB}\fP are \fIreserved words\fP and must occur where a reserved +word is permitted to be recognized. Since they do not cause a word +break, they must be separated from \fIlist\fP by whitespace. +.TP +((\fIexpression\fP)) +The \fIexpression\fP is evaluated according to the rules described +below under +.SM +.BR "ARITHMETIC EVALUATION" . +If the value of the expression is non-zero, the return status is 0; +otherwise the return status is 1. This is exactly equivalent to +\fBlet "\fIexpression\fP"\fR. +.TP +\fB[[\fP \fIexpression\fP \fB]]\fP +Return a status of 0 or 1 depending on the evaluation of +the conditional expression \fIexpression\fP. +Expressions are composed of the primaries described below under +.SM +.BR "CONDITIONAL EXPRESSIONS" . +Word splitting and pathname expansion are not performed on the words +between the \fB[[\fP and \fB]]\fP; tilde expansion, parameter and +variable expansion, arithmetic expansion, command substitution, process +substitution, and quote removal are performed. +Conditional operators such as \fB\-f\fP must be unquoted to be recognized +as primaries. +.if t .sp 0.5 +.if n .sp 1 +When the \fB==\fP and \fB!=\fP operators are used, the string to the +right of the operator is considered a pattern and matched according +to the rules described below under \fBPattern Matching\fP. +The return value is 0 if the string matches or does not match +the pattern, respectively, and 1 otherwise. +Any part of the pattern may be quoted to force it to be matched as a +string. +.if t .sp 0.5 +.if n .sp 1 +Expressions may be combined using the following operators, listed +in decreasing order of precedence: +.if t .sp 0.5 +.if n .sp 1 +.RS +.PD 0 +.TP +.B ( \fIexpression\fP ) +Returns the value of \fIexpression\fP. +This may be used to override the normal precedence of operators. +.TP +.B ! \fIexpression\fP +True if +.I expression +is false. +.TP +\fIexpression1\fP \fB&&\fP \fIexpression2\fP +True if both +.I expression1 +and +.I expression2 +are true. +.TP +.if t \fIexpression1\fP \fB\(bv\(bv\fP \fIexpression2\fP +.if n \fIexpression1\fP \fB||\fP \fIexpression2\fP +True if either +.I expression1 +or +.I expression2 +is true. +.PD +.LP +The \fB&&\fP and +.if t \fB\(bv\(bv\fP +.if n \fB||\fP +operators do not evaluate \fIexpression2\fP if the value of +\fIexpression1\fP is sufficient to determine the return value of +the entire conditional expression. +.RE +.TP +\fBfor\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP +The list of words following \fBin\fP is expanded, generating a list +of items. +The variable \fIname\fP is set to each element of this list +in turn, and \fIlist\fP is executed each time. +If the \fBin\fP \fIword\fP is omitted, the \fBfor\fP command executes +\fIlist\fP once for each positional parameter that is set (see +.SM +.B PARAMETERS +below). +The return status is the exit status of the last command that executes. +If the expansion of the items following \fBin\fP results in an empty +list, no commands are executed, and the return status is 0. +.TP +\fBfor\fP (( \fIexpr1\fP ; \fIexpr2\fP ; \fIexpr3\fP )) ; \fBdo\fP \fIlist\fP ; \fBdone\fP +First, the arithmetic expression \fIexpr1\fP is evaluated according +to the rules described below under +.SM +.BR "ARITHMETIC EVALUATION" . +The arithmetic expression \fIexpr2\fP is then evaluated repeatedly +until it evaluates to zero. +Each time \fIexpr2\fP evaluates to a non-zero value, \fIlist\fP is +executed and the arithmetic expression \fIexpr3\fP is evaluated. +If any expression is omitted, it behaves as if it evaluates to 1. +The return value is the exit status of the last command in \fIlist\fP +that is executed, or false if any of the expressions is invalid. +.TP +\fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP +The list of words following \fBin\fP is expanded, generating a list +of items. The set of expanded words is printed on the standard +error, each preceded by a number. If the \fBin\fP +\fIword\fP is omitted, the positional parameters are printed (see +.SM +.B PARAMETERS +below). The +.B PS3 +prompt is then displayed and a line read from the standard input. +If the line consists of a number corresponding to one of +the displayed words, then the value of +.I name +is set to that word. If the line is empty, the words and prompt +are displayed again. If EOF is read, the command completes. Any +other value read causes +.I name +to be set to null. The line read is saved in the variable +.BR REPLY . +The +.I list +is executed after each selection until a +.B break +command is executed. +The exit status of +.B select +is the exit status of the last command executed in +.IR list , +or zero if no commands were executed. +.TP +\fBcase\fP \fIword\fP \fBin\fP [ [(] \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \ +... ) \fIlist\fP ;; ] ... \fBesac\fP +A \fBcase\fP command first expands \fIword\fP, and tries to match +it against each \fIpattern\fP in turn, using the same matching rules +as for pathname expansion (see +.B Pathname Expansion +below). When a match is found, the +corresponding \fIlist\fP is executed. After the first match, no +subsequent matches are attempted. The exit status is zero if no +pattern matches. Otherwise, it is the exit status of the +last command executed in \fIlist\fP. +.TP +\fBif\fP \fIlist\fP; \fBthen\fP \fIlist;\fP \ +[ \fBelif\fP \fIlist\fP; \fBthen\fP \fIlist\fP; ] ... \ +[ \fBelse\fP \fIlist\fP; ] \fBfi\fP +The +.B if +.I list +is executed. If its exit status is zero, the +\fBthen\fP \fIlist\fP is executed. Otherwise, each \fBelif\fP +\fIlist\fP is executed in turn, and if its exit status is zero, +the corresponding \fBthen\fP \fIlist\fP is executed and the +command completes. Otherwise, the \fBelse\fP \fIlist\fP is +executed, if present. The exit status is the exit status of the +last command executed, or zero if no condition tested true. +.TP +\fBwhile\fP \fIlist\fP; \fBdo\fP \fIlist\fP; \fBdone\fP +.PD 0 +.TP +\fBuntil\fP \fIlist\fP; \fBdo\fP \fIlist\fP; \fBdone\fP +.PD +The \fBwhile\fP command continuously executes the \fBdo\fP +\fIlist\fP as long as the last command in \fIlist\fP returns +an exit status of zero. The \fBuntil\fP command is identical +to the \fBwhile\fP command, except that the test is negated; +the +.B do +.I list +is executed as long as the last command in +.I list +returns a non-zero exit status. +The exit status of the \fBwhile\fP and \fBuntil\fP commands +is the exit status +of the last \fBdo\fP \fIlist\fP command executed, or zero if +none was executed. +.TP +[ \fBfunction\fP ] \fIname\fP () { \fIlist\fP; } +This defines a function named \fIname\fP. The \fIbody\fP of the +function is the +.I list +of commands between { and }. This list +is executed whenever \fIname\fP is specified as the +name of a simple command. The exit status of a function is +the exit status of the last command executed in the body. (See +.SM +.B FUNCTIONS +below.) +.SH COMMENTS +In a non-interactive shell, or an interactive shell in which the +.B interactive_comments +option to the +.B shopt +builtin is enabled (see +.SM +.B "SHELL BUILTIN COMMANDS" +below), a word beginning with +.B # +causes that word and all remaining characters on that line to +be ignored. An interactive shell without the +.B interactive_comments +option enabled does not allow comments. The +.B interactive_comments +option is on by default in interactive shells. +.SH QUOTING +\fIQuoting\fP is used to remove the special meaning of certain +characters or words to the shell. Quoting can be used to +disable special treatment for special characters, to prevent +reserved words from being recognized as such, and to prevent +parameter expansion. +.PP +Each of the \fImetacharacters\fP listed above under +.SM +.B DEFINITIONS +has special meaning to the shell and must be quoted if it is to +represent itself. +.PP +When the command history expansion facilities are being used, the +\fIhistory expansion\fP character, usually \fB!\fP, must be quoted +to prevent history expansion. +.PP +There are three quoting mechanisms: the +.IR "escape character" , +single quotes, and double quotes. +.PP +A non-quoted backslash (\fB\e\fP) is the +.IR "escape character" . +It preserves the literal value of the next character that follows, +with the exception of . If a \fB\e\fP pair +appears, and the backslash is not itself quoted, the \fB\e\fP +is treated as a line continuation (that is, it is removed from the +input stream and effectively ignored). +.PP +Enclosing characters in single quotes preserves the literal value +of each character within the quotes. A single quote may not occur +between single quotes, even when preceded by a backslash. +.PP +Enclosing characters in double quotes preserves the literal value +of all characters within the quotes, with the exception of +.BR $ , +.BR ` , +and +.BR \e . +The characters +.B $ +and +.B ` +retain their special meaning within double quotes. The backslash +retains its special meaning only when followed by one of the following +characters: +.BR $ , +.BR ` , +\^\fB"\fP\^, +.BR \e , +or +.BR . +A double quote may be quoted within double quotes by preceding it with +a backslash. +When command history is being used, the double quote may not be used to +quote the history expansion character. +.PP +The special parameters +.B * +and +.B @ +have special meaning when in double +quotes (see +.SM +.B PARAMETERS +below). +.PP +Words of the form \fB$\fP'\fIstring\fP' are treated specially. The +word expands to \fIstring\fP, with backslash-escaped characters replaced +as specifed by the ANSI C standard. Backslash escape sequences, if +present, are decoded as follows: +.RS +.PD 0 +.TP +.B \ea +alert (bell) +.TP +.B \eb +backspace +.TP +.B \ee +an escape character +.TP +.B \ef +form feed +.TP +.B \en +new line +.TP +.B \er +carriage return +.TP +.B \et +horizontal tab +.TP +.B \ev +vertical tab +.TP +.B \e\e +backslash +.TP +.B \e' +single quote +.TP +.B \e\fInnn\fP +the eight-bit character whose value is the octal value \fInnn\fP +(one to three digits) +.TP +.B \ex\fIHH\fP +the eight-bit character whose value is the hexadecimal value \fIHH\fP +(one or two hex digits) +.TP +.B \ec\fIx\fP +a control-\fIx\fP character +.PD +.RE +.LP +The expanded result is single-quoted, as if the dollar sign had +not been present. +.PP +A double-quoted string preceded by a dollar sign (\fB$\fP) will cause +the string to be translated according to the current locale. +If the current locale is \fBC\fP or \fBPOSIX\fP, the dollar sign +is ignored. +If the string is translated and replaced, the replacement is +double-quoted. +.SH PARAMETERS +A +.I parameter +is an entity that stores values. +It can be a +.IR name , +a number, or one of the special characters listed below under +.BR "Special Parameters" . +A +.I variable +is a parameter denoted by a +.IR name . +A variable has a \fIvalue\fP and zero or more \fIattributes\fP. +Attributes are assigned using the +.B declare +builtin command (see +.B declare +below in +.SM +.BR "SHELL BUILTIN COMMANDS" ). +.PP +A parameter is set if it has been assigned a value. The null string is +a valid value. Once a variable is set, it may be unset only by using +the +.B unset +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.PP +A +.I variable +may be assigned to by a statement of the form +.RS +.PP +\fIname\fP=[\fIvalue\fP] +.RE +.PP +If +.I value +is not given, the variable is assigned the null string. All +.I values +undergo tilde expansion, parameter and variable expansion, +command substitution, arithmetic expansion, and quote +removal (see +.SM +.B EXPANSION +below). If the variable has its +.B integer +attribute set, then +.I value +is evaluated as an arithmetic expression even if the $((...)) expansion is +not used (see +.B "Arithmetic Expansion" +below). +Word splitting is not performed, with the exception +of \fB"$@"\fP as explained below under +.BR "Special Parameters" . +Pathname expansion is not performed. +Assignment statements may also appear as arguments to the +.BR declare , +.BR typeset , +.BR export , +.BR readonly , +and +.B local +builtin commands. +.SS Positional Parameters +.PP +A +.I positional parameter +is a parameter denoted by one or more +digits, other than the single digit 0. Positional parameters are +assigned from the shell's arguments when it is invoked, +and may be reassigned using the +.B set +builtin command. Positional parameters may not be assigned to +with assignment statements. The positional parameters are +temporarily replaced when a shell function is executed (see +.SM +.B FUNCTIONS +below). +.PP +When a positional parameter consisting of more than a single +digit is expanded, it must be enclosed in braces (see +.SM +.B EXPANSION +below). +.SS Special Parameters +.PP +The shell treats several parameters specially. These parameters may +only be referenced; assignment to them is not allowed. +.PD 0 +.TP +.B * +Expands to the positional parameters, starting from one. When the +expansion occurs within double quotes, it expands to a single word +with the value of each parameter separated by the first character +of the +.SM +.B IFS +special variable. That is, "\fB$*\fP" is equivalent +to "\fB$1\fP\fIc\fP\fB$2\fP\fIc\fP\fB...\fP", where +.I c +is the first character of the value of the +.SM +.B IFS +variable. If +.SM +.B IFS +is unset, the parameters are separated by spaces. +If +.SM +.B IFS +is null, the parameters are joined without intervening separators. +.TP +.B @ +Expands to the positional parameters, starting from one. When the +expansion occurs within double quotes, each parameter expands to a +separate word. That is, "\fB$@\fP" is equivalent to +"\fB$1\fP" "\fB$2\fP" ... +When there are no positional parameters, "\fB$@\fP" and +.B $@ +expand to nothing (i.e., they are removed). +.TP +.B # +Expands to the number of positional parameters in decimal. +.TP +.B ? +Expands to the status of the most recently executed foreground +pipeline. +.TP +.B \- +Expands to the current option flags as specified upon invocation, +by the +.B set +builtin command, or those set by the shell itself +(such as the +.B \-i +option). +.TP +.B $ +Expands to the process ID of the shell. In a () subshell, it +expands to the process ID of the current shell, not the +subshell. +.TP +.B ! +Expands to the process ID of the most recently executed background +(asynchronous) command. +.TP +.B 0 +Expands to the name of the shell or shell script. This is set at +shell initialization. If +.B bash +is invoked with a file of commands, +.B $0 +is set to the name of that file. If +.B bash +is started with the +.B \-c +option, then +.B $0 +is set to the first argument after the string to be +executed, if one is present. Otherwise, it is set +to the file name used to invoke +.BR bash , +as given by argument zero. +.TP +.B _ +At shell startup, set to the absolute file name of the shell or shell +script being executed as passed in the argument list. +Subsequently, expands to the last argument to the previous command, +after expansion. +Also set to the full file name of each command executed and placed in +the environment exported to that command. +When checking mail, this parameter holds the name of the mail file +currently being checked. +.PD +.SS Shell Variables +.PP +The following variables are set by the shell: +.PP +.PD 0 +.TP +.B BASH +Expands to the full file name used to invoke this instance of +.BR bash . +.TP +.B BASH_ARGC +An array variable whose values are the number of parameters in each +frame of the current bash execution call stack. The number of +parameters to the current subroutine (shell function or script executed +with \fB.\fP or \fBsource\fP) is at the top of the stack. When a +subroutine is executed, the number of parameters passed is pushed onto +\fBBASH_ARGC\fP. +.TP +.B BASH_ARGV +An array variable containing all of the parameters in the current bash +execution call stack. The final parameter of the last subroutine call +is at the top of the stack; the first parameter of the initial call is +at the bottom. When a subroutine is executed, the parameters supplied +are pushed onto \fBBASH_ARGV\fP. +.TP +.B BASH_COMMAND +The command currently being executed or about to be executed, unless the +shell is executing a command as the result of a trap, +in which case it is the command executing at the time of the trap. +.TP +.B BASH_EXECUTION_STRING +The command argument to the \fB\-c\fP invocation option. +.TP +.B BASH_LINENO +An array variable whose members are the line numbers in source files +corresponding to each member of @var{FUNCNAME}. +\fB${BASH_LINENO[\fP\fI$i\fP\fB]}\fP is the line number in the source +file where \fB${FUNCNAME[\fP\fI$i + 1\fP\fB]}\fP was called. +The corresponding source file name is \fB${BASH_SOURCE[\fP\fI$i + 1\fP\fB]}\fB. +Use \fBLINENO\fP to obtain the current line number. +.TP +.B BASH_SOURCE +An array variable whose members are the source filenames corresponding +to the elements in the \fBFUNCNAME\fP array variable. +.TP +.B BASH_SUBSHELL +Incremented by one each time a subshell or subshell environment is spawned. +The initial value is 0. +.TP +.B BASH_VERSINFO +A readonly array variable whose members hold version information for +this instance of +.BR bash . +The values assigned to the array members are as follows: +.sp .5 +.RS +.PD 0 +.TP 24 +.B BASH_VERSINFO[\fR0\fP] +The major version number (the \fIrelease\fP). +.TP +.B BASH_VERSINFO[\fR1\fP] +The minor version number (the \fIversion\fP). +.TP +.B BASH_VERSINFO[\fR2\fP] +The patch level. +.TP +.B BASH_VERSINFO[\fR3\fP] +The build version. +.TP +.B BASH_VERSINFO[\fR4\fP] +The release status (e.g., \fIbeta1\fP). +.TP +.B BASH_VERSINFO[\fR5\fP] +The value of \fBMACHTYPE\fP. +.PD +.RE +.TP +.B BASH_VERSION +Expands to a string describing the version of this instance of +.BR bash . +.TP +.B COMP_CWORD +An index into \fB${COMP_WORDS}\fP of the word containing the current +cursor position. +This variable is available only in shell functions invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_LINE +The current command line. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_POINT +The index of the current cursor position relative to the beginning of +the current command. +If the current cursor position is at the end of the current command, +the value of this variable is equal to \fB${#COMP_LINE}\fP. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_WORDBREAKS +The set of characters that the Readline library treats as word +separators when performing word completion. +If +.SM +.B COMP_WORDBREAKS +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B COMP_WORDS +An array variable (see \fBArrays\fP below) consisting of the individual +words in the current command line. +This variable is available only in shell functions invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B DIRSTACK +An array variable (see +.B Arrays +below) containing the current contents of the directory stack. +Directories appear in the stack in the order they are displayed by the +.B dirs +builtin. +Assigning to members of this array variable may be used to modify +directories already in the stack, but the +.B pushd +and +.B popd +builtins must be used to add and remove directories. +Assignment to this variable will not change the current directory. +If +.SM +.B DIRSTACK +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B EUID +Expands to the effective user ID of the current user, initialized at +shell startup. This variable is readonly. +.TP +.B FUNCNAME +An array variable containing the names of all shell functions +currently in the execution call stack. +The element with index 0 is the name of any currently-executing +shell function. +The bottom-most element is "main". +This variable exists only when a shell function is executing. +Assignments to +.SM +.B FUNCNAME +have no effect and return an error status. +If +.SM +.B FUNCNAME +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B GROUPS +An array variable containing the list of groups of which the current +user is a member. +Assignments to +.SM +.B GROUPS +have no effect and return an error status. +If +.SM +.B GROUPS +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B HISTCMD +The history number, or index in the history list, of the current +command. +If +.SM +.B HISTCMD +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B HOSTNAME +Automatically set to the name of the current host. +.TP +.B HOSTTYPE +Automatically set to a string that uniquely +describes the type of machine on which +.B bash +is executing. +The default is system-dependent. +.TP +.B LINENO +Each time this parameter is referenced, the shell substitutes +a decimal number representing the current sequential line number +(starting with 1) within a script or function. When not in a +script or function, the value substituted is not guaranteed to +be meaningful. +If +.SM +.B LINENO +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B MACHTYPE +Automatically set to a string that fully describes the system +type on which +.B bash +is executing, in the standard GNU \fIcpu-company-system\fP format. +The default is system-dependent. +.TP +.B OLDPWD +The previous working directory as set by the +.B cd +command. +.TP +.B OPTARG +The value of the last option argument processed by the +.B getopts +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.TP +.B OPTIND +The index of the next argument to be processed by the +.B getopts +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.TP +.B OSTYPE +Automatically set to a string that +describes the operating system on which +.B bash +is executing. +The default is system-dependent. +.TP +.B PIPESTATUS +An array variable (see +.B Arrays +below) containing a list of exit status values from the processes +in the most-recently-executed foreground pipeline (which may +contain only a single command). +.TP +.B PPID +The process ID of the shell's parent. This variable is readonly. +.TP +.B PWD +The current working directory as set by the +.B cd +command. +.TP +.B RANDOM +Each time this parameter is referenced, a random integer between +0 and 32767 is +generated. The sequence of random numbers may be initialized by assigning +a value to +.SM +.BR RANDOM . +If +.SM +.B RANDOM +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B REPLY +Set to the line of input read by the +.B read +builtin command when no arguments are supplied. +.TP +.B SECONDS +Each time this parameter is +referenced, the number of seconds since shell invocation is returned. If a +value is assigned to +.SM +.BR SECONDS , +the value returned upon subsequent +references is +the number of seconds since the assignment plus the value assigned. +If +.SM +.B SECONDS +is unset, it loses its special properties, even if it is +subsequently reset. +.TP +.B SHELLOPTS +A colon-separated list of enabled shell options. Each word in +the list is a valid argument for the +.B \-o +option to the +.B set +builtin command (see +.SM +.B "SHELL BUILTIN COMMANDS" +below). The options appearing in +.SM +.B SHELLOPTS +are those reported as +.I on +by \fBset \-o\fP. +If this variable is in the environment when +.B bash +starts up, each shell option in the list will be enabled before +reading any startup files. +This variable is read-only. +.TP +.B SHLVL +Incremented by one each time an instance of +.B bash +is started. +.TP +.B UID +Expands to the user ID of the current user, initialized at shell startup. +This variable is readonly. +.PD +.PP +The following variables are used by the shell. In some cases, +.B bash +assigns a default value to a variable; these cases are noted +below. +.PP +.PD 0 +.TP +.B BASH_ENV +If this parameter is set when \fBbash\fP is executing a shell script, +its value is interpreted as a filename containing commands to +initialize the shell, as in +.IR ~/.bashrc . +The value of +.SM +.B BASH_ENV +is subjected to parameter expansion, command substitution, and arithmetic +expansion before being interpreted as a file name. +.SM +.B PATH +is not used to search for the resultant file name. +.TP +.B CDPATH +The search path for the +.B cd +command. +This is a colon-separated list of directories in which the shell looks +for destination directories specified by the +.B cd +command. +A sample value is +.if t \f(CW".:~:/usr"\fP. +.if n ".:~:/usr". +.TP +.B COLUMNS +Used by the \fBselect\fP builtin command to determine the terminal width +when printing selection lists. Automatically set upon receipt of a SIGWINCH. +.TP +.B COMPREPLY +An array variable from which \fBbash\fP reads the possible completions +generated by a shell function invoked by the programmable completion +facility (see \fBProgrammable Completion\fP below). +.TP +.B EMACS +If \fBbash\fP finds this variable in the environment when the shell starts +with value +.if t \f(CWt\fP, +.if n "t", +it assumes that the shell is running in an emacs shell buffer and disables +line editing. +.TP +.B FCEDIT +The default editor for the +.B fc +builtin command. +.TP +.B FIGNORE +A colon-separated list of suffixes to ignore when performing +filename completion (see +.SM +.B READLINE +below). +A filename whose suffix matches one of the entries in +.SM +.B FIGNORE +is excluded from the list of matched filenames. +A sample value is +.if t \f(CW".o:~"\fP. +.if n ".o:~". +.TP +.B GLOBIGNORE +A colon-separated list of patterns defining the set of filenames to +be ignored by pathname expansion. +If a filename matched by a pathname expansion pattern also matches one +of the patterns in +.SM +.BR GLOBIGNORE , +it is removed from the list of matches. +.TP +.B HISTCONTROL +A colon-separated list of values controlling how commands are saved on +the history list. +If the list of values includes +.IR ignorespace , +lines which begin with a +.B space +character are not saved in the history list. +A value of +.I ignoredups +causes lines matching the previous history entry to not be saved. +A value of +.I ignoreboth +is shorthand for \fIignorespace\fP and \fIignoredups\fP. +A value of +.IR erasedups +causes all previous lines matching the current line to be removed from +the history list before that line is saved. +Any value not in the above list is ignored. +If \fBHISTCONTROL\fP is unset, or does not include a valid value, +all lines read by the shell parser are saved on the history list, +subject to the value of +.BR HISTIGNORE . +The second and subsequent lines of a multi-line compound command are +not tested, and are added to the history regardless of the value of +.BR HISTCONTROL . +.TP +.B HISTFILE +The name of the file in which command history is saved (see +.SM +.B HISTORY +below). The default value is \fI~/.bash_history\fP. If unset, the +command history is not saved when an interactive shell exits. +.TP +.B HISTFILESIZE +The maximum number of lines contained in the history file. When this +variable is assigned a value, the history file is truncated, if +necessary, to contain no more than that number of lines. The default +value is 500. The history file is also truncated to this size after +writing it when an interactive shell exits. +.TP +.B HISTIGNORE +A colon-separated list of patterns used to decide which command lines +should be saved on the history list. Each pattern is anchored at the +beginning of the line and must match the complete line (no implicit +`\fB*\fP' is appended). Each pattern is tested against the line +after the checks specified by +.B HISTCONTROL +are applied. +In addition to the normal shell pattern matching characters, `\fB&\fP' +matches the previous history line. `\fB&\fP' may be escaped using a +backslash; the backslash is removed before attempting a match. +The second and subsequent lines of a multi-line compound command are +not tested, and are added to the history regardless of the value of +.BR HISTIGNORE . +.TP +.B HISTSIZE +The number of commands to remember in the command history (see +.SM +.B HISTORY +below). The default value is 500. +.TP +.B HOME +The home directory of the current user; the default argument for the +\fBcd\fP builtin command. +The value of this variable is also used when performing tilde expansion. +.TP +.B HOSTFILE +Contains the name of a file in the same format as +.FN /etc/hosts +that should be read when the shell needs to complete a +hostname. +The list of possible hostname completions may be changed while the +shell is running; +the next time hostname completion is attempted after the +value is changed, +.B bash +adds the contents of the new file to the existing list. +If +.SM +.B HOSTFILE +is set, but has no value, \fBbash\fP attempts to read +.FN /etc/hosts +to obtain the list of possible hostname completions. +When +.SM +.B HOSTFILE +is unset, the hostname list is cleared. +.TP +.B IFS +The +.I Internal Field Separator +that is used +for word splitting after expansion and to +split lines into words with the +.B read +builtin command. The default value is +``''. +.TP +.B IGNOREEOF +Controls the +action of an interactive shell on receipt of an +.SM +.B EOF +character as the sole input. If set, the value is the number of +consecutive +.SM +.B EOF +characters which must be +typed as the first characters on an input line before +.B bash +exits. If the variable exists but does not have a numeric value, or +has no value, the default value is 10. If it does not exist, +.SM +.B EOF +signifies the end of input to the shell. +.TP +.B INPUTRC +The filename for the +.B readline +startup file, overriding the default of +.FN ~/.inputrc +(see +.SM +.B READLINE +below). +.TP +.B LANG +Used to determine the locale category for any category not specifically +selected with a variable starting with \fBLC_\fP. +.TP +.B LC_ALL +This variable overrides the value of \fBLANG\fP and any other +\fBLC_\fP variable specifying a locale category. +.TP +.B LC_COLLATE +This variable determines the collation order used when sorting the +results of pathname expansion, and determines the behavior of range +expressions, equivalence classes, and collating sequences within +pathname expansion and pattern matching. +.TP +.B LC_CTYPE +This variable determines the interpretation of characters and the +behavior of character classes within pathname expansion and pattern +matching. +.TP +.B LC_MESSAGES +This variable determines the locale used to translate double-quoted +strings preceded by a \fB$\fP. +.TP +.B LC_NUMERIC +This variable determines the locale category used for number formatting. +.TP +.B LINES +Used by the \fBselect\fP builtin command to determine the column length +for printing selection lists. Automatically set upon receipt of a SIGWINCH. +.TP +.B MAIL +If this parameter is set to a file name and the +.SM +.B MAILPATH +variable is not set, +.B bash +informs the user of the arrival of mail in the specified file. +.TP +.B MAILCHECK +Specifies how +often (in seconds) +.B bash +checks for mail. The default is 60 seconds. When it is time to check +for mail, the shell does so before displaying the primary prompt. +If this variable is unset, or set to a value that is not a number +greater than or equal to zero, the shell disables mail checking. +.TP +.B MAILPATH +A colon-separated list of file names to be checked for mail. +The message to be printed when mail arrives in a particular file +may be specified by separating the file name from the message with a `?'. +When used in the text of the message, \fB$_\fP expands to the name of +the current mailfile. +Example: +.RS +.PP +\fBMAILPATH\fP='/var/mail/bfox?"You have mail":~/shell\-mail?"$_ has mail!"' +.PP +.B Bash +supplies a default value for this variable, but the location of the user +mail files that it uses is system dependent (e.g., /var/mail/\fB$USER\fP). +.RE +.TP +.B OPTERR +If set to the value 1, +.B bash +displays error messages generated by the +.B getopts +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.SM +.B OPTERR +is initialized to 1 each time the shell is invoked or a shell +script is executed. +.TP +.B PATH +The search path for commands. It +is a colon-separated list of directories in which +the shell looks for commands (see +.SM +.B COMMAND EXECUTION +below). +A zero-length (null) directory name in the value of \fBPATH\fP indicates the +current directory. +A null directory name may appear as two adjacent colons, or as an initial +or trailing colon. +The default path is system-dependent, +and is set by the administrator who installs +.BR bash . +A common value is +.if t \f(CW/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.\fP. +.if n ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''. +.TP +.B POSIXLY_CORRECT +If this variable is in the environment when \fBbash\fP starts, the shell +enters \fIposix mode\fP before reading the startup files, as if the +.B \-\-posix +invocation option had been supplied. If it is set while the shell is +running, \fBbash\fP enables \fIposix mode\fP, as if the command +.if t \f(CWset -o posix\fP +.if n \fIset -o posix\fP +had been executed. +.TP +.B PROMPT_COMMAND +If set, the value is executed as a command prior to issuing each primary +prompt. +.TP +.B PS1 +The value of this parameter is expanded (see +.SM +.B PROMPTING +below) and used as the primary prompt string. The default value is +``\fB\es\-\ev\e$ \fP''. +.TP +.B PS2 +The value of this parameter is expanded as with +.B PS1 +and used as the secondary prompt string. The default is +``\fB> \fP''. +.TP +.B PS3 +The value of this parameter is used as the prompt for the +.B select +command (see +.SM +.B SHELL GRAMMAR +above). +.TP +.B PS4 +The value of this parameter is expanded as with +.B PS1 +and the value is printed before each command +.B bash +displays during an execution trace. The first character of +.SM +.B PS4 +is replicated multiple times, as necessary, to indicate multiple +levels of indirection. The default is ``\fB+ \fP''. +.TP +.B TIMEFORMAT +The value of this parameter is used as a format string specifying +how the timing information for pipelines prefixed with the +.B time +reserved word should be displayed. +The \fB%\fP character introduces an escape sequence that is +expanded to a time value or other information. +The escape sequences and their meanings are as follows; the +braces denote optional portions. +.sp .5 +.RS +.PD 0 +.TP 10 +.B %% +A literal \fB%\fP. +.TP +.B %[\fIp\fP][l]R +The elapsed time in seconds. +.TP +.B %[\fIp\fP][l]U +The number of CPU seconds spent in user mode. +.TP +.B %[\fIp\fP][l]S +The number of CPU seconds spent in system mode. +.TP +.B %P +The CPU percentage, computed as (%U + %S) / %R. +.PD +.RE +.IP +The optional \fIp\fP is a digit specifying the \fIprecision\fP, +the number of fractional digits after a decimal point. +A value of 0 causes no decimal point or fraction to be output. +At most three places after the decimal point may be specified; +values of \fIp\fP greater than 3 are changed to 3. +If \fIp\fP is not specified, the value 3 is used. +.IP +The optional \fBl\fP specifies a longer format, including +minutes, of the form \fIMM\fPm\fISS\fP.\fIFF\fPs. +The value of \fIp\fP determines whether or not the fraction is +included. +.IP +If this variable is not set, \fBbash\fP acts as if it had the +value \fB$'\enreal\et%3lR\enuser\et%3lU\ensys\t%3lS'\fP. +If the value is null, no timing information is displayed. +A trailing newline is added when the format string is displayed. +.TP +.B TMOUT +If set to a value greater than zero, \fBTMOUT\fP is treated as the +default timeout for the \fBread\fP builtin. +The \fBselect\fP command terminates if input does not arrive +after \fBTMOUT\fP seconds when input is coming from a terminal. +In an interactive shell, the value is interpreted as the +number of seconds to wait for input after issuing the primary prompt. +.B Bash +terminates after waiting for that number of seconds if input does +not arrive. +.TP +.B auto_resume +This variable controls how the shell interacts with the user and +job control. If this variable is set, single word simple +commands without redirections are treated as candidates for resumption +of an existing stopped job. There is no ambiguity allowed; if there is +more than one job beginning with the string typed, the job most recently +accessed is selected. The +.I name +of a stopped job, in this context, is the command line used to +start it. +If set to the value +.IR exact , +the string supplied must match the name of a stopped job exactly; +if set to +.IR substring , +the string supplied needs to match a substring of the name of a +stopped job. The +.I substring +value provides functionality analogous to the +.B %? +job identifier (see +.SM +.B JOB CONTROL +below). If set to any other value, the supplied string must +be a prefix of a stopped job's name; this provides functionality +analogous to the +.B % +job identifier. +.TP +.B histchars +The two or three characters which control history expansion +and tokenization (see +.SM +.B HISTORY EXPANSION +below). The first character is the \fIhistory expansion\fP character, +the character which signals the start of a history +expansion, normally `\fB!\fP'. +The second character is the \fIquick substitution\fP +character, which is used as shorthand for re-running the previous +command entered, substituting one string for another in the command. +The default is `\fB^\fP'. +The optional third character is the character +which indicates that the remainder of the line is a comment when found +as the first character of a word, normally `\fB#\fP'. The history +comment character causes history substitution to be skipped for the +remaining words on the line. It does not necessarily cause the shell +parser to treat the rest of the line as a comment. +.PD +.SS Arrays +.B Bash +provides one-dimensional array variables. Any variable may be used as +an array; the +.B declare +builtin will explicitly declare an array. There is no maximum +limit on the size of an array, nor any requirement that members +be indexed or assigned contiguously. Arrays are indexed using +integers and are zero-based. +.PP +An array is created automatically if any variable is assigned to using +the syntax \fIname\fP[\fIsubscript\fP]=\fIvalue\fP. The +.I subscript +is treated as an arithmetic expression that must evaluate to a number +greater than or equal to zero. To explicitly declare an array, use +.B declare \-a \fIname\fP +(see +.SM +.B SHELL BUILTIN COMMANDS +below). +.B declare \-a \fIname\fP[\fIsubscript\fP] +is also accepted; the \fIsubscript\fP is ignored. Attributes may be +specified for an array variable using the +.B declare +and +.B readonly +builtins. Each attribute applies to all members of an array. +.PP +Arrays are assigned to using compound assignments of the form +\fIname\fP=\fB(\fPvalue\fI1\fP ... value\fIn\fP\fB)\fP, where each +\fIvalue\fP is of the form [\fIsubscript\fP]=\fIstring\fP. Only +\fIstring\fP is required. If +the optional brackets and subscript are supplied, that index is assigned to; +otherwise the index of the element assigned is the last index assigned +to by the statement plus one. Indexing starts at zero. +This syntax is also accepted by the +.B declare +builtin. Individual array elements may be assigned to using the +\fIname\fP[\fIsubscript\fP]=\fIvalue\fP syntax introduced above. +.PP +Any element of an array may be referenced using +${\fIname\fP[\fIsubscript\fP]}. The braces are required to avoid +conflicts with pathname expansion. If +\fIsubscript\fP is \fB@\fP or \fB*\fP, the word expands to +all members of \fIname\fP. These subscripts differ only when the +word appears within double quotes. If the word is double-quoted, +${\fIname\fP[*]} expands to a single +word with the value of each array member separated by the first +character of the +.SM +.B IFS +special variable, and ${\fIname\fP[@]} expands each element of +\fIname\fP to a separate word. When there are no array members, +${\fIname\fP[@]} expands to nothing. This is analogous to the expansion +of the special parameters \fB*\fP and \fB@\fP (see +.B Special Parameters +above). ${#\fIname\fP[\fIsubscript\fP]} expands to the length of +${\fIname\fP[\fIsubscript\fP]}. If \fIsubscript\fP is \fB*\fP or +\fB@\fP, the expansion is the number of elements in the array. +Referencing an array variable without a subscript is equivalent to +referencing element zero. +.PP +The +.B unset +builtin is used to destroy arrays. \fBunset\fP \fIname\fP[\fIsubscript\fP] +destroys the array element at index \fIsubscript\fP. +\fBunset\fP \fIname\fP, where \fIname\fP is an array, or +\fBunset\fP \fIname\fP[\fIsubscript\fP], where +\fIsubscript\fP is \fB*\fP or \fB@\fP, removes the entire array. +.PP +The +.BR declare , +.BR local , +and +.B readonly +builtins each accept a +.B \-a +option to specify an array. The +.B read +builtin accepts a +.B \-a +option to assign a list of words read from the standard input +to an array. The +.B set +and +.B declare +builtins display array values in a way that allows them to be +reused as assignments. +.SH EXPANSION +Expansion is performed on the command line after it has been split into +words. There are seven kinds of expansion performed: +.IR "brace expansion" , +.IR "tilde expansion" , +.IR "parameter and variable expansion" , +.IR "command substitution" , +.IR "arithmetic expansion" , +.IR "word splitting" , +and +.IR "pathname expansion" . +.PP +The order of expansions is: brace expansion, tilde expansion, +parameter, variable and arithmetic expansion and +command substitution +(done in a left-to-right fashion), word splitting, and pathname +expansion. +.PP +On systems that can support it, there is an additional expansion +available: \fIprocess substitution\fP. +.PP +Only brace expansion, word splitting, and pathname expansion +can change the number of words of the expansion; other expansions +expand a single word to a single word. +The only exceptions to this are the expansions of +"\fB$@\fP" and "\fB${\fP\fIname\fP\fB[@]}\fP" +as explained above (see +.SM +.BR PARAMETERS ). +.SS Brace Expansion +.PP +.I "Brace expansion" +is a mechanism by which arbitrary strings +may be generated. This mechanism is similar to +\fIpathname expansion\fP, but the filenames generated +need not exist. Patterns to be brace expanded take +the form of an optional +.IR preamble , +followed by either a series of comma-separated strings or +a sequence expression between a pair of braces, followed by +an optional +.IR postscript . +The preamble is prefixed to each string contained +within the braces, and the postscript is then appended +to each resulting string, expanding left to right. +.PP +Brace expansions may be nested. The results of each expanded +string are not sorted; left to right order is preserved. +For example, a\fB{\fPd,c,b\fB}\fPe expands into `ade ace abe'. +.PP +A sequence expression takes the form \fB{\fP\fIx\fP\fB..\fP\fIy\fP\fB}\fP, +where \fIx\fP and \fIy\fP are either integers or single characters. +When integers are supplied, the expression expands to each number between +\fIx\fP and \fIy\fP, inclusive. +When characters are supplied, the expression expands to each character +lexicographically between \fIx\fP and \fIy\fP, inclusive. Note that +both \fIx\fP and \fIy\fP must be of the same type. +.PP +Brace expansion is performed before any other expansions, +and any characters special to other expansions are preserved +in the result. It is strictly textual. +.B Bash +does not apply any syntactic interpretation to the context of the +expansion or the text between the braces. +.PP +A correctly-formed brace expansion must contain unquoted opening +and closing braces, and at least one unquoted comma or a valid +sequence expression. +Any incorrectly formed brace expansion is left unchanged. +A \fB{\fP or \fB,\fP may be quoted with a backslash to prevent its +being considered part of a brace expression. +To avoid conflicts with parameter expansion, the string \fB${\fP +is not considered eligible for brace expansion. +.PP +This construct is typically used as shorthand when the common +prefix of the strings to be generated is longer than in the +above example: +.RS +.PP +mkdir /usr/local/src/bash/{old,new,dist,bugs} +.RE +or +.RS +chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} +.RE +.PP +Brace expansion introduces a slight incompatibility with +historical versions of +.BR sh . +.B sh +does not treat opening or closing braces specially when they +appear as part of a word, and preserves them in the output. +.B Bash +removes braces from words as a consequence of brace +expansion. For example, a word entered to +.B sh +as \fIfile{1,2}\fP +appears identically in the output. The same word is +output as +.I file1 file2 +after expansion by +.BR bash . +If strict compatibility with +.B sh +is desired, start +.B bash +with the +.B +B +option or disable brace expansion with the +.B +B +option to the +.B set +command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.SS Tilde Expansion +.PP +If a word begins with an unquoted tilde character (`\fB~\fP'), all of +the characters preceding the first unquoted slash (or all characters, +if there is no unquoted slash) are considered a \fItilde-prefix\fP. +If none of the characters in the tilde-prefix are quoted, the +characters in the tilde-prefix following the tilde are treated as a +possible \fIlogin name\fP. +If this login name is the null string, the tilde is replaced with the +value of the shell parameter +.SM +.BR HOME . +If +.SM +.B HOME +is unset, the home directory of the user executing the shell is +substituted instead. +Otherwise, the tilde-prefix is replaced with the home directory +associated with the specified login name. +.PP +If the tilde-prefix is a `~+', the value of the shell variable +.SM +.B PWD +replaces the tilde-prefix. +If the tilde-prefix is a `~\-', the value of the shell variable +.SM +.BR OLDPWD , +if it is set, is substituted. +If the characters following the tilde in the tilde-prefix consist +of a number \fIN\fP, optionally prefixed +by a `+' or a `\-', the tilde-prefix is replaced with the corresponding +element from the directory stack, as it would be displayed by the +.B dirs +builtin invoked with the tilde-prefix as an argument. +If the characters following the tilde in the tilde-prefix consist of a +number without a leading `+' or `\-', `+' is assumed. +.PP +If the login name is invalid, or the tilde expansion fails, the word +is unchanged. +.PP +Each variable assignment is checked for unquoted tilde-prefixes immediately +following a +.B : +or +.BR = . +In these cases, tilde expansion is also performed. +Consequently, one may use file names with tildes in assignments to +.SM +.BR PATH , +.SM +.BR MAILPATH , +and +.SM +.BR CDPATH , +and the shell assigns the expanded value. +.SS Parameter Expansion +.PP +The `\fB$\fP' character introduces parameter expansion, +command substitution, or arithmetic expansion. The parameter name +or symbol to be expanded may be enclosed in braces, which +are optional but serve to protect the variable to be expanded from +characters immediately following it which could be +interpreted as part of the name. +.PP +When braces are used, the matching ending brace is the first `\fB}\fP' +not escaped by a backslash or within a quoted string, and not within an +embedded arithmetic expansion, command substitution, or paramter +expansion. +.PP +.PD 0 +.TP +${\fIparameter\fP} +The value of \fIparameter\fP is substituted. The braces are required +when +.I parameter +is a positional parameter with more than one digit, +or when +.I parameter +is followed by a character which is not to be +interpreted as part of its name. +.PD +.PP +If the first character of \fIparameter\fP is an exclamation point, +a level of variable indirection is introduced. +\fBBash\fP uses the value of the variable formed from the rest of +\fIparameter\fP as the name of the variable; this variable is then +expanded and that value is used in the rest of the substitution, rather +than the value of \fIparameter\fP itself. +This is known as \fIindirect expansion\fP. +The exceptions to this are the expansions of ${!\fIprefix\fP*} and +${\fB!\fP\fIname\fP[\fI@\fP]} described below. +The exclamation point must immediately follow the left brace in order to +introduce indirection. +.PP +In each of the cases below, \fIword\fP is subject to tilde expansion, +parameter expansion, command substitution, and arithmetic expansion. +When not performing substring expansion, \fBbash\fP tests for a parameter +that is unset or null; omitting the colon results in a test only for a +parameter that is unset. +.PP +.PD 0 +.TP +${\fIparameter\fP\fB:\-\fP\fIword\fP} +\fBUse Default Values\fP. If +.I parameter +is unset or null, the expansion of +.I word +is substituted. Otherwise, the value of +.I parameter +is substituted. +.TP +${\fIparameter\fP\fB:=\fP\fIword\fP} +\fBAssign Default Values\fP. +If +.I parameter +is unset or null, the expansion of +.I word +is assigned to +.IR parameter . +The value of +.I parameter +is then substituted. Positional parameters and special parameters may +not be assigned to in this way. +.TP +${\fIparameter\fP\fB:?\fP\fIword\fP} +\fBDisplay Error if Null or Unset\fP. +If +.I parameter +is null or unset, the expansion of \fIword\fP (or a message to that effect +if +.I word +is not present) is written to the standard error and the shell, if it +is not interactive, exits. Otherwise, the value of \fIparameter\fP is +substituted. +.TP +${\fIparameter\fP\fB:+\fP\fIword\fP} +\fBUse Alternate Value\fP. +If +.I parameter +is null or unset, nothing is substituted, otherwise the expansion of +.I word +is substituted. +.TP +${\fIparameter\fP\fB:\fP\fIoffset\fP} +.PD 0 +.TP +${\fIparameter\fP\fB:\fP\fIoffset\fP\fB:\fP\fIlength\fP} +.PD +\fBSubstring Expansion.\fP +Expands to up to \fIlength\fP characters of \fIparameter\fP +starting at the character specified by \fIoffset\fP. +If \fIlength\fP is omitted, expands to the substring of +\fIparameter\fP starting at the character specified by \fIoffset\fP. +\fIlength\fP and \fIoffset\fP are arithmetic expressions (see +.SM +.B +ARITHMETIC EVALUATION +below). +\fIlength\fP must evaluate to a number greater than or equal to zero. +If \fIoffset\fP evaluates to a number less than zero, the value +is used as an offset from the end of the value of \fIparameter\fP. +If \fIparameter\fP is \fB@\fP, the result is \fIlength\fP positional +parameters beginning at \fIoffset\fP. +If \fIparameter\fP is an array name indexed by @ or *, +the result is the \fIlength\fP +members of the array beginning with ${\fIparameter\fP[\fIoffset\fP]}. +Substring indexing is zero-based unless the positional parameters +are used, in which case the indexing starts at 1. +.TP +${\fB!\fP\fIprefix\fP\fB*\fP} +.PD 0 +.TP +${\fB!\fP\fIprefix\fP\fB@\fP} +.PD +Expands to the names of variables whose names begin with \fIprefix\fP, +separated by the first character of the +.SM +.B IFS +special variable. +.TP +${\fB!\fP\fIname\fP[\fI@\fP]} +.PD 0 +.TP +${\fB!\fP\fIname\fP[\fI*\fP]} +.PD +If \fIname\fP is an array variable, expands to the list of array indices +(keys) assigned in \fIname\fP. +If \fIname\fP is not an array, expands to 0 if \fIname\fP is set and null +otherwise. +When \fI@\fP is used and the expansion appears within double quotes, each +key expands to a separate word. +.TP +${\fB#\fP\fIparameter\fP} +The length in characters of the value of \fIparameter\fP is substituted. +If +.I parameter +is +.B * +or +.BR @ , +the value substituted is the number of positional parameters. +If +.I parameter +is an array name subscripted by +.B * +or +.BR @ , +the value substituted is the number of elements in the array. +.TP +${\fIparameter\fP\fB#\fP\fIword\fP} +.PD 0 +.TP +${\fIparameter\fP\fB##\fP\fIword\fP} +.PD +The +.I word +is expanded to produce a pattern just as in pathname +expansion. If the pattern matches the beginning of +the value of +.IR parameter , +then the result of the expansion is the expanded value of +.I parameter +with the shortest matching pattern (the ``\fB#\fP'' case) or the +longest matching pattern (the ``\fB##\fP'' case) deleted. +If +.I parameter +is +.B @ +or +.BR * , +the pattern removal operation is applied to each positional +parameter in turn, and the expansion is the resultant list. +If +.I parameter +is an array variable subscripted with +.B @ +or +.BR * , +the pattern removal operation is applied to each member of the +array in turn, and the expansion is the resultant list. +.TP +${\fIparameter\fP\fB%\fP\fIword\fP} +.PD 0 +.TP +${\fIparameter\fP\fB%%\fP\fIword\fP} +.PD +The \fIword\fP is expanded to produce a pattern just as in +pathname expansion. +If the pattern matches a trailing portion of the expanded value of +.IR parameter , +then the result of the expansion is the expanded value of +.I parameter +with the shortest matching pattern (the ``\fB%\fP'' case) or the +longest matching pattern (the ``\fB%%\fP'' case) deleted. +If +.I parameter +is +.B @ +or +.BR * , +the pattern removal operation is applied to each positional +parameter in turn, and the expansion is the resultant list. +If +.I parameter +is an array variable subscripted with +.B @ +or +.BR * , +the pattern removal operation is applied to each member of the +array in turn, and the expansion is the resultant list. +.TP +${\fIparameter\fP\fB/\fP\fIpattern\fP\fB/\fP\fIstring\fP} +.PD 0 +.TP +${\fIparameter\fP\fB//\fP\fIpattern\fP\fB/\fP\fIstring\fP} +.PD +The \fIpattern\fP is expanded to produce a pattern just as in +pathname expansion. +\fIParameter\fP is expanded and the longest match of \fIpattern\fP +against its value is replaced with \fIstring\fP. +In the first form, only the first match is replaced. +The second form causes all matches of \fIpattern\fP to be +replaced with \fIstring\fP. +If \fIpattern\fP begins with \fB#\fP, it must match at the beginning +of the expanded value of \fIparameter\fP. +If \fIpattern\fP begins with \fB%\fP, it must match at the end +of the expanded value of \fIparameter\fP. +If \fIstring\fP is null, matches of \fIpattern\fP are deleted +and the \fB/\fP following \fIpattern\fP may be omitted. +If +.I parameter +is +.B @ +or +.BR * , +the substitution operation is applied to each positional +parameter in turn, and the expansion is the resultant list. +If +.I parameter +is an array variable subscripted with +.B @ +or +.BR * , +the substitution operation is applied to each member of the +array in turn, and the expansion is the resultant list. +.SS Command Substitution +.PP +\fICommand substitution\fP allows the output of a command to replace +the command name. There are two forms: +.PP +.RS +.PP +\fB$(\fP\fIcommand\fP\|\fB)\fP +.RE +or +.RS +\fB`\fP\fIcommand\fP\fB`\fP +.RE +.PP +.B Bash +performs the expansion by executing \fIcommand\fP and +replacing the command substitution with the standard output of the +command, with any trailing newlines deleted. +Embedded newlines are not deleted, but they may be removed during +word splitting. +The command substitution \fB$(cat \fIfile\fP)\fR can be replaced by +the equivalent but faster \fB$(< \fIfile\fP)\fR. +.PP +When the old-style backquote form of substitution is used, +backslash retains its literal meaning except when followed by +.BR $ , +.BR ` , +or +.BR \e . +The first backquote not preceded by a backslash terminates the +command substitution. +When using the $(\^\fIcommand\fP\|) form, all characters between the +parentheses make up the command; none are treated specially. +.PP +Command substitutions may be nested. To nest when using the backquoted form, +escape the inner backquotes with backslashes. +.PP +If the substitution appears within double quotes, word splitting and +pathname expansion are not performed on the results. +.SS Arithmetic Expansion +.PP +Arithmetic expansion allows the evaluation of an arithmetic expression +and the substitution of the result. The format for arithmetic expansion is: +.RS +.PP +\fB$((\fP\fIexpression\fP\fB))\fP +.RE +.PP +The +.I expression +is treated as if it were within double quotes, but a double quote +inside the parentheses is not treated specially. +All tokens in the expression undergo parameter expansion, string +expansion, command substitution, and quote removal. +Arithmetic expansions may be nested. +.PP +The evaluation is performed according to the rules listed below under +.SM +.BR "ARITHMETIC EVALUATION" . +If +.I expression +is invalid, +.B bash +prints a message indicating failure and no substitution occurs. +.SS Process Substitution +.PP +\fIProcess substitution\fP is supported on systems that support named +pipes (\fIFIFOs\fP) or the \fB/dev/fd\fP method of naming open files. +It takes the form of +\fB<(\fP\fIlist\^\fP\fB)\fP +or +\fB>(\fP\fIlist\^\fP\fB)\fP. +The process \fIlist\fP is run with its input or output connected to a +\fIFIFO\fP or some file in \fB/dev/fd\fP. The name of this file is +passed as an argument to the current command as the result of the +expansion. If the \fB>(\fP\fIlist\^\fP\fB)\fP form is used, writing to +the file will provide input for \fIlist\fP. If the +\fB<(\fP\fIlist\^\fP\fB)\fP form is used, the file passed as an +argument should be read to obtain the output of \fIlist\fP. +.PP +When available, process substitution is performed +simultaneously with parameter and variable expansion, +command substitution, +and arithmetic expansion. +.SS Word Splitting +.PP +The shell scans the results of +parameter expansion, +command substitution, +and +arithmetic expansion +that did not occur within double quotes for +.IR "word splitting" . +.PP +The shell treats each character of +.SM +.B IFS +as a delimiter, and splits the results of the other +expansions into words on these characters. If +.SM +.B IFS +is unset, or its +value is exactly +.BR , +the default, then +any sequence of +.SM +.B IFS +characters serves to delimit words. If +.SM +.B IFS +has a value other than the default, then sequences of +the whitespace characters +.B space +and +.B tab +are ignored at the beginning and end of the +word, as long as the whitespace character is in the +value of +.SM +.BR IFS +(an +.SM +.B IFS +whitespace character). +Any character in +.SM +.B IFS +that is not +.SM +.B IFS +whitespace, along with any adjacent +.SM +.B IFS +whitespace characters, delimits a field. +A sequence of +.SM +.B IFS +whitespace characters is also treated as a delimiter. +If the value of +.SM +.B IFS +is null, no word splitting occurs. +.PP +Explicit null arguments (\^\f3"\^"\fP or \^\f3'\^'\fP\^) are retained. +Unquoted implicit null arguments, resulting from the expansion of +parameters that have no values, are removed. +If a parameter with no value is expanded within double quotes, a +null argument results and is retained. +.PP +Note that if no expansion occurs, no splitting +is performed. +.SS Pathname Expansion +.PP +After word splitting, +unless the +.B \-f +option has been set, +.B bash +scans each word for the characters +.BR * , +.BR ? , +and +.BR [ . +If one of these characters appears, then the word is +regarded as a +.IR pattern , +and replaced with an alphabetically sorted list of +file names matching the pattern. +If no matching file names are found, +and the shell option +.B nullglob +is disabled, the word is left unchanged. +If the +.B nullglob +option is set, and no matches are found, +the word is removed. +If the shell option +.B nocaseglob +is enabled, the match is performed without regard to the case +of alphabetic characters. +When a pattern is used for pathname expansion, +the character +.B ``.'' +at the start of a name or immediately following a slash +must be matched explicitly, unless the shell option +.B dotglob +is set. +When matching a pathname, the slash character must always be +matched explicitly. +In other cases, the +.B ``.'' +character is not treated specially. +See the description of +.B shopt +below under +.SM +.B SHELL BUILTIN COMMANDS +for a description of the +.BR nocaseglob , +.BR nullglob , +and +.B dotglob +shell options. +.PP +The +.SM +.B GLOBIGNORE +shell variable may be used to restrict the set of file names matching a +.IR pattern . +If +.SM +.B GLOBIGNORE +is set, each matching file name that also matches one of the patterns in +.SM +.B GLOBIGNORE +is removed from the list of matches. +The file names +.B ``.'' +and +.B ``..'' +are always ignored when +.SM +.B GLOBIGNORE +is set and not null. However, setting +.SM +.B GLOBIGNORE +to a non-null value has the effect of enabling the +.B dotglob +shell option, so all other file names beginning with a +.B ``.'' +will match. +To get the old behavior of ignoring file names beginning with a +.BR ``.'' , +make +.B ``.*'' +one of the patterns in +.SM +.BR GLOBIGNORE . +The +.B dotglob +option is disabled when +.SM +.B GLOBIGNORE +is unset. +.PP +\fBPattern Matching\fP +.PP +Any character that appears in a pattern, other than the special pattern +characters described below, matches itself. The NUL character may not +occur in a pattern. A backslash escapes the following character; the +escaping backslash is discarded when matching. +The special pattern characters must be quoted if +they are to be matched literally. +.PP +The special pattern characters have the following meanings: +.PP +.PD 0 +.TP +.B * +Matches any string, including the null string. +.TP +.B ? +Matches any single character. +.TP +.B [...] +Matches any one of the enclosed characters. A pair of characters +separated by a hyphen denotes a +\fIrange expression\fP; +any character that sorts between those two characters, inclusive, +using the current locale's collating sequence and character set, +is matched. If the first character following the +.B [ +is a +.B ! +or a +.B ^ +then any character not enclosed is matched. +The sorting order of characters in range expressions is determined by +the current locale and the value of the \fBLC_COLLATE\fP shell variable, +if set. +A +.B \- +may be matched by including it as the first or last character +in the set. +A +.B ] +may be matched by including it as the first character +in the set. +.br +.if t .sp 0.5 +.if n .sp 1 +Within +.B [ +and +.BR ] , +\fIcharacter classes\fP can be specified using the syntax +\fB[:\fP\fIclass\fP\fB:]\fP, where \fIclass\fP is one of the +following classes defined in the POSIX.2 standard: +.PP +.RS +.B +.if n alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit +.if t alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit +.br +A character class matches any character belonging to that class. +The \fBword\fP character class matches letters, digits, and the character _. +.br +.if t .sp 0.5 +.if n .sp 1 +Within +.B [ +and +.BR ] , +an \fIequivalence class\fP can be specified using the syntax +\fB[=\fP\fIc\fP\fB=]\fP, which matches all characters with the +same collation weight (as defined by the current locale) as +the character \fIc\fP. +.br +.if t .sp 0.5 +.if n .sp 1 +Within +.B [ +and +.BR ] , +the syntax \fB[.\fP\fIsymbol\fP\fB.]\fP matches the collating symbol +\fIsymbol\fP. +.RE +.PD +.PP +If the \fBextglob\fP shell option is enabled using the \fBshopt\fP +builtin, several extended pattern matching operators are recognized. +In the following description, a \fIpattern-list\fP is a list of one +or more patterns separated by a \fB|\fP. +Composite patterns may be formed using one or more of the following +sub-patterns: +.sp 1 +.PD 0 +.RS +.TP +\fB?(\fP\^\fIpattern-list\^\fP\fB)\fP +Matches zero or one occurrence of the given patterns +.TP +\fB*(\fP\^\fIpattern-list\^\fP\fB)\fP +Matches zero or more occurrences of the given patterns +.TP +\fB+(\fP\^\fIpattern-list\^\fP\fB)\fP +Matches one or more occurrences of the given patterns +.TP +\fB@(\fP\^\fIpattern-list\^\fP\fB)\fP +Matches exactly one of the given patterns +.TP +\fB!(\fP\^\fIpattern-list\^\fP\fB)\fP +Matches anything except one of the given patterns +.RE +.PD +.SS Quote Removal +.PP +After the preceding expansions, all unquoted occurrences of the +characters +.BR \e , +.BR ' , +and \^\f3"\fP\^ that did not result from one of the above +expansions are removed. +.SH REDIRECTION +Before a command is executed, its input and output +may be +.I redirected +using a special notation interpreted by the shell. +Redirection may also be used to open and close files for the +current shell execution environment. The following redirection +operators may precede or appear anywhere within a +.I simple command +or may follow a +.IR command . +Redirections are processed in the order they appear, from +left to right. +.PP +In the following descriptions, if the file descriptor number is +omitted, and the first character of the redirection operator is +.BR < , +the redirection refers to the standard input (file descriptor +0). If the first character of the redirection operator is +.BR > , +the redirection refers to the standard output (file descriptor +1). +.PP +The word following the redirection operator in the following +descriptions, unless otherwise noted, is subjected to brace expansion, +tilde expansion, parameter expansion, command substitution, arithmetic +expansion, quote removal, pathname expansion, and word splitting. +If it expands to more than one word, +.B bash +reports an error. +.PP +Note that the order of redirections is significant. For example, +the command +.RS +.PP +ls \fB>\fP dirlist 2\fB>&\fP1 +.RE +.PP +directs both standard output and standard error to the file +.IR dirlist , +while the command +.RS +.PP +ls 2\fB>&\fP1 \fB>\fP dirlist +.RE +.PP +directs only the standard output to file +.IR dirlist , +because the standard error was duplicated as standard output +before the standard output was redirected to +.IR dirlist . +.PP +\fBBash\fP handles several filenames specially when they are used in +redirections, as described in the following table: +.RS +.PP +.PD 0 +.TP +.B /dev/fd/\fIfd\fP +If \fIfd\fP is a valid integer, file descriptor \fIfd\fP is duplicated. +.TP +.B /dev/stdin +File descriptor 0 is duplicated. +.TP +.B /dev/stdout +File descriptor 1 is duplicated. +.TP +.B /dev/stderr +File descriptor 2 is duplicated. +.TP +.B /dev/tcp/\fIhost\fP/\fIport\fP +If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP +is an integer port number or service name, \fBbash\fP attempts to open +a TCP connection to the corresponding socket. +.TP +.B /dev/udp/\fIhost\fP/\fIport\fP +If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP +is an integer port number or service name, \fBbash\fP attempts to open +a UDP connection to the corresponding socket. +.PD +.RE +.PP +A failure to open or create a file causes the redirection to fail. +.SS Redirecting Input +.PP +Redirection of input causes the file whose name results from +the expansion of +.I word +to be opened for reading on file descriptor +.IR n , +or the standard input (file descriptor 0) if +.I n +is not specified. +.PP +The general format for redirecting input is: +.RS +.PP +[\fIn\fP]\fB<\fP\fIword\fP +.RE +.SS Redirecting Output +.PP +Redirection of output causes the file whose name results from +the expansion of +.I word +to be opened for writing on file descriptor +.IR n , +or the standard output (file descriptor 1) if +.I n +is not specified. If the file does not exist it is created; +if it does exist it is truncated to zero size. +.PP +The general format for redirecting output is: +.RS +.PP +[\fIn\fP]\fB>\fP\fIword\fP +.RE +.PP +If the redirection operator is +.BR > , +and the +.B noclobber +option to the +.B set +builtin has been enabled, the redirection will fail if the file +whose name results from the expansion of \fIword\fP exists and is +a regular file. +If the redirection operator is +.BR >| , +or the redirection operator is +.B > +and the +.B noclobber +option to the +.B set +builtin command is not enabled, the redirection is attempted even +if the file named by \fIword\fP exists. +.SS Appending Redirected Output +.PP +Redirection of output in this fashion +causes the file whose name results from +the expansion of +.I word +to be opened for appending on file descriptor +.IR n , +or the standard output (file descriptor 1) if +.I n +is not specified. If the file does not exist it is created. +.PP +The general format for appending output is: +.RS +.PP +[\fIn\fP]\fB>>\fP\fIword\fP +.RE +.PP +.SS Redirecting Standard Output and Standard Error +.PP +.B Bash +allows both the +standard output (file descriptor 1) and +the standard error output (file descriptor 2) +to be redirected to the file whose name is the +expansion of +.I word +with this construct. +.PP +There are two formats for redirecting standard output and +standard error: +.RS +.PP +\fB&>\fP\fIword\fP +.RE +and +.RS +\fB>&\fP\fIword\fP +.RE +.PP +Of the two forms, the first is preferred. +This is semantically equivalent to +.RS +.PP +\fB>\fP\fIword\fP 2\fB>&\fP1 +.RE +.SS Here Documents +.PP +This type of redirection instructs the shell to read input from the +current source until a line containing only +.I word +(with no trailing blanks) +is seen. All of +the lines read up to that point are then used as the standard +input for a command. +.PP +The format of here-documents is: +.RS +.PP +.nf +\fB<<\fP[\fB\-\fP]\fIword\fP + \fIhere-document\fP +\fIdelimiter\fP +.fi +.RE +.PP +No parameter expansion, command substitution, arithmetic expansion, +or pathname expansion is performed on +.IR word . +If any characters in +.I word +are quoted, the +.I delimiter +is the result of quote removal on +.IR word , +and the lines in the here-document are not expanded. +If \fIword\fP is unquoted, +all lines of the here-document are subjected to parameter expansion, +command substitution, and arithmetic expansion. In the latter +case, the character sequence +.B \e +is ignored, and +.B \e +must be used to quote the characters +.BR \e , +.BR $ , +and +.BR ` . +.PP +If the redirection operator is +.BR <<\- , +then all leading tab characters are stripped from input lines and the +line containing +.IR delimiter . +This allows +here-documents within shell scripts to be indented in a +natural fashion. +.SS "Here Strings" +A variant of here documents, the format is: +.RS +.PP +.nf +\fB<<<\fP\fIword\fP +.fi +.RE +.PP +The \fIword\fP is expanded and supplied to the command on its standard +input. +.SS "Duplicating File Descriptors" +.PP +The redirection operator +.RS +.PP +[\fIn\fP]\fB<&\fP\fIword\fP +.RE +.PP +is used to duplicate input file descriptors. +If +.I word +expands to one or more digits, the file descriptor denoted by +.I n +is made to be a copy of that file descriptor. +If the digits in +.I word +do not specify a file descriptor open for input, a redirection error occurs. +If +.I word +evaluates to +.BR \- , +file descriptor +.I n +is closed. If +.I n +is not specified, the standard input (file descriptor 0) is used. +.PP +The operator +.RS +.PP +[\fIn\fP]\fB>&\fP\fIword\fP +.RE +.PP +is used similarly to duplicate output file descriptors. If +.I n +is not specified, the standard output (file descriptor 1) is used. +If the digits in +.I word +do not specify a file descriptor open for output, a redirection error occurs. +As a special case, if \fIn\fP is omitted, and \fIword\fP does not +expand to one or more digits, the standard output and standard +error are redirected as described previously. +.SS "Moving File Descriptors" +.PP +The redirection operator +.RS +.PP +[\fIn\fP]\fB<&\fP\fIdigit\fP\fB\-\fP +.RE +.PP +moves the file descriptor \fIdigit\fP to file descriptor +.IR n , +or the standard input (file descriptor 0) if \fIn\fP is not specified. +\fIdigit\fP is closed after being duplicated to \fIn\fP. +.PP +Similarly, the redirection operator +.RS +.PP +[\fIn\fP]\fB>&\fP\fIdigit\fP\fB\-\fP +.RE +.PP +moves the file descriptor \fIdigit\fP to file descriptor +.IR n , +or the standard output (file descriptor 1) if \fIn\fP is not specified. +.SS "Opening File Descriptors for Reading and Writing" +.PP +The redirection operator +.RS +.PP +[\fIn\fP]\fB<>\fP\fIword\fP +.RE +.PP +causes the file whose name is the expansion of +.I word +to be opened for both reading and writing on file descriptor +.IR n , +or on file descriptor 0 if +.I n +is not specified. If the file does not exist, it is created. +.SH ALIASES +\fIAliases\fP allow a string to be substituted for a word when it is used +as the first word of a simple command. +The shell maintains a list of aliases that may be set and unset with the +.B alias +and +.B unalias +builtin commands (see +.SM +.B SHELL BUILTIN COMMANDS +below). +The first word of each command, if unquoted, +is checked to see if it has an +alias. If so, that word is replaced by the text of the alias. +The alias name and the replacement text may contain any valid +shell input, including the +.I metacharacters +listed above, with the exception that the alias name may not +contain \fI=\fP. The first word of the replacement text is tested +for aliases, but a word that is identical to an alias being expanded +is not expanded a second time. This means that one may alias +.B ls +to +.BR "ls \-F" , +for instance, and +.B bash +does not try to recursively expand the replacement text. +If the last character of the alias value is a +.IR blank , +then the next command +word following the alias is also checked for alias expansion. +.PP +Aliases are created and listed with the +.B alias +command, and removed with the +.B unalias +command. +.PP +There is no mechanism for using arguments in the replacement text. +If arguments are needed, a shell function should be used (see +.SM +.B FUNCTIONS +below). +.PP +Aliases are not expanded when the shell is not interactive, unless +the +.B expand_aliases +shell option is set using +.B shopt +(see the description of +.B shopt +under +.SM +\fBSHELL BUILTIN COMMANDS\fP +below). +.PP +The rules concerning the definition and use of aliases are +somewhat confusing. +.B Bash +always reads at least one complete line +of input before executing any +of the commands on that line. Aliases are expanded when a +command is read, not when it is executed. Therefore, an +alias definition appearing on the same line as another +command does not take effect until the next line of input is read. +The commands following the alias definition +on that line are not affected by the new alias. +This behavior is also an issue when functions are executed. +Aliases are expanded when a function definition is read, +not when the function is executed, because a function definition +is itself a compound command. As a consequence, aliases +defined in a function are not available until after that +function is executed. To be safe, always put +alias definitions on a separate line, and do not use +.B alias +in compound commands. +.PP +For almost every purpose, aliases are superseded by +shell functions. +.SH FUNCTIONS +A shell function, defined as described above under +.SM +.BR "SHELL GRAMMAR" , +stores a series of commands for later execution. +When the name of a shell function is used as a simple command name, +the list of commands associated with that function name is executed. +Functions are executed in the context of the +current shell; no new process is created to interpret +them (contrast this with the execution of a shell script). +When a function is executed, the arguments to the +function become the positional parameters +during its execution. +The special parameter +.B # +is updated to reflect the change. Positional parameter 0 +is unchanged. +The first element of the +.SM +.B FUNCNAME +variable is set to the name of the function while the function +is executing. +All other aspects of the shell execution +environment are identical between a function and its caller +with the exception that the +.SM +.B DEBUG +trap (see the description of the +.B trap +builtin under +.SM +.B SHELL BUILTIN COMMANDS +below) is not inherited unless the function has been given the +\fBtrace\fP attribute (see the description of the +.SM +.B declare +builtin below) or the +\fB\-o functrace\fP shell option has been enabled with +the \fBset\fP builtin +(in which case all functions inherit the \fBDEBUG\fP trap). +.PP +Variables local to the function may be declared with the +.B local +builtin command. Ordinarily, variables and their values +are shared between the function and its caller. +.PP +If the builtin command +.B return +is executed in a function, the function completes and +execution resumes with the next command after the function +call. +Any command associated with the \fBRETURN\fP trap is executed +before execution resumes. +When a function completes, the values of the +positional parameters and the special parameter +.B # +are restored to the values they had prior to the function's +execution. +.PP +Function names and definitions may be listed with the +.B \-f +option to the +.B declare +or +.B typeset +builtin commands. The +.B \-F +option to +.B declare +or +.B typeset +will list the function names only +(and optionally the source file and line number, if the \fBextdebug\fP +shell option is enabled). +Functions may be exported so that subshells +automatically have them defined with the +.B \-f +option to the +.B export +builtin. +Note that shell functions and variables with the same name may result +in multiple identically-named entries in the environment passed to the +shell's children. +Care should be taken in cases where this may cause a problem. +.PP +Functions may be recursive. No limit is imposed on the number +of recursive calls. +.SH "ARITHMETIC EVALUATION" +The shell allows arithmetic expressions to be evaluated, under +certain circumstances (see the \fBlet\fP and \fBdeclare\fP builtin +commands and \fBArithmetic Expansion\fP). +Evaluation is done in fixed-width integers with no check for overflow, +though division by 0 is trapped and flagged as an error. +The operators and their precedence, associativity, and values +are the same as in the C language. +The following list of operators is grouped into levels of +equal-precedence operators. +The levels are listed in order of decreasing precedence. +.PP +.PD 0 +.TP +.B \fIid\fP++ \fIid\fP\-\- +variable post-increment and post-decrement +.TP +.B ++\fIid\fP \-\-\fIid\fP +variable pre-increment and pre-decrement +.TP +.B \- + +unary minus and plus +.TP +.B ! ~ +logical and bitwise negation +.TP +.B ** +exponentiation +.TP +.B * / % +multiplication, division, remainder +.TP +.B + \- +addition, subtraction +.TP +.B << >> +left and right bitwise shifts +.TP +.B <= >= < > +comparison +.TP +.B == != +equality and inequality +.TP +.B & +bitwise AND +.TP +.B ^ +bitwise exclusive OR +.TP +.B | +bitwise OR +.TP +.B && +logical AND +.TP +.B || +logical OR +.TP +.B \fIexpr\fP?\fIexpr\fP:\fIexpr\fP +conditional operator +.TP +.B = *= /= %= += \-= <<= >>= &= ^= |= +assignment +.TP +.B \fIexpr1\fP , \fIexpr2\fP +comma +.PD +.PP +Shell variables are allowed as operands; parameter expansion is +performed before the expression is evaluated. +Within an expression, shell variables may also be referenced by name +without using the parameter expansion syntax. +A shell variable that is null or unset evaluates to 0 when referenced +by name without using the parameter expansion syntax. +The value of a variable is evaluated as an arithmetic expression +when it is referenced, or when a variable which has been given the +\fIinteger\fP attribute using \fBdeclare -i\fP is assigned a value. +A null value evaluates to 0. +A shell variable need not have its integer attribute +turned on to be used in an expression. +.PP +Constants with a leading 0 are interpreted as octal numbers. +A leading 0x or 0X denotes hexadecimal. +Otherwise, numbers take the form [\fIbase#\fP]n, where \fIbase\fP +is a decimal number between 2 and 64 representing the arithmetic +base, and \fIn\fP is a number in that base. +If \fIbase#\fP is omitted, then base 10 is used. +The digits greater than 9 are represented by the lowercase letters, +the uppercase letters, @, and _, in that order. +If \fIbase\fP is less than or equal to 36, lowercase and uppercase +letters may be used interchangably to represent numbers between 10 +and 35. +.PP +Operators are evaluated in order of precedence. Sub-expressions in +parentheses are evaluated first and may override the precedence +rules above. +.SH "CONDITIONAL EXPRESSIONS" +Conditional expressions are used by the \fB[[\fP compound command and +the \fBtest\fP and \fB[\fP builtin commands to test file attributes +and perform string and arithmetic comparisons. +Expressions are formed from the following unary or binary primaries. +If any \fIfile\fP argument to one of the primaries is of the form +\fI/dev/fd/n\fP, then file descriptor \fIn\fP is checked. +If the \fIfile\fP argument to one of the primaries is one of +\fI/dev/stdin\fP, \fI/dev/stdout\fP, or \fI/dev/stderr\fP, file +descriptor 0, 1, or 2, respectively, is checked. +.sp 1 +.PD 0 +.TP +.B \-a \fIfile\fP +True if \fIfile\fP exists. +.TP +.B \-b \fIfile\fP +True if \fIfile\fP exists and is a block special file. +.TP +.B \-c \fIfile\fP +True if \fIfile\fP exists and is a character special file. +.TP +.B \-d \fIfile\fP +True if \fIfile\fP exists and is a directory. +.TP +.B \-e \fIfile\fP +True if \fIfile\fP exists. +.TP +.B \-f \fIfile\fP +True if \fIfile\fP exists and is a regular file. +.TP +.B \-g \fIfile\fP +True if \fIfile\fP exists and is set-group-id. +.TP +.B \-h \fIfile\fP +True if \fIfile\fP exists and is a symbolic link. +.TP +.B \-k \fIfile\fP +True if \fIfile\fP exists and its ``sticky'' bit is set. +.TP +.B \-p \fIfile\fP +True if \fIfile\fP exists and is a named pipe (FIFO). +.TP +.B \-r \fIfile\fP +True if \fIfile\fP exists and is readable. +.TP +.B \-s \fIfile\fP +True if \fIfile\fP exists and has a size greater than zero. +.TP +.B \-t \fIfd\fP +True if file descriptor +.I fd +is open and refers to a terminal. +.TP +.B \-u \fIfile\fP +True if \fIfile\fP exists and its set-user-id bit is set. +.TP +.B \-w \fIfile\fP +True if \fIfile\fP exists and is writable. +.TP +.B \-x \fIfile\fP +True if \fIfile\fP exists and is executable. +.TP +.B \-O \fIfile\fP +True if \fIfile\fP exists and is owned by the effective user id. +.TP +.B \-G \fIfile\fP +True if \fIfile\fP exists and is owned by the effective group id. +.TP +.B \-L \fIfile\fP +True if \fIfile\fP exists and is a symbolic link. +.TP +.B \-S \fIfile\fP +True if \fIfile\fP exists and is a socket. +.TP +.B \-N \fIfile\fP +True if \fIfile\fP exists and has been modified since it was last read. +.TP +\fIfile1\fP \-\fBnt\fP \fIfile2\fP +True if \fIfile1\fP is newer (according to modification date) than \fIfile2\fP, +or if \fIfile1\fP exists and \fPfile2\fP does not. +.TP +\fIfile1\fP \-\fBot\fP \fIfile2\fP +True if \fIfile1\fP is older than \fIfile2\fP, or if \fIfile2\fP exists +and \fIfile1\fP does not. +.TP +\fIfile1\fP \fB\-ef\fP \fIfile2\fP +True if \fIfile1\fP and \fIfile2\fP refer to the same device and +inode numbers. +.TP +.B \-o \fIoptname\fP +True if shell option +.I optname +is enabled. +See the list of options under the description of the +.B \-o +option to the +.B set +builtin below. +.TP +.B \-z \fIstring\fP +True if the length of \fIstring\fP is zero. +.TP +.B \-n \fIstring\fP +.TP +\fIstring\fP +True if the length of +.I string +is non-zero. +.TP +\fIstring1\fP \fB==\fP \fIstring2\fP +True if the strings are equal. \fB=\fP may be used in place of +\fB==\fP for strict POSIX compliance. +.TP +\fIstring1\fP \fB!=\fP \fIstring2\fP +True if the strings are not equal. +.TP +\fIstring1\fP \fB<\fP \fIstring2\fP +True if \fIstring1\fP sorts before \fIstring2\fP lexicographically +in the current locale. +.TP +\fIstring1\fP \fB>\fP \fIstring2\fP +True if \fIstring1\fP sorts after \fIstring2\fP lexicographically +in the current locale. +.TP +.I \fIarg1\fP \fBOP\fP \fIarg2\fP +.SM +.B OP +is one of +.BR \-eq , +.BR \-ne , +.BR \-lt , +.BR \-le , +.BR \-gt , +or +.BR \-ge . +These arithmetic binary operators return true if \fIarg1\fP +is equal to, not equal to, less than, less than or equal to, +greater than, or greater than or equal to \fIarg2\fP, respectively. +.I Arg1 +and +.I arg2 +may be positive or negative integers. +.PD +.SH "SIMPLE COMMAND EXPANSION" +When a simple command is executed, the shell performs the following +expansions, assignments, and redirections, from left to right. +.IP 1. +The words that the parser has marked as variable assignments (those +preceding the command name) and redirections are saved for later +processing. +.IP 2. +The words that are not variable assignments or redirections are +expanded. If any words remain after expansion, the first word +is taken to be the name of the command and the remaining words are +the arguments. +.IP 3. +Redirections are performed as described above under +.SM +.BR REDIRECTION . +.IP 4. +The text after the \fB=\fP in each variable assignment undergoes tilde +expansion, parameter expansion, command substitution, arithmetic expansion, +and quote removal before being assigned to the variable. +.PP +If no command name results, the variable assignments affect the current +shell environment. Otherwise, the variables are added to the environment +of the executed command and do not affect the current shell environment. +If any of the assignments attempts to assign a value to a readonly variable, +an error occurs, and the command exits with a non-zero status. +.PP +If no command name results, redirections are performed, but do not +affect the current shell environment. A redirection error causes the +command to exit with a non-zero status. +.PP +If there is a command name left after expansion, execution proceeds as +described below. Otherwise, the command exits. If one of the expansions +contained a command substitution, the exit status of the command is +the exit status of the last command substitution performed. If there +were no command substitutions, the command exits with a status of zero. +.SH "COMMAND EXECUTION" +After a command has been split into words, if it results in a +simple command and an optional list of arguments, the following +actions are taken. +.PP +If the command name contains no slashes, the shell attempts to +locate it. If there exists a shell function by that name, that +function is invoked as described above in +.SM +.BR FUNCTIONS . +If the name does not match a function, the shell searches for +it in the list of shell builtins. If a match is found, that +builtin is invoked. +.PP +If the name is neither a shell function nor a builtin, +and contains no slashes, +.B bash +searches each element of the +.SM +.B PATH +for a directory containing an executable file by that name. +.B Bash +uses a hash table to remember the full pathnames of executable +files (see +.B hash +under +.SM +.B "SHELL BUILTIN COMMANDS" +below). +A full search of the directories in +.SM +.B PATH +is performed only if the command is not found in the hash table. +If the search is unsuccessful, the shell prints an error +message and returns an exit status of 127. +.PP +If the search is successful, or if the command name contains +one or more slashes, the shell executes the named program in a +separate execution environment. +Argument 0 is set to the name given, and the remaining arguments +to the command are set to the arguments given, if any. +.PP +If this execution fails because the file is not in executable +format, and the file is not a directory, it is assumed to be +a \fIshell script\fP, a file +containing shell commands. A subshell is spawned to execute +it. This subshell reinitializes itself, so +that the effect is as if a new shell had been invoked +to handle the script, with the exception that the locations of +commands remembered by the parent (see +.B hash +below under +.SM +\fBSHELL BUILTIN COMMANDS\fP) +are retained by the child. +.PP +If the program is a file beginning with +.BR #! , +the remainder of the first line specifies an interpreter +for the program. The shell executes the +specified interpreter on operating systems that do not +handle this executable format themselves. The arguments to the +interpreter consist of a single optional argument following the +interpreter name on the first line of the program, followed +by the name of the program, followed by the command +arguments, if any. +.SH COMMAND EXECUTION ENVIRONMENT +The shell has an \fIexecution environment\fP, which consists of the +following: +.sp 1 +.IP \(bu +open files inherited by the shell at invocation, as modified by +redirections supplied to the \fBexec\fP builtin +.IP \(bu +the current working directory as set by \fBcd\fP, \fBpushd\fP, or +\fBpopd\fP, or inherited by the shell at invocation +.IP \(bu +the file creation mode mask as set by \fBumask\fP or inherited from +the shell's parent +.IP \(bu +current traps set by \fBtrap\fP +.IP \(bu +shell parameters that are set by variable assignment or with \fBset\fP +or inherited from the shell's parent in the environment +.IP \(bu +shell functions defined during execution or inherited from the shell's +parent in the environment +.IP \(bu +options enabled at invocation (either by default or with command-line +arguments) or by \fBset\fP +.IP \(bu +options enabled by \fBshopt\fP +.IP \(bu +shell aliases defined with \fBalias\fP +.IP \(bu +various process IDs, including those of background jobs, the value +of \fB$$\fP, and the value of \fB$PPID\fP +.PP +When a simple command other than a builtin or shell function +is to be executed, it +is invoked in a separate execution environment that consists of +the following. Unless otherwise noted, the values are inherited +from the shell. +.sp 1 +.IP \(bu +the shell's open files, plus any modifications and additions specified +by redirections to the command +.IP \(bu +the current working directory +.IP \(bu +the file creation mode mask +.IP \(bu +shell variables and functions marked for export, along with variables +exported for the command, passed in the environment +.IP \(bu +traps caught by the shell are reset to the values the inherited +from the shell's parent, and traps ignored by the shell are ignored +.PP +A command invoked in this separate environment cannot affect the +shell's execution environment. +.PP +Command substitution and asynchronous commands are invoked in a +subshell environment that is a duplicate of the shell environment, +except that traps caught by the shell are reset to the values +that the shell inherited from its parent at invocation. Builtin +commands that are invoked as part of a pipeline are also executed in a +subshell environment. Changes made to the subshell environment +cannot affect the shell's execution environment. +.PP +If a command is followed by a \fB&\fP and job control is not active, the +default standard input for the command is the empty file \fI/dev/null\fP. +Otherwise, the invoked command inherits the file descriptors of the calling +shell as modified by redirections. +.SH ENVIRONMENT +When a program is invoked it is given an array of strings +called the +.IR environment . +This is a list of +\fIname\fP\-\fIvalue\fP pairs, of the form +.IR "name\fR=\fPvalue" . +.PP +The shell provides several ways to manipulate the environment. +On invocation, the shell scans its own environment and +creates a parameter for each name found, automatically marking +it for +.I export +to child processes. Executed commands inherit the environment. +The +.B export +and +.B declare \-x +commands allow parameters and functions to be added to and +deleted from the environment. If the value of a parameter +in the environment is modified, the new value becomes part +of the environment, replacing the old. The environment +inherited by any executed command consists of the shell's +initial environment, whose values may be modified in the shell, +less any pairs removed by the +.B unset +command, plus any additions via the +.B export +and +.B declare \-x +commands. +.PP +The environment for any +.I simple command +or function may be augmented temporarily by prefixing it with +parameter assignments, as described above in +.SM +.BR PARAMETERS . +These assignment statements affect only the environment seen +by that command. +.PP +If the +.B \-k +option is set (see the +.B set +builtin command below), then +.I all +parameter assignments are placed in the environment for a command, +not just those that precede the command name. +.PP +When +.B bash +invokes an external command, the variable +.B _ +is set to the full file name of the command and passed to that +command in its environment. +.SH "EXIT STATUS" +For the shell's purposes, a command which exits with a +zero exit status has succeeded. An exit status of zero +indicates success. A non-zero exit status indicates failure. +When a command terminates on a fatal signal \fIN\fP, \fBbash\fP uses +the value of 128+\fIN\fP as the exit status. +.PP +If a command is not found, the child process created to +execute it returns a status of 127. If a command is found +but is not executable, the return status is 126. +.PP +If a command fails because of an error during expansion or redirection, +the exit status is greater than zero. +.PP +Shell builtin commands return a status of 0 (\fItrue\fP) if +successful, and non-zero (\fIfalse\fP) if an error occurs +while they execute. +All builtins return an exit status of 2 to indicate incorrect usage. +.PP +\fBBash\fP itself returns the exit status of the last command +executed, unless a syntax error occurs, in which case it exits +with a non-zero value. See also the \fBexit\fP builtin +command below. +.SH SIGNALS +When \fBbash\fP is interactive, in the absence of any traps, it ignores +.SM +.B SIGTERM +(so that \fBkill 0\fP does not kill an interactive shell), +and +.SM +.B SIGINT +is caught and handled (so that the \fBwait\fP builtin is interruptible). +In all cases, \fBbash\fP ignores +.SM +.BR SIGQUIT . +If job control is in effect, +.B bash +ignores +.SM +.BR SIGTTIN , +.SM +.BR SIGTTOU , +and +.SM +.BR SIGTSTP . +.PP +Synchronous jobs started by \fBbash\fP have signal handlers +set to the values inherited by the shell from its parent. +When job control is not in effect, asynchronous commands +ignore +.SM +.B SIGINT +and +.SM +.B SIGQUIT +as well. +Commands run as a result of command substitution ignore the +keyboard-generated job control signals +.SM +.BR SIGTTIN , +.SM +.BR SIGTTOU , +and +.SM +.BR SIGTSTP . +.PP +The shell exits by default upon receipt of a +.SM +.BR SIGHUP . +Before exiting, an interactive shell resends the +.SM +.B SIGHUP +to all jobs, running or stopped. +Stopped jobs are sent +.SM +.B SIGCONT +to ensure that they receive the +.SM +.BR SIGHUP . +To prevent the shell from +sending the signal to a particular job, it should be removed from the +jobs table with the +.B disown +builtin (see +.SM +.B "SHELL BUILTIN COMMANDS" +below) or marked +to not receive +.SM +.B SIGHUP +using +.BR "disown \-h" . +.PP +If the +.B huponexit +shell option has been set with +.BR shopt , +.B bash +sends a +.SM +.B SIGHUP +to all jobs when an interactive login shell exits. +.PP +When \fBbash\fP receives a signal for which a trap has been set while +waiting for a command to complete, the trap will not be executed until +the command completes. +When \fBbash\fP is waiting for an asynchronous command via the \fBwait\fP +builtin, the reception of a signal for which a trap has been set will +cause the \fBwait\fP builtin to return immediately with an exit status +greater than 128, immediately after which the trap is executed. +.SH "JOB CONTROL" +.I Job control +refers to the ability to selectively stop (\fIsuspend\fP) +the execution of processes and continue (\fIresume\fP) +their execution at a later point. A user typically employs +this facility via an interactive interface supplied jointly +by the system's terminal driver and +.BR bash . +.PP +The shell associates a +.I job +with each pipeline. It keeps a table of currently executing +jobs, which may be listed with the +.B jobs +command. When +.B bash +starts a job asynchronously (in the +.IR background ), +it prints a line that looks like: +.RS +.PP +[1] 25647 +.RE +.PP +indicating that this job is job number 1 and that the process ID +of the last process in the pipeline associated with this job is 25647. +All of the processes in a single pipeline are members of the same job. +.B Bash +uses the +.I job +abstraction as the basis for job control. +.PP +To facilitate the implementation of the user interface to job +control, the operating system maintains the notion of a \fIcurrent terminal +process group ID\fP. Members of this process group (processes whose +process group ID is equal to the current terminal process group ID) +receive keyboard-generated signals such as +.SM +.BR SIGINT . +These processes are said to be in the +.IR foreground . +.I Background +processes are those whose process group ID differs from the terminal's; +such processes are immune to keyboard-generated signals. +Only foreground processes are allowed to read from or write to the +terminal. Background processes which attempt to read from (write to) the +terminal are sent a +.SM +.B SIGTTIN (SIGTTOU) +signal by the terminal driver, +which, unless caught, suspends the process. +.PP +If the operating system on which +.B bash +is running supports +job control, +.B bash +contains facilities to use it. +Typing the +.I suspend +character (typically +.BR ^Z , +Control-Z) while a process is running +causes that process to be stopped and returns control to +.BR bash . +Typing the +.I "delayed suspend" +character (typically +.BR ^Y , +Control-Y) causes the process to be stopped when it +attempts to read input from the terminal, and control to +be returned to +.BR bash . +The user may then manipulate the state of this job, using the +.B bg +command to continue it in the background, the +.B fg +command to continue it in the foreground, or +the +.B kill +command to kill it. A \fB^Z\fP takes effect immediately, +and has the additional side effect of causing pending output +and typeahead to be discarded. +.PP +There are a number of ways to refer to a job in the shell. +The character +.B % +introduces a job name. Job number +.I n +may be referred to as +.BR %n . +A job may also be referred to using a prefix of the name used to +start it, or using a substring that appears in its command line. +For example, +.B %ce +refers to a stopped +.B ce +job. If a prefix matches more than one job, +.B bash +reports an error. Using +.BR %?ce , +on the other hand, refers to any job containing the string +.B ce +in its command line. If the substring matches more than one job, +.B bash +reports an error. The symbols +.B %% +and +.B %+ +refer to the shell's notion of the +.IR "current job" , +which is the last job stopped while it was in +the foreground or started in the background. +The +.I "previous job" +may be referenced using +.BR %\- . +In output pertaining to jobs (e.g., the output of the +.B jobs +command), the current job is always flagged with a +.BR + , +and the previous job with a +.BR \- . +.PP +Simply naming a job can be used to bring it into the +foreground: +.B %1 +is a synonym for +\fB``fg %1''\fP, +bringing job 1 from the background into the foreground. +Similarly, +.B ``%1 &'' +resumes job 1 in the background, equivalent to +\fB``bg %1''\fP. +.PP +The shell learns immediately whenever a job changes state. +Normally, +.B bash +waits until it is about to print a prompt before reporting +changes in a job's status so as to not interrupt +any other output. If the +.B \-b +option to the +.B set +builtin command +is enabled, +.B bash +reports such changes immediately. +Any trap on +.SM +.B SIGCHLD +is executed for each child that exits. +.PP +If an attempt to exit +.B bash +is made while jobs are stopped, the shell prints a warning message. The +.B jobs +command may then be used to inspect their status. +If a second attempt to exit is made without an intervening command, +the shell does not print another warning, and the stopped +jobs are terminated. +.SH PROMPTING +When executing interactively, +.B bash +displays the primary prompt +.SM +.B PS1 +when it is ready to read a command, and the secondary prompt +.SM +.B PS2 +when it needs more input to complete a command. +.B Bash +allows these prompt strings to be customized by inserting a number of +backslash-escaped special characters that are decoded as follows: +.RS +.PD 0 +.TP +.B \ea +an ASCII bell character (07) +.TP +.B \ed +the date in "Weekday Month Date" format (e.g., "Tue May 26") +.TP +.B \eD{\fIformat\fP} +the \fIformat\fP is passed to \fIstrftime\fP(3) and the result is inserted +into the prompt string; an empty \fIformat\fP results in a locale-specific +time representation. The braces are required +.TP +.B \ee +an ASCII escape character (033) +.TP +.B \eh +the hostname up to the first `.' +.TP +.B \eH +the hostname +.TP +.B \ej +the number of jobs currently managed by the shell +.TP +.B \el +the basename of the shell's terminal device name +.TP +.B \en +newline +.TP +.B \er +carriage return +.TP +.B \es +the name of the shell, the basename of +.B $0 +(the portion following the final slash) +.TP +.B \et +the current time in 24-hour HH:MM:SS format +.TP +.B \eT +the current time in 12-hour HH:MM:SS format +.TP +.B \e@ +the current time in 12-hour am/pm format +.TP +.B \eA +the current time in 24-hour HH:MM format +.TP +.B \eu +the username of the current user +.TP +.B \ev +the version of \fBbash\fP (e.g., 2.00) +.TP +.B \eV +the release of \fBbash\fP, version + patchelvel (e.g., 2.00.0) +.TP +.B \ew +the current working directory +.TP +.B \eW +the basename of the current working directory +.TP +.B \e! +the history number of this command +.TP +.B \e# +the command number of this command +.TP +.B \e$ +if the effective UID is 0, a +.BR # , +otherwise a +.B $ +.TP +.B \e\fInnn\fP +the character corresponding to the octal number \fInnn\fP +.TP +.B \e\e +a backslash +.TP +.B \e[ +begin a sequence of non-printing characters, which could be used to +embed a terminal control sequence into the prompt +.TP +.B \e] +end a sequence of non-printing characters +.PD +.RE +.PP +The command number and the history number are usually different: +the history number of a command is its position in the history +list, which may include commands restored from the history file +(see +.SM +.B HISTORY +below), while the command number is the position in the sequence +of commands executed during the current shell session. +After the string is decoded, it is expanded via +parameter expansion, command substitution, arithmetic +expansion, and quote removal, subject to the value of the +.B promptvars +shell option (see the description of the +.B shopt +command under +.SM +.B "SHELL BUILTIN COMMANDS" +below). +.SH READLINE +This is the library that handles reading input when using an interactive +shell, unless the +.B \-\-noediting +option is given at shell invocation. +By default, the line editing commands are similar to those of emacs. +A vi-style line editing interface is also available. +To turn off line editing after the shell is running, use the +.B +o emacs +or +.B +o vi +options to the +.B set +builtin (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.SS "Readline Notation" +.PP +In this section, the emacs-style notation is used to denote +keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n +means Control\-N. Similarly, +.I meta +keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X. (On keyboards +without a +.I meta +key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key +then the +.I x +key. This makes ESC the \fImeta prefix\fP. +The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP, +or press the Escape key +then hold the Control key while pressing the +.I x +key.) +.PP +Readline commands may be given numeric +.IR arguments , +which normally act as a repeat count. +Sometimes, however, it is the sign of the argument that is significant. +Passing a negative argument to a command that acts in the forward +direction (e.g., \fBkill\-line\fP) causes that command to act in a +backward direction. +Commands whose behavior with arguments deviates from this are noted +below. +.PP +When a command is described as \fIkilling\fP text, the text +deleted is saved for possible future retrieval +(\fIyanking\fP). The killed text is saved in a +\fIkill ring\fP. Consecutive kills cause the text to be +accumulated into one unit, which can be yanked all at once. +Commands which do not kill text separate the chunks of text +on the kill ring. +.SS "Readline Initialization" +.PP +Readline is customized by putting commands in an initialization +file (the \fIinputrc\fP file). +The name of this file is taken from the value of the +.SM +.B INPUTRC +variable. If that variable is unset, the default is +.IR ~/.inputrc . +When a program which uses the readline library starts up, the +initialization file is read, and the key bindings and variables +are set. +There are only a few basic constructs allowed in the +readline initialization file. +Blank lines are ignored. +Lines beginning with a \fB#\fP are comments. +Lines beginning with a \fB$\fP indicate conditional constructs. +Other lines denote key bindings and variable settings. +.PP +The default key-bindings may be changed with an +.I inputrc +file. +Other programs that use this library may add their own commands +and bindings. +.PP +For example, placing +.RS +.PP +M\-Control\-u: universal\-argument +.RE +or +.RS +C\-Meta\-u: universal\-argument +.RE +into the +.I inputrc +would make M\-C\-u execute the readline command +.IR universal\-argument . +.PP +The following symbolic character names are recognized: +.IR RUBOUT , +.IR DEL , +.IR ESC , +.IR LFD , +.IR NEWLINE , +.IR RET , +.IR RETURN , +.IR SPC , +.IR SPACE , +and +.IR TAB . +.PP +In addition to command names, readline allows keys to be bound +to a string that is inserted when the key is pressed (a \fImacro\fP). +.SS "Readline Key Bindings" +.PP +The syntax for controlling key bindings in the +.I inputrc +file is simple. All that is required is the name of the +command or the text of a macro and a key sequence to which +it should be bound. The name may be specified in one of two ways: +as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP +prefixes, or as a key sequence. +.PP +When using the form \fBkeyname\fP:\^\fIfunction\-name\fP or \fImacro\fP, +.I keyname +is the name of a key spelled out in English. For example: +.sp +.RS +Control-u: universal\-argument +.br +Meta-Rubout: backward-kill-word +.br +Control-o: "> output" +.RE +.LP +In the above example, +.I C\-u +is bound to the function +.BR universal\-argument , +.I M\-DEL +is bound to the function +.BR backward\-kill\-word , +and +.I C\-o +is bound to run the macro +expressed on the right hand side (that is, to insert the text +.if t \f(CW> output\fP +.if n ``> output'' +into the line). +.PP +In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP, +.B keyseq +differs from +.B keyname +above in that strings denoting +an entire key sequence may be specified by placing the sequence +within double quotes. Some GNU Emacs style key escapes can be +used, as in the following example, but the symbolic character names +are not recognized. +.sp +.RS +"\eC\-u": universal\-argument +.br +"\eC\-x\eC\-r": re\-read\-init\-file +.br +"\ee[11~": "Function Key 1" +.RE +.PP +In this example, +.I C\-u +is again bound to the function +.BR universal\-argument . +.I "C\-x C\-r" +is bound to the function +.BR re\-read\-init\-file , +and +.I "ESC [ 1 1 ~" +is bound to insert the text +.if t \f(CWFunction Key 1\fP. +.if n ``Function Key 1''. +.PP +The full set of GNU Emacs style escape sequences is +.RS +.PD 0 +.TP +.B \eC\- +control prefix +.TP +.B \eM\- +meta prefix +.TP +.B \ee +an escape character +.TP +.B \e\e +backslash +.TP +.B \e" +literal " +.TP +.B \e' +literal ' +.RE +.PD +.PP +In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: +.RS +.PD 0 +.TP +.B \ea +alert (bell) +.TP +.B \eb +backspace +.TP +.B \ed +delete +.TP +.B \ef +form feed +.TP +.B \en +newline +.TP +.B \er +carriage return +.TP +.B \et +horizontal tab +.TP +.B \ev +vertical tab +.TP +.B \e\fInnn\fP +the eight-bit character whose value is the octal value \fInnn\fP +(one to three digits) +.TP +.B \ex\fIHH\fP +the eight-bit character whose value is the hexadecimal value \fIHH\fP +(one or two hex digits) +.RE +.PD +.PP +When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including " and '. +.PP +.B Bash +allows the current readline key bindings to be displayed or modified +with the +.B bind +builtin command. The editing mode may be switched during interactive +use by using the +.B \-o +option to the +.B set +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). +.SS "Readline Variables" +.PP +Readline has variables that can be used to further customize its +behavior. A variable may be set in the +.I inputrc +file with a statement of the form +.RS +.PP +\fBset\fP \fIvariable\-name\fP \fIvalue\fP +.RE +.PP +Except where noted, readline variables can take the values +.B On +or +.BR Off . +The variables and their default values are: +.PP +.PD 0 +.TP +.B bell\-style (audible) +Controls what happens when readline wants to ring the terminal bell. +If set to \fBnone\fP, readline never rings the bell. If set to +\fBvisible\fP, readline uses a visible bell if one is available. +If set to \fBaudible\fP, readline attempts to ring the terminal's bell. +.TP +.B comment\-begin (``#'') +The string that is inserted when the readline +.B insert\-comment +command is executed. +This command is bound to +.B M\-# +in emacs mode and to +.B # +in vi command mode. +.TP +.B completion\-ignore\-case (Off) +If set to \fBOn\fP, readline performs filename matching and completion +in a case\-insensitive fashion. +.TP +.B completion\-query\-items (100) +This determines when the user is queried about viewing +the number of possible completions +generated by the \fBpossible\-completions\fP command. +It may be set to any integer value greater than or equal to +zero. If the number of possible completions is greater than +or equal to the value of this variable, the user is asked whether +or not he wishes to view them; otherwise they are simply listed +on the terminal. +.TP +.B convert\-meta (On) +If set to \fBOn\fP, readline will convert characters with the +eighth bit set to an ASCII key sequence +by stripping the eighth bit and prefixing an +escape character (in effect, using escape as the \fImeta prefix\fP). +.TP +.B disable\-completion (Off) +If set to \fBOn\fP, readline will inhibit word completion. Completion +characters will be inserted into the line as if they had been +mapped to \fBself-insert\fP. +.TP +.B editing\-mode (emacs) +Controls whether readline begins with a set of key bindings similar +to \fIemacs\fP or \fIvi\fP. +.B editing\-mode +can be set to either +.B emacs +or +.BR vi . +.TP +.B enable\-keypad (Off) +When set to \fBOn\fP, readline will try to enable the application +keypad when it is called. Some systems need this to enable the +arrow keys. +.TP +.B expand\-tilde (Off) +If set to \fBon\fP, tilde expansion is performed when readline +attempts word completion. +.TP +.B history-preserve-point +If set to \fBon\fP, the history code attempts to place point at the +same location on each history line retrived with \fBprevious-history\fP +or \fBnext-history\fP. +.TP +.B horizontal\-scroll\-mode (Off) +When set to \fBOn\fP, makes readline use a single line for display, +scrolling the input horizontally on a single screen line when it +becomes longer than the screen width rather than wrapping to a new line. +.TP +.B input\-meta (Off) +If set to \fBOn\fP, readline will enable eight-bit input (that is, +it will not strip the high bit from the characters it reads), +regardless of what the terminal claims it can support. The name +.B meta\-flag +is a synonym for this variable. +.TP +.B isearch\-terminators (``C\-[C\-J'') +The string of characters that should terminate an incremental +search without subsequently executing the character as a command. +If this variable has not been given a value, the characters +\fIESC\fP and \fIC\-J\fP will terminate an incremental search. +.TP +.B keymap (emacs) +Set the current readline keymap. The set of valid keymap names is +\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi, +vi\-command\fP, and +.IR vi\-insert . +\fIvi\fP is equivalent to \fIvi\-command\fP; \fIemacs\fP is +equivalent to \fIemacs\-standard\fP. The default value is +.IR emacs ; +the value of +.B editing\-mode +also affects the default keymap. +.TP +.B mark\-directories (On) +If set to \fBOn\fP, completed directory names have a slash +appended. +.TP +.B mark\-modified\-lines (Off) +If set to \fBOn\fP, history lines that have been modified are displayed +with a preceding asterisk (\fB*\fP). +.TP +.B mark\-symlinked\-directories (Off) +If set to \fBOn\fP, completed names which are symbolic links to directories +have a slash appended (subject to the value of +\fBmark\-directories\fP). +.TP +.B match\-hidden\-files (On) +This variable, when set to \fBOn\fP, causes readline to match files whose +names begin with a `.' (hidden files) when performing filename +completion, unless the leading `.' is +supplied by the user in the filename to be completed. +.TP +.B output\-meta (Off) +If set to \fBOn\fP, readline will display characters with the +eighth bit set directly rather than as a meta-prefixed escape +sequence. +.TP +.B page\-completions (On) +If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager +to display a screenful of possible completions at a time. +.TP +.B print\-completions\-horizontally (Off) +If set to \fBOn\fP, readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +.TP +.B show\-all\-if\-ambiguous (Off) +This alters the default behavior of the completion functions. If +set to +.BR on , +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +.TP +.B visible\-stats (Off) +If set to \fBOn\fP, a character denoting a file's type as reported +by \fIstat\fP(2) is appended to the filename when listing possible +completions. +.PD +.SS "Readline Conditional Constructs" +.PP +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. +.IP \fB$if\fP +The +.B $if +construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +readline. The text of the test extends to the end of the line; +no characters are required to isolate it. +.RS +.IP \fBmode\fP +The \fBmode=\fP form of the \fB$if\fP directive is used to test +whether readline is in emacs or vi mode. +This may be used in conjunction +with the \fBset keymap\fP command, for instance, to set bindings in +the \fIemacs\-standard\fP and \fIemacs\-ctlx\fP keymaps only if +readline is starting out in emacs mode. +.IP \fBterm\fP +The \fBterm=\fP form may be used to include terminal-specific +key bindings, perhaps to bind the key sequences output by the +terminal's function keys. The word on the right side of the +.B = +is tested against the both full name of the terminal and the portion +of the terminal name before the first \fB\-\fP. This allows +.I sun +to match both +.I sun +and +.IR sun\-cmd , +for instance. +.IP \fBapplication\fP +The \fBapplication\fP construct is used to include +application-specific settings. Each program using the readline +library sets the \fIapplication name\fP, and an initialization +file can test for a particular value. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: +.sp 1 +.RS +.nf +\fB$if\fP Bash +# Quote the current or previous word +"\eC\-xq": "\eeb\e"\eef\e"" +\fB$endif\fP +.fi +.RE +.RE +.IP \fB$endif\fP +This command, as seen in the previous example, terminates an +\fB$if\fP command. +.IP \fB$else\fP +Commands in this branch of the \fB$if\fP directive are executed if +the test fails. +.IP \fB$include\fP +This directive takes a single filename as an argument and reads commands +and bindings from that file. For example, the following directive +would read \fI/etc/inputrc\fP: +.sp 1 +.RS +.nf +\fB$include\fP \^ \fI/etc/inputrc\fP +.fi +.RE +.SS Searching +.PP +Readline provides commands for searching through the command history +(see +.SM +.B HISTORY +below) for lines containing a specified string. +There are two search modes: +.I incremental +and +.IR non-incremental . +.PP +Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +The characters present in the value of the \fBisearch-terminators\fP +variable are used to terminate an incremental search. +If that variable has not been assigned a value the Escape and +Control-J characters will terminate an incremental search. +Control-G will abort an incremental search and restore the original +line. +When the search is terminated, the history entry containing the +search string becomes the current line. +.PP +To find other matching entries in the history list, type Control-S or +Control-R as appropriate. +This will search backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a readline command will terminate +the search and execute that command. +For instance, a \fInewline\fP will terminate the search and accept +the line, thereby executing the command from the history list. +.PP +Readline remembers the last incremental search string. If two +Control-Rs are typed without any intervening characters defining a +new search string, any remembered search string is used. +.PP +Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. +.SS "Readline Command Names" +.PP +The following is a list of the names of the commands and the default +key sequences to which they are bound. +Command names without an accompanying key sequence are unbound by default. +In the following descriptions, \fIpoint\fP refers to the current cursor +position, and \fImark\fP refers to a cursor position saved by the +\fBset\-mark\fP command. +The text between the point and mark is referred to as the \fIregion\fP. +.SS Commands for Moving +.PP +.PD 0 +.TP +.B beginning\-of\-line (C\-a) +Move to the start of the current line. +.TP +.B end\-of\-line (C\-e) +Move to the end of the line. +.TP +.B forward\-char (C\-f) +Move forward a character. +.TP +.B backward\-char (C\-b) +Move back a character. +.TP +.B forward\-word (M\-f) +Move forward to the end of the next word. Words are composed of +alphanumeric characters (letters and digits). +.TP +.B backward\-word (M\-b) +Move back to the start of the current or previous word. Words are +composed of alphanumeric characters (letters and digits). +.TP +.B clear\-screen (C\-l) +Clear the screen leaving the current line at the top of the screen. +With an argument, refresh the current line without clearing the +screen. +.TP +.B redraw\-current\-line +Refresh the current line. +.PD +.SS Commands for Manipulating the History +.PP +.PD 0 +.TP +.B accept\-line (Newline, Return) +Accept the line regardless of where the cursor is. If this line is +non-empty, add it to the history list according to the state of the +.SM +.B HISTCONTROL +variable. If the line is a modified history +line, then restore the history line to its original state. +.TP +.B previous\-history (C\-p) +Fetch the previous command from the history list, moving back in +the list. +.TP +.B next\-history (C\-n) +Fetch the next command from the history list, moving forward in the +list. +.TP +.B beginning\-of\-history (M\-<) +Move to the first line in the history. +.TP +.B end\-of\-history (M\->) +Move to the end of the input history, i.e., the line currently being +entered. +.TP +.B reverse\-search\-history (C\-r) +Search backward starting at the current line and moving `up' through +the history as necessary. This is an incremental search. +.TP +.B forward\-search\-history (C\-s) +Search forward starting at the current line and moving `down' through +the history as necessary. This is an incremental search. +.TP +.B non\-incremental\-reverse\-search\-history (M\-p) +Search backward through the history starting at the current line +using a non-incremental search for a string supplied by the user. +.TP +.B non\-incremental\-forward\-search\-history (M\-n) +Search forward through the history using a non-incremental search for +a string supplied by the user. +.TP +.B history\-search\-forward +Search forward through the history for the string of characters +between the start of the current line and the point. +This is a non-incremental search. +.TP +.B history\-search\-backward +Search backward through the history for the string of characters +between the start of the current line and the point. +This is a non-incremental search. +.TP +.B yank\-nth\-arg (M\-C\-y) +Insert the first argument to the previous command (usually +the second word on the previous line) at point. +With an argument +.IR n , +insert the \fIn\fPth word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the \fIn\fPth word from the end of the previous command. +.TP +.B +yank\-last\-arg (M\-.\^, M\-_\^) +Insert the last argument to the previous command (the last word of +the previous history entry). With an argument, +behave exactly like \fByank\-nth\-arg\fP. +Successive calls to \fByank\-last\-arg\fP move back through the history +list, inserting the last argument of each line in turn. +.TP +.B shell\-expand\-line (M\-C\-e) +Expand the line as the shell does. This +performs alias and history expansion as well as all of the shell +word expansions. See +.SM +.B HISTORY EXPANSION +below for a description of history expansion. +.TP +.B history\-expand\-line (M\-^) +Perform history expansion on the current line. +See +.SM +.B HISTORY EXPANSION +below for a description of history expansion. +.TP +.B magic\-space +Perform history expansion on the current line and insert a space. +See +.SM +.B HISTORY EXPANSION +below for a description of history expansion. +.TP +.B alias\-expand\-line +Perform alias expansion on the current line. +See +.SM +.B ALIASES +above for a description of alias expansion. +.TP +.B history\-and\-alias\-expand\-line +Perform history and alias expansion on the current line. +.TP +.B insert\-last\-argument (M\-.\^, M\-_\^) +A synonym for \fByank\-last\-arg\fP. +.TP +.B operate\-and\-get\-next (C\-o) +Accept the current line for execution and fetch the next line +relative to the current line from the history for editing. Any +argument is ignored. +.TP +.B edit\-and\-execute\-command (C\-xC\-e) +Invoke an editor on the current command line, and execute the result as shell +commands. +\fBBash\fP attempts to invoke +.SM +.BR $FCEDIT , +.SM +.BR $EDITOR , +and \fIemacs\fP as the editor, in that order. +.PD +.SS Commands for Changing Text +.PP +.PD 0 +.TP +.B delete\-char (C\-d) +Delete the character at point. If point is at the +beginning of the line, there are no characters in the line, and +the last character typed was not bound to \fBdelete\-char\fP, +then return +.SM +.BR EOF . +.TP +.B backward\-delete\-char (Rubout) +Delete the character behind the cursor. When given a numeric argument, +save the deleted text on the kill ring. +.TP +.B forward\-backward\-delete\-char +Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. +.TP +.B quoted\-insert (C\-q, C\-v) +Add the next character typed to the line verbatim. This is +how to insert characters like \fBC\-q\fP, for example. +.TP +.B tab\-insert (C\-v TAB) +Insert a tab character. +.TP +.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...) +Insert the character typed. +.TP +.B transpose\-chars (C\-t) +Drag the character before point forward over the character at point, +moving point forward as well. +If point is at the end of the line, then this transposes +the two characters before point. +Negative arguments have no effect. +.TP +.B transpose\-words (M\-t) +Drag the word before point past the word after point, +moving point over that word as well. +If point is at the end of the line, this transposes +the last two words on the line. +.TP +.B upcase\-word (M\-u) +Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move point. +.TP +.B downcase\-word (M\-l) +Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move point. +.TP +.B capitalize\-word (M\-c) +Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move point. +.TP +.B overwrite\-mode +Toggle overwrite mode. With an explicit positive numeric argument, +switches to overwrite mode. With an explicit non-positive numeric +argument, switches to insert mode. This command affects only +\fBemacs\fP mode; \fBvi\fP mode does overwrite differently. +Each call to \fIreadline()\fP starts in insert mode. +In overwrite mode, characters bound to \fBself\-insert\fP replace +the text at point rather than pushing the text to the right. +Characters bound to \fBbackward\-delete\-char\fP replace the character +before point with a space. By default, this command is unbound. +.PD +.SS Killing and Yanking +.PP +.PD 0 +.TP +.B kill\-line (C\-k) +Kill the text from point to the end of the line. +.TP +.B backward\-kill\-line (C\-x Rubout) +Kill backward to the beginning of the line. +.TP +.B unix\-line\-discard (C\-u) +Kill backward from point to the beginning of the line. +The killed text is saved on the kill-ring. +.\" There is no real difference between this and backward-kill-line +.TP +.B kill\-whole\-line +Kill all characters on the current line, no matter where point is. +.TP +.B kill\-word (M\-d) +Kill from point to the end of the current word, or if between +words, to the end of the next word. +Word boundaries are the same as those used by \fBforward\-word\fP. +.TP +.B backward\-kill\-word (M\-Rubout) +Kill the word behind point. +Word boundaries are the same as those used by \fBbackward\-word\fP. +.TP +.B unix\-word\-rubout (C\-w) +Kill the word behind point, using white space as a word boundary. +The killed text is saved on the kill-ring. +.TP +.B delete\-horizontal\-space (M\-\e) +Delete all spaces and tabs around point. +.TP +.B kill\-region +Kill the text in the current region. +.TP +.B copy\-region\-as\-kill +Copy the text in the region to the kill buffer. +.TP +.B copy\-backward\-word +Copy the word before point to the kill buffer. +The word boundaries are the same as \fBbackward\-word\fP. +.TP +.B copy\-forward\-word +Copy the word following point to the kill buffer. +The word boundaries are the same as \fBforward\-word\fP. +.TP +.B yank (C\-y) +Yank the top of the kill ring into the buffer at point. +.TP +.B yank\-pop (M\-y) +Rotate the kill ring, and yank the new top. Only works following +.B yank +or +.BR yank\-pop . +.PD +.SS Numeric Arguments +.PP +.PD 0 +.TP +.B digit\-argument (M\-0, M\-1, ..., M\-\-) +Add this digit to the argument already accumulating, or start a new +argument. M\-\- starts a negative argument. +.TP +.B universal\-argument +This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing +.B universal\-argument +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit or minus sign, the argument count +for the next command is multiplied by four. +The argument count is initially one, so executing this function the +first time makes the argument count four, a second time makes the +argument count sixteen, and so on. +.PD +.SS Completing +.PP +.PD 0 +.TP +.B complete (TAB) +Attempt to perform completion on the text before point. +.B Bash +attempts completion treating the text as a variable (if the +text begins with \fB$\fP), username (if the text begins with +\fB~\fP), hostname (if the text begins with \fB@\fP), or +command (including aliases and functions) in turn. If none +of these produces a match, filename completion is attempted. +.TP +.B possible\-completions (M\-?) +List the possible completions of the text before point. +.TP +.B insert\-completions (M\-*) +Insert all completions of the text before point +that would have been generated by +\fBpossible\-completions\fP. +.TP +.B menu\-complete +Similar to \fBcomplete\fP, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of \fBmenu\-complete\fP steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung +(subject to the setting of \fBbell\-style\fP) +and the original text is restored. +An argument of \fIn\fP moves \fIn\fP positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to \fBTAB\fP, but is unbound +by default. +.TP +.B delete\-char\-or\-list +Deletes the character under the cursor if not at the beginning or +end of the line (like \fBdelete\-char\fP). +If at the end of the line, behaves identically to +\fBpossible\-completions\fP. +This command is unbound by default. +.TP +.B complete\-filename (M\-/) +Attempt filename completion on the text before point. +.TP +.B possible\-filename\-completions (C\-x /) +List the possible completions of the text before point, +treating it as a filename. +.TP +.B complete\-username (M\-~) +Attempt completion on the text before point, treating +it as a username. +.TP +.B possible\-username\-completions (C\-x ~) +List the possible completions of the text before point, +treating it as a username. +.TP +.B complete\-variable (M\-$) +Attempt completion on the text before point, treating +it as a shell variable. +.TP +.B possible\-variable\-completions (C\-x $) +List the possible completions of the text before point, +treating it as a shell variable. +.TP +.B complete\-hostname (M\-@) +Attempt completion on the text before point, treating +it as a hostname. +.TP +.B possible\-hostname\-completions (C\-x @) +List the possible completions of the text before point, +treating it as a hostname. +.TP +.B complete\-command (M\-!) +Attempt completion on the text before point, treating +it as a command name. Command completion attempts to +match the text against aliases, reserved words, shell +functions, shell builtins, and finally executable filenames, +in that order. +.TP +.B possible\-command\-completions (C\-x !) +List the possible completions of the text before point, +treating it as a command name. +.TP +.B dynamic\-complete\-history (M\-TAB) +Attempt completion on the text before point, comparing +the text against lines from the history list for possible +completion matches. +.TP +.B complete\-into\-braces (M\-{) +Perform filename completion and insert the list of possible completions +enclosed within braces so the list is available to the shell (see +.B Brace Expansion +above). +.PD +.SS Keyboard Macros +.PP +.PD 0 +.TP +.B start\-kbd\-macro (C\-x (\^) +Begin saving the characters typed into the current keyboard macro. +.TP +.B end\-kbd\-macro (C\-x )\^) +Stop saving the characters typed into the current keyboard macro +and store the definition. +.TP +.B call\-last\-kbd\-macro (C\-x e) +Re-execute the last keyboard macro defined, by making the characters +in the macro appear as if typed at the keyboard. +.PD +.SS Miscellaneous +.PP +.PD 0 +.TP +.B re\-read\-init\-file (C\-x C\-r) +Read in the contents of the \fIinputrc\fP file, and incorporate +any bindings or variable assignments found there. +.TP +.B abort (C\-g) +Abort the current editing command and +ring the terminal's bell (subject to the setting of +.BR bell\-style ). +.TP +.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...) +If the metafied character \fIx\fP is lowercase, run the command +that is bound to the corresponding uppercase character. +.TP +.B prefix\-meta (ESC) +Metafy the next character typed. +.SM +.B ESC +.B f +is equivalent to +.BR Meta\-f . +.TP +.B undo (C\-_, C\-x C\-u) +Incremental undo, separately remembered for each line. +.TP +.B revert\-line (M\-r) +Undo all changes made to this line. This is like executing the +.B undo +command enough times to return the line to its initial state. +.TP +.B tilde\-expand (M\-&) +Perform tilde expansion on the current word. +.TP +.B set\-mark (C\-@, M\-) +Set the mark to the point. If a +numeric argument is supplied, the mark is set to that position. +.TP +.B exchange\-point\-and\-mark (C\-x C\-x) +Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. +.TP +.B character\-search (C\-]) +A character is read and point is moved to the next occurrence of that +character. A negative count searches for previous occurrences. +.TP +.B character\-search\-backward (M\-C\-]) +A character is read and point is moved to the previous occurrence of that +character. A negative count searches for subsequent occurrences. +.TP +.B insert\-comment (M\-#) +Without a numeric argument, the value of the readline +.B comment\-begin +variable is inserted at the beginning of the current line. +If a numeric argument is supplied, this command acts as a toggle: if +the characters at the beginning of the line do not match the value +of \fBcomment\-begin\fP, the value is inserted, otherwise +the characters in \fBcomment-begin\fP are deleted from the beginning of +the line. +In either case, the line is accepted as if a newline had been typed. +The default value of +\fBcomment\-begin\fP causes this command to make the current line +a shell comment. +If a numeric argument causes the comment character to be removed, the line +will be executed by the shell. +.TP +.B glob\-complete\-word (M\-g) +The word before point is treated as a pattern for pathname expansion, +with an asterisk implicitly appended. This pattern is used to +generate a list of matching file names for possible completions. +.TP +.B glob\-expand\-word (C\-x *) +The word before point is treated as a pattern for pathname expansion, +and the list of matching file names is inserted, replacing the word. +If a numeric argument is supplied, an asterisk is appended before +pathname expansion. +.TP +.B glob\-list\-expansions (C\-x g) +The list of expansions that would have been generated by +.B glob\-expand\-word +is displayed, and the line is redrawn. +If a numeric argument is supplied, an asterisk is appended before +pathname expansion. +.TP +.B dump\-functions +Print all of the functions and their key bindings to the +readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B dump\-variables +Print all of the settable readline variables and their values to the +readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B dump\-macros +Print all of the readline key sequences bound to macros and the +strings they ouput. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an \fIinputrc\fP file. +.TP +.B display\-shell\-version (C\-x C\-v) +Display version information about the current instance of +.BR bash . +.PD +.SS Programmable Completion +.PP +When word completion is attempted for an argument to a command for +which a completion specification (a \fIcompspec\fP) has been defined +using the \fBcomplete\fP builtin (see +.SM +.B "SHELL BUILTIN COMMANDS" +below), the programmable completion facilities are invoked. +.PP +First, the command name is identified. +If a compspec has been defined for that command, the +compspec is used to generate the list of possible completions for the word. +If the command word is a full pathname, a compspec for the full +pathname is searched for first. +If no compspec is found for the full pathname, an attempt is made to +find a compspec for the portion following the final slash. +.PP +Once a compspec has been found, it is used to generate the list of +matching words. +If a compspec is not found, the default \fBbash\fP completion as +described above under \fBCompleting\fP is performed. +.PP +First, the actions specified by the compspec are used. +Only matches which are prefixed by the word being completed are +returned. +When the +.B \-f +or +.B \-d +option is used for filename or directory name completion, the shell +variable +.SM +.B FIGNORE +is used to filter the matches. +.PP +Any completions specified by a filename expansion pattern to the +\fB\-G\fP option are generated next. +The words generated by the pattern need not match the word +being completed. +The +.SM +.B GLOBIGNORE +shell variable is not used to filter the matches, but the +.SM +.B FIGNORE +variable is used. +.PP +Next, the string specified as the argument to the \fB\-W\fP option +is considered. +The string is first split using the characters in the +.SM +.B IFS +special variable as delimiters. +Shell quoting is honored. +Each word is then expanded using +brace expansion, tilde expansion, parameter and variable expansion, +command substitution, arithmetic expansion, and pathname expansion, +as described above under +.SM +.BR EXPANSION . +The results are split using the rules described above under +\fBWord Splitting\fP. +The results of the expansion are prefix-matched against the word being +completed, and the matching words become the possible completions. +.PP +After these matches have been generated, any shell function or command +specified with the \fB\-F\fP and \fB\-C\fP options is invoked. +When the command or function is invoked, the +.SM +.B COMP_LINE +and +.SM +.B COMP_POINT +variables are assigned values as described above under +\fBShell Variables\fP. +If a shell function is being invoked, the +.SM +.B COMP_WORDS +and +.SM +.B COMP_CWORD +variables are also set. +When the function or command is invoked, the first argument is the +name of the command whose arguments are being completed, the +second argument is the word being completed, and the third argument +is the word preceding the word being completed on the current command line. +No filtering of the generated completions against the word being completed +is performed; the function or command has complete freedom in generating +the matches. +.PP +Any function specified with \fB\-F\fP is invoked first. +The function may use any of the shell facilities, including the +\fBcompgen\fP builtin described below, to generate the matches. +It must put the possible completions in the +.SM +.B COMPREPLY +array variable. +.PP +Next, any command specified with the \fB\-C\fP option is invoked +in an environment equivalent to command substitution. +It should print a list of completions, one per line, to the +standard output. +Backslash may be used to escape a newline, if necessary. +.PP +After all of the possible completions are generated, any filter +specified with the \fB\-X\fP option is applied to the list. +The filter is a pattern as used for pathname expansion; a \fB&\fP +in the pattern is replaced with the text of the word being completed. +A literal \fB&\fP may be escaped with a backslash; the backslash +is removed before attempting a match. +Any completion that matches the pattern will be removed from the list. +A leading \fB!\fP negates the pattern; in this case any completion +not matching the pattern will be removed. +.PP +Finally, any prefix and suffix specified with the \fB\-P\fP and \fB\-S\fP +options are added to each member of the completion list, and the result is +returned to the readline completion code as the list of possible +completions. +.PP +If the previously-applied actions do not generate any matches, and the +\fB\-o dirnames\fP option was supplied to \fBcomplete\fP when the +compspec was defined, directory name completion is attempted. +.PP +By default, if a compspec is found, whatever it generates is returned +to the completion code as the full set of possible completions. +The default \fBbash\fP completions are not attempted, and the readline +default of filename completion is disabled. +If the \fB-o default\fP option was supplied to \fBcomplete\fP when the +compspec was defined, readline's default completion will be performed +if the compspec generates no matches. +.PP +When a compspec indicates that directory name completion is desired, +the programmable completion functions force readline to append a slash +to completed names which are symbolic links to directories, subject to +the value of the \fBmark\-directories\fP readline variable, regardless +of the setting of the \fBmark-symlinked\-directories\fP readline variable. +.SH HISTORY +When the +.B \-o history +option to the +.B set +builtin is enabled, the shell provides access to the +\fIcommand history\fP, +the list of commands previously typed. +The value of the \fBHISTSIZE\fP variable is used as the +number of commands to save in a history list. +The text of the last +.SM +.B HISTSIZE +commands (default 500) is saved. The shell +stores each command in the history list prior to parameter and +variable expansion (see +.SM +.B EXPANSION +above) but after history expansion is performed, subject to the +values of the shell variables +.SM +.B HISTIGNORE +and +.SM +.BR HISTCONTROL . +.PP +On startup, the history is initialized from the file named by +the variable +.SM +.B HISTFILE +(default \fI~/.bash_history\fP). +The file named by the value of +.SM +.B HISTFILE +is truncated, if necessary, to contain no more than +the number of lines specified by the value of +.SM +.BR HISTFILESIZE . +When an interactive shell exits, the last +.SM +.B $HISTSIZE +lines are copied from the history list to +.SM +.BR $HISTFILE . +If the +.B histappend +shell option is enabled +(see the description of +.B shopt +under +.SM +.B "SHELL BUILTIN COMMANDS" +below), the lines are appended to the history file, +otherwise the history file is overwritten. +If +.SM +.B HISTFILE +is unset, or if the history file is unwritable, the history is +not saved. After saving the history, the history file is truncated +to contain no more than +.SM +.B HISTFILESIZE +lines. If +.SM +.B HISTFILESIZE +is not set, no truncation is performed. +.PP +The builtin command +.B fc +(see +.SM +.B SHELL BUILTIN COMMANDS +below) may be used to list or edit and re-execute a portion of +the history list. +The +.B history +builtin may be used to display or modify the history list and +manipulate the history file. +When using command-line editing, search commands +are available in each editing mode that provide access to the +history list. +.PP +The shell allows control over which commands are saved on the history +list. The +.SM +.B HISTCONTROL +and +.SM +.B HISTIGNORE +variables may be set to cause the shell to save only a subset of the +commands entered. +The +.B cmdhist +shell option, if enabled, causes the shell to attempt to save each +line of a multi-line command in the same history entry, adding +semicolons where necessary to preserve syntactic correctness. +The +.B lithist +shell option causes the shell to save the command with embedded newlines +instead of semicolons. See the description of the +.B shopt +builtin below under +.SM +.B "SHELL BUILTIN COMMANDS" +for information on setting and unsetting shell options. +.SH "HISTORY EXPANSION" +.PP +The shell supports a history expansion feature that +is similar to the history expansion in +.BR csh. +This section describes what syntax features are available. This +feature is enabled by default for interactive shells, and can be +disabled using the +.B \+H +option to the +.B set +builtin command (see +.SM +.B SHELL BUILTIN COMMANDS +below). Non-interactive shells do not perform history expansion +by default. +.PP +History expansions introduce words from the history list into +the input stream, making it easy to repeat commands, insert the +arguments to a previous command into the current input line, or +fix errors in previous commands quickly. +.PP +History expansion is performed immediately after a complete line +is read, before the shell breaks it into words. +It takes place in two parts. +The first is to determine which line from the history list +to use during substitution. +The second is to select portions of that line for inclusion into +the current one. +The line selected from the history is the \fIevent\fP, +and the portions of that line that are acted upon are \fIwords\fP. +Various \fImodifiers\fP are available to manipulate the selected words. +The line is broken into words in the same fashion as when reading input, +so that several \fImetacharacter\fP-separated words surrounded by +quotes are considered one word. +History expansions are introduced by the appearance of the +history expansion character, which is \^\fB!\fP\^ by default. +Only backslash (\^\fB\e\fP\^) and single quotes can quote +the history expansion character. +.PP +Several shell options settable with the +.B shopt +builtin may be used to tailor the behavior of history expansion. +If the +.B histverify +shell option is enabled (see the description of the +.B shopt +builtin), and +.B readline +is being used, history substitutions are not immediately passed to +the shell parser. +Instead, the expanded line is reloaded into the +.B readline +editing buffer for further modification. +If +.B readline +is being used, and the +.B histreedit +shell option is enabled, a failed history substitution will be reloaded +into the +.B readline +editing buffer for correction. +The +.B \-p +option to the +.B history +builtin command may be used to see what a history expansion will +do before using it. +The +.B \-s +option to the +.B history +builtin may be used to add commands to the end of the history list +without actually executing them, so that they are available for +subsequent recall. +.PP +The shell allows control of the various characters used by the +history expansion mechanism (see the description of +.B histchars +above under +.BR "Shell Variables" ). +.SS Event Designators +.PP +An event designator is a reference to a command line entry in the +history list. +.PP +.PD 0 +.TP +.B ! +Start a history substitution, except when followed by a +.BR blank , +newline, = or ( (when the \fBextglob\fP shell option is enabled using +the \fBshopt\fP builtin). +.TP +.B !\fIn\fR +Refer to command line +.IR n . +.TP +.B !\-\fIn\fR +Refer to the current command line minus +.IR n . +.TP +.B !! +Refer to the previous command. This is a synonym for `!\-1'. +.TP +.B !\fIstring\fR +Refer to the most recent command starting with +.IR string . +.TP +.B !?\fIstring\fR\fB[?]\fR +Refer to the most recent command containing +.IR string . +The trailing \fB?\fP may be omitted if +.I string +is followed immediately by a newline. +.TP +.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u +Quick substitution. Repeat the last command, replacing +.I string1 +with +.IR string2 . +Equivalent to +``!!:s/\fIstring1\fP/\fIstring2\fP/'' +(see \fBModifiers\fP below). +.TP +.B !# +The entire command line typed so far. +.PD +.SS Word Designators +.PP +Word designators are used to select desired words from the event. +A +.B : +separates the event specification from the word designator. +It may be omitted if the word designator begins with a +.BR ^ , +.BR $ , +.BR * , +.BR \- , +or +.BR % . +Words are numbered from the beginning of the line, +with the first word being denoted by 0 (zero). +Words are inserted into the current line separated by single spaces. +.PP +.PD 0 +.TP +.B 0 (zero) +The zeroth word. For the shell, this is the command +word. +.TP +.I n +The \fIn\fRth word. +.TP +.B ^ +The first argument. That is, word 1. +.TP +.B $ +The last argument. +.TP +.B % +The word matched by the most recent `?\fIstring\fR?' search. +.TP +.I x\fB\-\fPy +A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'. +.TP +.B * +All of the words but the zeroth. This is a synonym +for `\fI1\-$\fP'. It is not an error to use +.B * +if there is just one +word in the event; the empty string is returned in that case. +.TP +.B x* +Abbreviates \fIx\-$\fP. +.TP +.B x\- +Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word. +.PD +.PP +If a word designator is supplied without an event specification, the +previous command is used as the event. +.SS Modifiers +.PP +After the optional word designator, there may appear a sequence of +one or more of the following modifiers, each preceded by a `:'. +.PP +.PD 0 +.PP +.TP +.B h +Remove a trailing file name component, leaving only the head. +.TP +.B t +Remove all leading file name components, leaving the tail. +.TP +.B r +Remove a trailing suffix of the form \fI.xxx\fP, leaving the +basename. +.TP +.B e +Remove all but the trailing suffix. +.TP +.B p +Print the new command but do not execute it. +.TP +.B q +Quote the substituted words, escaping further substitutions. +.TP +.B x +Quote the substituted words as with +.BR q , +but break into words at +.B blanks +and newlines. +.TP +.B s/\fIold\fP/\fInew\fP/ +Substitute +.I new +for the first occurrence of +.I old +in the event line. Any delimiter can be used in place of /. The +final delimiter is optional if it is the last character of the +event line. The delimiter may be quoted in +.I old +and +.I new +with a single backslash. If & appears in +.IR new , +it is replaced by +.IR old . +A single backslash will quote the &. If +.I old +is null, it is set to the last +.I old +substituted, or, if no previous history substitutions took place, +the last +.I string +in a +.B !?\fIstring\fR\fB[?]\fR +search. +.TP +.B & +Repeat the previous substitution. +.TP +.B g +Cause changes to be applied over the entire event line. This is +used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR') +or `\fB:&\fP'. If used with +`\fB:s\fP', any delimiter can be used +in place of /, and the final delimiter is optional +if it is the last character of the event line. +An \fBa\fP may be used as a synonym for \fBg\fP. +.TP +.B G +Apply the following `\fBs\fP' modifier once to each word in the event line. +.PD +.SH "SHELL BUILTIN COMMANDS" +.\" start of bash_builtins +.zZ +.PP +Unless otherwise noted, each builtin command documented in this +section as accepting options preceded by +.B \- +accepts +.B \-\- +to signify the end of the options. +.sp .5 +.PD 0 +.TP +\fB:\fP [\fIarguments\fP] +.PD +No effect; the command does nothing beyond expanding +.I arguments +and performing any specified +redirections. A zero exit code is returned. +.TP +\fB .\| \fP \fIfilename\fP [\fIarguments\fP] +.PD 0 +.TP +\fBsource\fP \fIfilename\fP [\fIarguments\fP] +.PD +Read and execute commands from +.I filename +in the current +shell environment and return the exit status of the last command +executed from +.IR filename . +If +.I filename +does not contain a slash, file names in +.SM +.B PATH +are used to find the directory containing +.IR filename . +The file searched for in +.SM +.B PATH +need not be executable. +When \fBbash\fP is not in \fIposix mode\fP, the current directory is +searched if no file is found in +.SM +.BR PATH . +If the +.B sourcepath +option to the +.B shopt +builtin command is turned off, the +.SM +.B PATH +is not searched. +If any \fIarguments\fP are supplied, they become the positional +parameters when \fIfilename\fP is executed. Otherwise the positional +parameters are unchanged. +The return status is the status of the last command exited within +the script (0 if no commands are executed), and false if +.I filename +is not found or cannot be read. +.TP +\fBalias\fP [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...] +\fBAlias\fP with no arguments or with the +.B \-p +option prints the list of aliases in the form +\fBalias\fP \fIname\fP=\fIvalue\fP on standard output. +When arguments are supplied, an alias is defined for +each \fIname\fP whose \fIvalue\fP is given. +A trailing space in \fIvalue\fP causes the next word to be +checked for alias substitution when the alias is expanded. +For each \fIname\fP in the argument list for which no \fIvalue\fP +is supplied, the name and value of the alias is printed. +\fBAlias\fP returns true unless a \fIname\fP is given for which +no alias has been defined. +.TP +\fBbg\fP [\fIjobspec\fP] +Resume the suspended job \fIjobspec\fP in the background, as if it +had been started with +.BR & . +If \fIjobspec\fP is not present, the shell's notion of the +\fIcurrent job\fP is used. +.B bg +.I jobspec +returns 0 unless run when job control is disabled or, when run with +job control enabled, if \fIjobspec\fP was not found or started without +job control. +.TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] [\fB\-lpsvPSV\fP] +.PD 0 +.TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] [\fB\-q\fP \fIfunction\fP] [\fB\-u\fP \fIfunction\fP] [\fB\-r\fP \fIkeyseq\fP] +.TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-f\fP \fIfilename\fP +.TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-x\fP \fIkeyseq\fP:\fIshell\-command\fP +.TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fIkeyseq\fP:\fIfunction\-name\fP +.TP +\fBbind\fP \fIreadline\-command\fP +.PD +Display current +.B readline +key and function bindings, bind a key sequence to a +.B readline +function or macro, or set a +.B readline +variable. +Each non-option argument is a command as it would appear in +.IR .inputrc , +but each binding or command must be passed as a separate argument; +e.g., '"\eC\-x\eC\-r": re\-read\-init\-file'. +Options, if supplied, have the following meanings: +.RS +.PD 0 +.TP +.B \-m \fIkeymap\fP +Use +.I keymap +as the keymap to be affected by the subsequent bindings. +Acceptable +.I keymap +names are +\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi, +vi\-move, vi\-command\fP, and +.IR vi\-insert . +\fIvi\fP is equivalent to \fIvi\-command\fP; \fIemacs\fP is +equivalent to \fIemacs\-standard\fP. +.TP +.B \-l +List the names of all \fBreadline\fP functions. +.TP +.B \-p +Display \fBreadline\fP function names and bindings in such a way +that they can be re-read. +.TP +.B \-P +List current \fBreadline\fP function names and bindings. +.TP +.B \-v +Display \fBreadline\fP variable names and values in such a way that they +can be re-read. +.TP +.B \-V +List current \fBreadline\fP variable names and values. +.TP +.B \-s +Display \fBreadline\fP key sequences bound to macros and the strings +they output in such a way that they can be re-read. +.TP +.B \-S +Display \fBreadline\fP key sequences bound to macros and the strings +they output. +.TP +.B \-f \fIfilename\fP +Read key bindings from \fIfilename\fP. +.TP +.B \-q \fIfunction\fP +Query about which keys invoke the named \fIfunction\fP. +.TP +.B \-u \fIfunction\fP +Unbind all keys bound to the named \fIfunction\fP. +.TP +.B \-r \fIkeyseq\fP +Remove any current binding for \fIkeyseq\fP. +.TP +.B \-x \fIkeyseq\fP:\fIshell\-command\fP +Cause \fIshell\-command\fP to be executed whenever \fIkeyseq\fP is +entered. +.PD +.PP +The return value is 0 unless an unrecognized option is given or an +error occurred. +.RE +.TP +\fBbreak\fP [\fIn\fP] +Exit from within a +.BR for , +.BR while , +.BR until , +or +.B select +loop. If \fIn\fP is specified, break \fIn\fP levels. +.I n +must be \(>= 1. If +.I n +is greater than the number of enclosing loops, all enclosing loops +are exited. The return value is 0 unless the shell is not executing +a loop when +.B break +is executed. +.TP +\fBbuiltin\fP \fIshell\-builtin\fP [\fIarguments\fP] +Execute the specified shell builtin, passing it +.IR arguments , +and return its exit status. +This is useful when defining a +function whose name is the same as a shell builtin, +retaining the functionality of the builtin within the function. +The \fBcd\fP builtin is commonly redefined this way. +The return status is false if +.I shell\-builtin +is not a shell builtin command. +.TP +\fBcd\fP [\fB\-L|-P\fP] [\fIdir\fP] +Change the current directory to \fIdir\fP. The variable +.SM +.B HOME +is the +default +.IR dir . +The variable +.SM +.B CDPATH +defines the search path for the directory containing +.IR dir . +Alternative directory names in +.SM +.B CDPATH +are separated by a colon (:). A null directory name in +.SM +.B CDPATH +is the same as the current directory, i.e., ``\fB.\fP''. If +.I dir +begins with a slash (/), +then +.SM +.B CDPATH +is not used. The +.B \-P +option says to use the physical directory structure instead of +following symbolic links (see also the +.B \-P +option to the +.B set +builtin command); the +.B \-L +option forces symbolic links to be followed. An argument of +.B \- +is equivalent to +.SM +.BR $OLDPWD . +The return value is true if the directory was successfully changed; +false otherwise. +.TP +\fBcaller\fP [\fIexpr\fP] +Returns the context of any active subroutine call (a shell function or +a script executed with the \fB.\fP or \fBsource\fP builtins. +Without \fIexpr\fP, \fBcaller\fP displays the line number and source +filename of the current subroutine call. +If a non-negative integer is supplied as \fIexpr\fP, \fBcaller\fP +displays the line number, subroutine name, and source file corresponding +to that position in the current execution call stack. This extra +information may be used, for example, to print a stack trace. The +current frame is frame 0. +The return value is 0 unless the shell is not executing a subroutine +call or \fIexpr\fP does not correspond to a valid position in the +call stack. +.TP +\fBcommand\fP [\fB\-pVv\fP] \fIcommand\fP [\fIarg\fP ...] +Run +.I command +with +.I args +suppressing the normal shell function lookup. Only builtin +commands or commands found in the +.SM +.B PATH +are executed. If the +.B \-p +option is given, the search for +.I command +is performed using a default value for +.B PATH +that is guaranteed to find all of the standard utilities. +If either the +.B \-V +or +.B \-v +option is supplied, a description of +.I command +is printed. The +.B \-v +option causes a single word indicating the command or file name +used to invoke +.I command +to be displayed; the +.B \-V +option produces a more verbose description. +If the +.B \-V +or +.B \-v +option is supplied, the exit status is 0 if +.I command +was found, and 1 if not. If neither option is supplied and +an error occurred or +.I command +cannot be found, the exit status is 127. Otherwise, the exit status of the +.B command +builtin is the exit status of +.IR command . +.TP +\fBcompgen\fP [\fIoption\fP] [\fIword\fP] +Generate possible completion matches for \fIword\fP according to +the \fIoption\fPs, which may be any option accepted by the +.B complete +builtin with the exception of \fB\-p\fP and \fB\-r\fP, and write +the matches to the standard output. +When using the \fB\-F\fP or \fB\-C\fP options, the various shell variables +set by the programmable completion facilities, while available, will not +have useful values. +.sp 1 +The matches will be generated in the same way as if the programmable +completion code had generated them directly from a completion specification +with the same flags. +If \fIword\fP is specified, only those completions matching \fIword\fP +will be displayed. +.sp 1 +The return value is true unless an invalid option is supplied, or no +matches were generated. +.TP +\fBcomplete\fP [\fB\-abcdefgjksuv\fP] [\fB\-o\fP \fIcomp-option\fP] [\fB\-A\fP \fIaction\fP] [\fB\-G\fP \fIglobpat\fP] [\fB\-W\fP \fIwordlist\fP] [\fB\-P\fP \fIprefix\fP] [\fB\-S\fP \fIsuffix\fP] +.br +[\fB\-X\fP \fIfilterpat\fP] [\fB\-F\fP \fIfunction\fP] [\fB\-C\fP \fIcommand\fP] \fIname\fP [\fIname ...\fP] +.PD 0 +.TP +\fBcomplete\fP \fB\-pr\fP [\fIname\fP ...] +.PD +Specify how arguments to each \fIname\fP should be completed. +If the \fB\-p\fP option is supplied, or if no options are supplied, +existing completion specifications are printed in a way that allows +them to be reused as input. +The \fB\-r\fP option removes a completion specification for +each \fIname\fP, or, if no \fIname\fPs are supplied, all +completion specifications. +.sp 1 +The process of applying these completion specifications when word completion +is attempted is described above under \fBProgrammable Completion\fP. +.sp 1 +Other options, if specified, have the following meanings. +The arguments to the \fB\-G\fP, \fB\-W\fP, and \fB\-X\fP options +(and, if necessary, the \fB\-P\fP and \fB\-S\fP options) +should be quoted to protect them from expansion before the +.B complete +builtin is invoked. +.RS +.PD 0 +.TP 8 +\fB\-o\fP \fIcomp-option\fP +The \fIcomp-option\fP controls several aspects of the compspec's behavior +beyond the simple generation of completions. +\fIcomp-option\fP may be one of: +.RS +.TP 8 +.B default +Use readline's default filename completion if the compspec generates +no matches. +.TP 8 +.B dirnames +Perform directory name completion if the compspec generates no matches. +.TP 8 +.B filenames +Tell readline that the compspec generates filenames, so it can perform any +filename\-specific processing (like adding a slash to directory names or +suppressing trailing spaces). Intended to be used with shell functions. +.TP 8 +.B nospace +Tell readline not to append a space (the default) to words completed at +the end of the line. +.RE +.TP 8 +\fB\-A\fP \fIaction\fP +The \fIaction\fP may be one of the following to generate a list of possible +completions: +.RS +.TP 8 +.B alias +Alias names. May also be specified as \fB\-a\fP. +.TP 8 +.B arrayvar +Array variable names. +.TP 8 +.B binding +\fBReadline\fP key binding names. +.TP 8 +.B builtin +Names of shell builtin commands. May also be specified as \fB\-b\fP. +.TP 8 +.B command +Command names. May also be specified as \fB\-c\fP. +.TP 8 +.B directory +Directory names. May also be specified as \fB\-d\fP. +.TP 8 +.B disabled +Names of disabled shell builtins. +.TP 8 +.B enabled +Names of enabled shell builtins. +.TP 8 +.B export +Names of exported shell variables. May also be specified as \fB\-e\fP. +.TP 8 +.B file +File names. May also be specified as \fB\-f\fP. +.TP 8 +.B function +Names of shell functions. +.TP 8 +.B group +Group names. May also be specified as \fB\-g\fP. +.TP 8 +.B helptopic +Help topics as accepted by the \fBhelp\fP builtin. +.TP 8 +.B hostname +Hostnames, as taken from the file specified by the +.SM +.B HOSTFILE +shell variable. +.TP 8 +.B job +Job names, if job control is active. May also be specified as \fB\-j\fP. +.TP 8 +.B keyword +Shell reserved words. May also be specified as \fB\-k\fP. +.TP 8 +.B running +Names of running jobs, if job control is active. +.TP 8 +.B service +Service names. May also be specified as \fB\-s\fP. +.TP 8 +.B setopt +Valid arguments for the \fB\-o\fP option to the \fBset\fP builtin. +.TP 8 +.B shopt +Shell option names as accepted by the \fBshopt\fP builtin. +.TP 8 +.B signal +Signal names. +.TP 8 +.B stopped +Names of stopped jobs, if job control is active. +.TP 8 +.B user +User names. May also be specified as \fB\-u\fP. +.TP 8 +.B variable +Names of all shell variables. May also be specified as \fB\-v\fP. +.RE +.TP 8 +\fB\-G\fP \fIglobpat\fP +The filename expansion pattern \fIglobpat\fP is expanded to generate +the possible completions. +.TP 8 +\fB\-W\fP \fIwordlist\fP +The \fIwordlist\fP is split using the characters in the +.SM +.B IFS +special variable as delimiters, and each resultant word is expanded. +The possible completions are the members of the resultant list which +match the word being completed. +.TP 8 +\fB\-C\fP \fIcommand\fP +\fIcommand\fP is executed in a subshell environment, and its output is +used as the possible completions. +.TP 8 +\fB\-F\fP \fIfunction\fP +The shell function \fIfunction\fP is executed in the current shell +environment. +When it finishes, the possible completions are retrieved from the value +of the +.SM +.B COMPREPLY +array variable. +.TP 8 +\fB\-X\fP \fIfilterpat\fP +\fIfilterpat\fP is a pattern as used for filename expansion. +It is applied to the list of possible completions generated by the +preceding options and arguments, and each completion matching +\fIfilterpat\fP is removed from the list. +A leading \fB!\fP in \fIfilterpat\fP negates the pattern; in this +case, any completion not matching \fIfilterpat\fP is removed. +.TP 8 +\fB\-P\fP \fIprefix\fP +\fIprefix\fP is added at the beginning of each possible completion +after all other options have been applied. +.TP 8 +\fB\-S\fP \fIsuffix\fP +\fIsuffix\fP is appended to each possible completion +after all other options have been applied. +.PD +.PP +The return value is true unless an invalid option is supplied, an option +other than \fB\-p\fP or \fB\-r\fP is supplied without a \fIname\fP +argument, an attempt is made to remove a completion specification for +a \fIname\fP for which no specification exists, or +an error occurs adding a completion specification. +.RE +.TP +\fBcontinue\fP [\fIn\fP] +Resume the next iteration of the enclosing +.BR for , +.BR while , +.BR until , +or +.B select +loop. +If +.I n +is specified, resume at the \fIn\fPth enclosing loop. +.I n +must be \(>= 1. If +.I n +is greater than the number of enclosing loops, the last enclosing loop +(the ``top-level'' loop) is resumed. The return value is 0 unless the +shell is not executing a loop when +.B continue +is executed. +.TP +\fBdeclare\fP [\fB\-afFirtx\fP] [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...] +.PD 0 +.TP +\fBtypeset\fP [\fB\-afFirtx\fP] [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...] +.PD +Declare variables and/or give them attributes. +If no \fIname\fPs are given then display the values of variables. +The +.B \-p +option will display the attributes and values of each +.IR name . +When +.B \-p +is used, additional options are ignored. +The +.B \-F +option inhibits the display of function definitions; only the +function name and attributes are printed. +If the \fBextdebug\fP shell option is enabled using \fBshopt\fP, +the source file name and line number where the function is defined +are displayed as well. The +.B \-F +option implies +.BR \-f . +The following options can +be used to restrict output to variables with the specified attribute or +to give variables attributes: +.RS +.PD 0 +.TP +.B \-a +Each \fIname\fP is an array variable (see +.B Arrays +above). +.TP +.B \-f +Use function names only. +.TP +.B \-i +The variable is treated as an integer; arithmetic evaluation (see +.SM +.B "ARITHMETIC EVALUATION" ") " +is performed when the variable is assigned a value. +.TP +.B \-r +Make \fIname\fPs readonly. These names cannot then be assigned values +by subsequent assignment statements or unset. +.TP +.B \-t +Give each \fIname\fP the \fItrace\fP attribute. +Traced functions inherit the \fBDEBUG\fP trap from the calling shell. +The trace attribute has no special meaning for variables. +.TP +.B \-x +Mark \fIname\fPs for export to subsequent commands via the environment. +.PD +.PP +Using `+' instead of `\-' +turns off the attribute instead, with the exception that \fB+a\fP +may not be used to destroy an array variable. When used in a function, +makes each +\fIname\fP local, as with the +.B local +command. +If a variable name is followed by =\fIvalue\fP, the value of +the variable is set to \fIvalue\fP. +The return value is 0 unless an invalid option is encountered, +an attempt is made to define a function using +.if n ``\-f foo=bar'', +.if t \f(CW\-f foo=bar\fP, +an attempt is made to assign a value to a readonly variable, +an attempt is made to assign a value to an array variable without +using the compound assignment syntax (see +.B Arrays +above), one of the \fInames\fP is not a valid shell variable name, +an attempt is made to turn off readonly status for a readonly variable, +an attempt is made to turn off array status for an array variable, +or an attempt is made to display a non-existent function with \fB\-f\fP. +.RE +.TP +.B dirs [\fB\-clpv\fP] [+\fIn\fP] [\-\fIn\fP] +Without options, displays the list of currently remembered directories. +The default display is on a single line with directory names separated +by spaces. +Directories are added to the list with the +.B pushd +command; the +.B popd +command removes entries from the list. +.RS +.PD 0 +.TP +\fB+\fP\fIn\fP +Displays the \fIn\fPth entry counting from the left of the list +shown by +.B dirs +when invoked without options, starting with zero. +.TP +\fB\-\fP\fIn\fP +Displays the \fIn\fPth entry counting from the right of the list +shown by +.B dirs +when invoked without options, starting with zero. +.TP +.B \-c +Clears the directory stack by deleting all of the entries. +.TP +.B \-l +Produces a longer listing; the default listing format uses a +tilde to denote the home directory. +.TP +.B \-p +Print the directory stack with one entry per line. +.TP +.B \-v +Print the directory stack with one entry per line, +prefixing each entry with its index in the stack. +.PD +.PP +The return value is 0 unless an +invalid option is supplied or \fIn\fP indexes beyond the end +of the directory stack. +.RE +.TP +\fBdisown\fP [\fB\-ar\fP] [\fB\-h\fP] [\fIjobspec\fP ...] +Without options, each +.I jobspec +is removed from the table of active jobs. +If the \fB\-h\fP option is given, each +.I jobspec +is not removed from the table, but is marked so that +.SM +.B SIGHUP +is not sent to the job if the shell receives a +.SM +.BR SIGHUP . +If no +.I jobspec +is present, and neither the +.B \-a +nor the +.B \-r +option is supplied, the \fIcurrent job\fP is used. +If no +.I jobspec +is supplied, the +.B \-a +option means to remove or mark all jobs; the +.B \-r +option without a +.I jobspec +argument restricts operation to running jobs. +The return value is 0 unless a +.I jobspec +does not specify a valid job. +.TP +\fBecho\fP [\fB\-neE\fP] [\fIarg\fP ...] +Output the \fIarg\fPs, separated by spaces, followed by a newline. +The return status is always 0. +If \fB\-n\fP is specified, the trailing newline is +suppressed. If the \fB\-e\fP option is given, interpretation of +the following backslash-escaped characters is enabled. The +.B \-E +option disables the interpretation of these escape characters, +even on systems where they are interpreted by default. +The \fBxpg_echo\fP shell option may be used to +dynamically determine whether or not \fBecho\fP expands these +escape characters by default. +.B echo +does not interpret +.B \-\- +to mean the end of options. +.B echo +interprets the following escape sequences: +.RS +.PD 0 +.TP +.B \ea +alert (bell) +.TP +.B \eb +backspace +.TP +.B \ec +suppress trailing newline +.TP +.B \ee +an escape character +.TP +.B \ef +form feed +.TP +.B \en +new line +.TP +.B \er +carriage return +.TP +.B \et +horizontal tab +.TP +.B \ev +vertical tab +.TP +.B \e\e +backslash +.TP +.B \e0\fInnn\fP +the eight-bit character whose value is the octal value \fInnn\fP +(zero to three octal digits) +.TP +.B \e\fInnn\fP +the eight-bit character whose value is the octal value \fInnn\fP +(one to three octal digits) +.TP +.B \ex\fIHH\fP +the eight-bit character whose value is the hexadecimal value \fIHH\fP +(one or two hex digits) +.PD +.RE +.TP +\fBenable\fP [\fB\-adnps\fP] [\fB\-f\fP \fIfilename\fP] [\fIname\fP ...] +Enable and disable builtin shell commands. +Disabling a builtin allows a disk command which has the same name +as a shell builtin to be executed without specifying a full pathname, +even though the shell normally searches for builtins before disk commands. +If \fB\-n\fP is used, each \fIname\fP +is disabled; otherwise, +\fInames\fP are enabled. For example, to use the +.B test +binary found via the +.SM +.B PATH +instead of the shell builtin version, run +.if t \f(CWenable -n test\fP. +.if n ``enable -n test''. +The +.B \-f +option means to load the new builtin command +.I name +from shared object +.IR filename , +on systems that support dynamic loading. The +.B \-d +option will delete a builtin previously loaded with +.BR \-f . +If no \fIname\fP arguments are given, or if the +.B \-p +option is supplied, a list of shell builtins is printed. +With no other option arguments, the list consists of all enabled +shell builtins. +If \fB\-n\fP is supplied, only disabled builtins are printed. +If \fB\-a\fP is supplied, the list printed includes all builtins, with an +indication of whether or not each is enabled. +If \fB\-s\fP is supplied, the output is restricted to the POSIX +\fIspecial\fP builtins. +The return value is 0 unless a +.I name +is not a shell builtin or there is an error loading a new builtin +from a shared object. +.TP +\fBeval\fP [\fIarg\fP ...] +The \fIarg\fPs are read and concatenated together into a single +command. This command is then read and executed by the shell, and +its exit status is returned as the value of +.BR eval . +If there are no +.IR args , +or only null arguments, +.B eval +returns 0. +.TP +\fBexec\fP [\fB\-cl\fP] [\fB\-a\fP \fIname\fP] [\fIcommand\fP [\fIarguments\fP]] +If +.I command +is specified, it replaces the shell. +No new process is created. The +.I arguments +become the arguments to \fIcommand\fP. +If the +.B \-l +option is supplied, +the shell places a dash at the beginning of the zeroth arg passed to +.IR command . +This is what +.IR login (1) +does. The +.B \-c +option causes +.I command +to be executed with an empty environment. If +.B \-a +is supplied, the shell passes +.I name +as the zeroth argument to the executed command. If +.I command +cannot be executed for some reason, a non-interactive shell exits, +unless the shell option +.B execfail +is enabled, in which case it returns failure. +An interactive shell returns failure if the file cannot be executed. +If +.I command +is not specified, any redirections take effect in the current shell, +and the return status is 0. If there is a redirection error, the +return status is 1. +.TP +\fBexit\fP [\fIn\fP] +Cause the shell to exit +with a status of \fIn\fP. If +.I n +is omitted, the exit status +is that of the last command executed. +A trap on +.SM +.B EXIT +is executed before the shell terminates. +.TP +\fBexport\fP [\fB\-fn\fP\^] [\fIname\fP[=\fIword\fP]] ... +.PD 0 +.TP +.B export \-p +.PD +The supplied +.I names +are marked for automatic export to the environment of +subsequently executed commands. If the +.B \-f +option is given, +the +.I names +refer to functions. +If no +.I names +are given, or if the +.B \-p +option is supplied, a list +of all names that are exported in this shell is printed. +The +.B \-n +option causes the export property to be removed from the +named variables. +If a variable name is followed by =\fIword\fP, the value of +the variable is set to \fIword\fP. +.B export +returns an exit status of 0 unless an invalid option is +encountered, +one of the \fInames\fP is not a valid shell variable name, or +.B \-f +is supplied with a +.I name +that is not a function. +.TP +\fBfc\fP [\fB\-e\fP \fIename\fP] [\fB\-nlr\fP] [\fIfirst\fP] [\fIlast\fP] +.PD 0 +.TP +\fBfc\fP \fB\-s\fP [\fIpat\fP=\fIrep\fP] [\fIcmd\fP] +.PD +Fix Command. In the first form, a range of commands from +.I first +to +.I last +is selected from the history list. +.I First +and +.I last +may be specified as a string (to locate the last command beginning +with that string) or as a number (an index into the history list, +where a negative number is used as an offset from the current +command number). If +.I last +is not specified it is set to +the current command for listing (so that +.if n ``fc \-l \-10'' +.if t \f(CWfc \-l \-10\fP +prints the last 10 commands) and to +.I first +otherwise. +If +.I first +is not specified it is set to the previous +command for editing and \-16 for listing. +.sp 1 +The +.B \-n +option suppresses +the command numbers when listing. The +.B \-r +option reverses the order of +the commands. If the +.B \-l +option is given, +the commands are listed on +standard output. Otherwise, the editor given by +.I ename +is invoked +on a file containing those commands. If +.I ename +is not given, the +value of the +.SM +.B FCEDIT +variable is used, and +the value of +.SM +.B EDITOR +if +.SM +.B FCEDIT +is not set. If neither variable is set, +.FN vi +is used. When editing is complete, the edited commands are +echoed and executed. +.sp 1 +In the second form, \fIcommand\fP is re-executed after each instance +of \fIpat\fP is replaced by \fIrep\fP. +A useful alias to use with this is +.if n ``r="fc -s"'', +.if t \f(CWr='fc \-s'\fP, +so that typing +.if n ``r cc'' +.if t \f(CWr cc\fP +runs the last command beginning with +.if n ``cc'' +.if t \f(CWcc\fP +and typing +.if n ``r'' +.if t \f(CWr\fP +re-executes the last command. +.sp 1 +If the first form is used, the return value is 0 unless an invalid +option is encountered or +.I first +or +.I last +specify history lines out of range. +If the +.B \-e +option is supplied, the return value is the value of the last +command executed or failure if an error occurs with the temporary +file of commands. If the second form is used, the return status +is that of the command re-executed, unless +.I cmd +does not specify a valid history line, in which case +.B fc +returns failure. +.TP +\fBfg\fP [\fIjobspec\fP] +Resume +.I jobspec +in the foreground, and make it the current job. +If +.I jobspec +is not present, the shell's notion of the \fIcurrent job\fP is used. +The return value is that of the command placed into the foreground, +or failure if run when job control is disabled or, when run with +job control enabled, if +.I jobspec +does not specify a valid job or +.I jobspec +specifies a job that was started without job control. +.TP +\fBgetopts\fP \fIoptstring\fP \fIname\fP [\fIargs\fP] +.B getopts +is used by shell procedures to parse positional parameters. +.I optstring +contains the option characters to be recognized; if a character +is followed by a colon, the option is expected to have an +argument, which should be separated from it by white space. +The colon and question mark characters may not be used as +option characters. +Each time it is invoked, +.B getopts +places the next option in the shell variable +.IR name , +initializing +.I name +if it does not exist, +and the index of the next argument to be processed into the +variable +.SM +.BR OPTIND . +.SM +.B OPTIND +is initialized to 1 each time the shell or a shell script +is invoked. When an option requires an argument, +.B getopts +places that argument into the variable +.SM +.BR OPTARG . +The shell does not reset +.SM +.B OPTIND +automatically; it must be manually reset between multiple +calls to +.B getopts +within the same shell invocation if a new set of parameters +is to be used. +.sp 1 +When the end of options is encountered, \fBgetopts\fP exits with a +return value greater than zero. +\fBOPTIND\fP is set to the index of the first non-option argument, +and \fBname\fP is set to ?. +.sp 1 +.B getopts +normally parses the positional parameters, but if more arguments are +given in +.IR args , +.B getopts +parses those instead. +.sp 1 +.B getopts +can report errors in two ways. If the first character of +.I optstring +is a colon, +.I silent +error reporting is used. In normal operation diagnostic messages +are printed when invalid options or missing option arguments are +encountered. +If the variable +.SM +.B OPTERR +is set to 0, no error messages will be displayed, even if the first +character of +.I optstring +is not a colon. +.sp 1 +If an invalid option is seen, +.B getopts +places ? into +.I name +and, if not silent, +prints an error message and unsets +.SM +.BR OPTARG . +If +.B getopts +is silent, +the option character found is placed in +.SM +.B OPTARG +and no diagnostic message is printed. +.sp 1 +If a required argument is not found, and +.B getopts +is not silent, +a question mark (\^\fB?\fP\^) is placed in +.IR name , +.SM +.B OPTARG +is unset, and a diagnostic message is printed. +If +.B getopts +is silent, then a colon (\^\fB:\fP\^) is placed in +.I name +and +.SM +.B OPTARG +is set to the option character found. +.sp 1 +.B getopts +returns true if an option, specified or unspecified, is found. +It returns false if the end of options is encountered or an +error occurs. +.TP +\fBhash\fP [\fB\-lr\fP] [\fB\-p\fP \fIfilename\fP] [\fB\-dt\fP] [\fIname\fP] +For each +.IR name , +the full file name of the command is determined by searching +the directories in +.B $PATH +and remembered. +If the +.B \-p +option is supplied, no path search is performed, and +.I filename +is used as the full file name of the command. +The +.B \-r +option causes the shell to forget all +remembered locations. +The +.B \-d +option causes the shell to forget the remembered location of each \fIname\fP. +If the +.B \-t +option is supplied, the full pathname to which each \fIname\fP corresponds +is printed. If multiple \fIname\fP arguments are supplied with \fB\-t\fP, +the \fIname\fP is printed before the hashed full pathname. +The +.B \-l +option causes output to be displayed in a format that may be reused as input. +If no arguments are given, or if only \fB\-l\fP is supplied, +information about remembered commands is printed. +The return status is true unless a +.I name +is not found or an invalid option is supplied. +.TP +\fBhelp\fP [\fB\-s\fP] [\fIpattern\fP] +Display helpful information about builtin commands. If +.I pattern +is specified, +.B help +gives detailed help on all commands matching +.IR pattern ; +otherwise help for all the builtins and shell control structures +is printed. +The \fB\-s\fP option restricts the information displayed to a short +usage synopsis. +The return status is 0 unless no command matches +.IR pattern . +.TP +\fBhistory [\fIn\fP] +.PD 0 +.TP +\fBhistory\fP \fB\-c\fP +.TP +\fBhistory \-d\fP \fIoffset\fP +.TP +\fBhistory\fP \fB\-anrw\fP [\fIfilename\fP] +.TP +\fBhistory\fP \fB\-p\fP \fIarg\fP [\fIarg ...\fP] +.TP +\fBhistory\fP \fB\-s\fP \fIarg\fP [\fIarg ...\fP] +.PD +With no options, display the command +history list with line numbers. Lines listed +with a +.B * +have been modified. An argument of +.I n +lists only the last +.I n +lines. If \fIfilename\fP is supplied, it is used as the +name of the history file; if not, the value of +.SM +.B HISTFILE +is used. Options, if supplied, have the following meanings: +.RS +.PD 0 +.TP +.B \-c +Clear the history list by deleting all the entries. +.TP +\fB\-d\fP \fIoffset\fP +Delete the history entry at position \fIoffset\fP. +.TP +.B \-a +Append the ``new'' history lines (history lines entered since the +beginning of the current \fBbash\fP session) to the history file. +.TP +.B \-n +Read the history lines not already read from the history +file into the current history list. These are lines +appended to the history file since the beginning of the +current \fBbash\fP session. +.TP +.B \-r +Read the contents of the history file +and use them as the current history. +.TP +.B \-w +Write the current history to the history file, overwriting the +history file's contents. +.TP +.B \-p +Perform history substitution on the following \fIargs\fP and display +the result on the standard output. +Does not store the results in the history list. +Each \fIarg\fP must be quoted to disable normal history expansion. +.TP +.B \-s +Store the +.I args +in the history list as a single entry. The last command in the +history list is removed before the +.I args +are added. +.PD +.PP +The return value is 0 unless an invalid option is encountered, an +error occurs while reading or writing the history file, an invalid +\fIoffset\fP is supplied as an argument to \fB\-d\fP, or the +history expansion supplied as an argument to \fB\-p\fP fails. +.RE +.TP +\fBjobs\fP [\fB\-lnprs\fP] [ \fIjobspec\fP ... ] +.PD 0 +.TP +\fBjobs\fP \fB\-x\fP \fIcommand\fP [ \fIargs\fP ... ] +.PD +The first form lists the active jobs. The options have the following +meanings: +.RS +.PD 0 +.TP +.B \-l +List process IDs +in addition to the normal information. +.TP +.B \-p +List only the process ID of the job's process group +leader. +.TP +.B \-n +Display information only about jobs that have changed status since +the user was last notified of their status. +.TP +.B \-r +Restrict output to running jobs. +.TP +.B \-s +Restrict output to stopped jobs. +.PD +.PP +If +.I jobspec +is given, output is restricted to information about that job. +The return status is 0 unless an invalid option is encountered +or an invalid +.I jobspec +is supplied. +.PP +If the +.B \-x +option is supplied, +.B jobs +replaces any +.I jobspec +found in +.I command +or +.I args +with the corresponding process group ID, and executes +.I command +passing it +.IR args , +returning its exit status. +.RE +.TP +\fBkill\fP [\fB\-s\fP \fIsigspec\fP | \fB\-n\fP \fIsignum\fP | \fB\-\fP\fIsigspec\fP] [\fIpid\fP | \fIjobspec\fP] ... +.PD 0 +.TP +\fBkill\fP \fB\-l\fP [\fIsigspec\fP | \fIexit_status\fP] +.PD +Send the signal named by +.I sigspec +or +.I signum +to the processes named by +.I pid +or +.IR jobspec . +.I sigspec +is either a signal name such as +.SM +.B SIGKILL +or a signal number; +.I signum +is a signal number. If +.I sigspec +is a signal name, the name may be +given with or without the +.SM +.B SIG +prefix. +If +.I sigspec +is not present, then +.SM +.B SIGTERM +is assumed. +An argument of +.B \-l +lists the signal names. +If any arguments are supplied when +.B \-l +is given, the names of the signals corresponding to the arguments are +listed, and the return status is 0. +The \fIexit_status\fP argument to +.B \-l +is a number specifying either a signal number or the exit status of +a process terminated by a signal. +.B kill +returns true if at least one signal was successfully sent, or false +if an error occurs or an invalid option is encountered. +.TP +\fBlet\fP \fIarg\fP [\fIarg\fP ...] +Each +.I arg +is an arithmetic expression to be evaluated (see +.SM +.BR "ARITHMETIC EVALUATION" ). +If the last +.I arg +evaluates to 0, +.B let +returns 1; 0 is returned otherwise. +.TP +\fBlocal\fP [\fIoption\fP] [\fIname\fP[=\fIvalue\fP] ...] +For each argument, a local variable named +.I name +is created, and assigned +.IR value . +The \fIoption\fP can be any of the options accepted by \fBdeclare\fP. +When +.B local +is used within a function, it causes the variable +.I name +to have a visible scope restricted to that function and its children. +With no operands, +.B local +writes a list of local variables to the standard output. It is +an error to use +.B local +when not within a function. The return status is 0 unless +.B local +is used outside a function, an invalid +.I name +is supplied, or +\fIname\fP is a readonly variable. +.TP +.B logout +Exit a login shell. +.TP +\fBpopd\fP [\-\fBn\fP] [+\fIn\fP] [\-\fIn\fP] +Removes entries from the directory stack. With no arguments, +removes the top directory from the stack, and performs a +.B cd +to the new top directory. +Arguments, if supplied, have the following meanings: +.RS +.PD 0 +.TP +\fB+\fP\fIn\fP +Removes the \fIn\fPth entry counting from the left of the list +shown by +.BR dirs , +starting with zero. For example: +.if n ``popd +0'' +.if t \f(CWpopd +0\fP +removes the first directory, +.if n ``popd +1'' +.if t \f(CWpopd +1\fP +the second. +.TP +\fB\-\fP\fIn\fP +Removes the \fIn\fPth entry counting from the right of the list +shown by +.BR dirs , +starting with zero. For example: +.if n ``popd -0'' +.if t \f(CWpopd -0\fP +removes the last directory, +.if n ``popd -1'' +.if t \f(CWpopd -1\fP +the next to last. +.TP +.B \-n +Suppresses the normal change of directory when removing directories +from the stack, so that only the stack is manipulated. +.PD +.PP +If the +.B popd +command is successful, a +.B dirs +is performed as well, and the return status is 0. +.B popd +returns false if an invalid option is encountered, the directory stack +is empty, a non-existent directory stack entry is specified, or the +directory change fails. +.RE +.TP +\fBprintf\fP \fIformat\fP [\fIarguments\fP] +Write the formatted \fIarguments\fP to the standard output under the +control of the \fIformat\fP. +The \fIformat\fP is a character string which contains three types of objects: +plain characters, which are simply copied to standard output, character +escape sequences, which are converted and copied to the standard output, and +format specifications, each of which causes printing of the next successive +\fIargument\fP. +In addition to the standard \fIprintf\fP(1) formats, \fB%b\fP causes +\fBprintf\fP to expand backslash escape sequences in the corresponding +\fIargument\fP, and \fB%q\fP causes \fBprintf\fP to output the corresponding +\fIargument\fP in a format that can be reused as shell input. +.sp 1 +The \fIformat\fP is reused as necessary to consume all of the \fIarguments\fP. +If the \fIformat\fP requires more \fIarguments\fP than are supplied, the +extra format specifications behave as if a zero value or null string, as +appropriate, had been supplied. The return value is zero on success, +non-zero on failure. +.TP +\fBpushd\fP [\fB\-n\fP] [\fIdir\fP] +.PD 0 +.TP +\fBpushd\fP [\fB\-n\fP] [+\fIn\fP] [\-\fIn\fP] +.PD +Adds a directory to the top of the directory stack, or rotates +the stack, making the new top of the stack the current working +directory. With no arguments, exchanges the top two directories +and returns 0, unless the directory stack is empty. +Arguments, if supplied, have the following meanings: +.RS +.PD 0 +.TP +\fB+\fP\fIn\fP +Rotates the stack so that the \fIn\fPth directory +(counting from the left of the list shown by +.BR dirs , +starting with zero) +is at the top. +.TP +\fB\-\fP\fIn\fP +Rotates the stack so that the \fIn\fPth directory +(counting from the right of the list shown by +.BR dirs , +starting with zero) is at the top. +.TP +.B \-n +Suppresses the normal change of directory when adding directories +to the stack, so that only the stack is manipulated. +.TP +.I dir +Adds +.I dir +to the directory stack at the top, making it the +new current working directory. +.PD +.PP +If the +.B pushd +command is successful, a +.B dirs +is performed as well. +If the first form is used, +.B pushd +returns 0 unless the cd to +.I dir +fails. With the second form, +.B pushd +returns 0 unless the directory stack is empty, +a non-existent directory stack element is specified, +or the directory change to the specified new current directory +fails. +.RE +.TP +\fBpwd\fP [\fB\-LP\fP] +Print the absolute pathname of the current working directory. +The pathname printed contains no symbolic links if the +.B \-P +option is supplied or the +.B \-o physical +option to the +.B set +builtin command is enabled. +If the +.B \-L +option is used, the pathname printed may contain symbolic links. +The return status is 0 unless an error occurs while +reading the name of the current directory or an +invalid option is supplied. +.TP +\fBread\fP [\fB\-ers\fP] [\fB\-u\fP \fIfd\fP] [\fB\-t\fP \fItimeout\fP] [\fB\-a\fP \fIaname\fP] [\fB\-p\fP \fIprompt\fP] [\fB\-n\fP \fInchars\fP] [\fB\-d\fP \fIdelim\fP] [\fIname\fP ...] +One line is read from the standard input, or from the file descriptor +\fIfd\fP supplied as an argument to the \fB\-u\fP option, and the first word +is assigned to the first +.IR name , +the second word to the second +.IR name , +and so on, with leftover words and their intervening separators assigned +to the last +.IR name . +If there are fewer words read from the input stream than names, +the remaining names are assigned empty values. +The characters in +.SM +.B IFS +are used to split the line into words. +The backslash character (\fB\e\fP) may be used to remove any special +meaning for the next character read and for line continuation. +Options, if supplied, have the following meanings: +.RS +.PD 0 +.TP +.B \-a \fIaname\fP +The words are assigned to sequential indices +of the array variable +.IR aname , +starting at 0. +.I aname +is unset before any new values are assigned. +Other \fIname\fP arguments are ignored. +.TP +.B \-d \fIdelim\fP +The first character of \fIdelim\fP is used to terminate the input line, +rather than newline. +.TP +.B \-e +If the standard input +is coming from a terminal, +.B readline +(see +.SM +.B READLINE +above) is used to obtain the line. +.TP +.B \-n \fInchars\fP +\fBread\fP returns after reading \fInchars\fP characters rather than +waiting for a complete line of input. +.TP +.B \-p \fIprompt\fP +Display \fIprompt\fP on standard error, without a +trailing newline, before attempting to read any input. The prompt +is displayed only if input is coming from a terminal. +.TP +.B \-r +Backslash does not act as an escape character. +The backslash is considered to be part of the line. +In particular, a backslash-newline pair may not be used as a line +continuation. +.TP +.B \-s +Silent mode. If input is coming from a terminal, characters are +not echoed. +.TP +.B \-t \fItimeout\fP +Cause \fBread\fP to time out and return failure if a complete line of +input is not read within \fItimeout\fP seconds. +This option has no effect if \fBread\fP is not reading input from the +terminal or a pipe. +.TP +.B \-u \fIfd\FP +Read input from file descriptor \fIfd\fP. +.PD +.PP +If no +.I names +are supplied, the line read is assigned to the variable +.SM +.BR REPLY . +The return code is zero, unless end-of-file is encountered, \fBread\fP +times out, or an invalid file descriptor is supplied as the argument to +\fB\-u\fP. +.RE +.TP +\fBreadonly\fP [\fB\-apf\fP] [\fIname\fP[=\fIword\fP] ...] +.PD +The given +\fInames\fP are marked readonly; the values of these +.I names +may not be changed by subsequent assignment. +If the +.B \-f +option is supplied, the functions corresponding to the +\fInames\fP are so +marked. +The +.B \-a +option restricts the variables to arrays. +If no +.I name +arguments are given, or if the +.B \-p +option is supplied, a list of all readonly names is printed. +The +.B \-p +option causes output to be displayed in a format that +may be reused as input. +If a variable name is followed by =\fIword\fP, the value of +the variable is set to \fIword\fP. +The return status is 0 unless an invalid option is encountered, +one of the +.I names +is not a valid shell variable name, or +.B \-f +is supplied with a +.I name +that is not a function. +.TP +\fBreturn\fP [\fIn\fP] +Causes a function to exit with the return value specified by +.IR n . +If +.I n +is omitted, the return status is that of the last command +executed in the function body. If used outside a function, +but during execution of a script by the +.B . +(\fBsource\fP) command, it causes the shell to stop executing +that script and return either +.I n +or the exit status of the last command executed within the +script as the exit status of the script. If used outside a +function and not during execution of a script by \fB.\fP\^, +the return status is false. +Any command associated with the \fBRETURN\fP trap is executed +before execution resumes after the function or script. +.TP +\fBset\fP [\fB\-\-abefhkmnptuvxBCHP\fP] [\fB\-o\fP \fIoption\fP] [\fIarg\fP ...] +Without options, the name and value of each shell variable are displayed +in a format that can be reused as input. +The output is sorted according to the current locale. +When options are specified, they set or unset shell attributes. +Any arguments remaining after the options are processed are treated +as values for the positional parameters and are assigned, in order, to +.BR $1 , +.BR $2 , +.B ... +.BR $\fIn\fP . +Options, if specified, have the following meanings: +.RS +.PD 0 +.TP 8 +.B \-a +Automatically mark variables and functions which are modified or created +for export to the environment of subsequent commands. +.TP 8 +.B \-b +Report the status of terminated background jobs +immediately, rather than before the next primary prompt. This is +effective only when job control is enabled. +.TP 8 +.B \-e +Exit immediately if a \fIsimple command\fP (see +.SM +.B SHELL GRAMMAR +above) exits with a non-zero status. +The shell does not exit if the +command that fails is part of the command list immediately following a +.B while +or +.B until +keyword, +part of the test in an +.I if +statement, part of a +.B && +or +.B \(bv\(bv +list, or if the command's return value is +being inverted via +.BR ! . +A trap on \fBERR\fP, if set, is executed before the shell exits. +.TP 8 +.B \-f +Disable pathname expansion. +.TP 8 +.B \-h +Remember the location of commands as they are looked up for execution. +This is enabled by default. +.TP 8 +.B \-k +All arguments in the form of assignment statements +are placed in the environment for a command, not just +those that precede the command name. +.TP 8 +.B \-m +Monitor mode. Job control is enabled. This option is on +by default for interactive shells on systems that support +it (see +.SM +.B JOB CONTROL +above). Background processes run in a separate process +group and a line containing their exit status is printed +upon their completion. +.TP 8 +.B \-n +Read commands but do not execute them. This may be used to +check a shell script for syntax errors. This is ignored by +interactive shells. +.TP 8 +.B \-o \fIoption\-name\fP +The \fIoption\-name\fP can be one of the following: +.RS +.TP 8 +.B allexport +Same as +.BR \-a . +.TP 8 +.B braceexpand +Same as +.BR \-B . +.TP 8 +.B emacs +Use an emacs-style command line editing interface. This is enabled +by default when the shell is interactive, unless the shell is started +with the +.B \-\-noediting +option. +.TP 8 +.B errtrace +Same as +.BR \-E . +.TP 8 +.B functrace +Same as +.BR \-T . +.TP 8 +.B errexit +Same as +.BR \-e . +.TP 8 +.B hashall +Same as +.BR \-h . +.TP 8 +.B histexpand +Same as +.BR \-H . +.TP 8 +.B history +Enable command history, as described above under +.SM +.BR HISTORY . +This option is on by default in interactive shells. +.TP 8 +.B ignoreeof +The effect is as if the shell command +.if t \f(CWIGNOREEOF=10\fP +.if n ``IGNOREEOF=10'' +had been executed +(see +.B Shell Variables +above). +.TP 8 +.B keyword +Same as +.BR \-k . +.TP 8 +.B monitor +Same as +.BR \-m . +.TP 8 +.B noclobber +Same as +.BR \-C . +.TP 8 +.B noexec +Same as +.BR \-n . +.TP 8 +.B noglob +Same as +.BR \-f . +.B nolog +Currently ignored. +.TP 8 +.B notify +Same as +.BR \-b . +.TP 8 +.B nounset +Same as +.BR \-u . +.TP 8 +.B onecmd +Same as +.BR \-t . +.TP 8 +.B physical +Same as +.BR \-P . +.TP 8 +.B posix +Change the behavior of +.B bash +where the default operation differs +from the POSIX 1003.2 standard to match the standard (\fIposix mode\fP). +.TP 8 +.B privileged +Same as +.BR \-p . +.TP 8 +.B verbose +Same as +.BR \-v . +.TP 8 +.B vi +Use a vi-style command line editing interface. +.TP 8 +.B xtrace +Same as +.BR \-x . +.sp .5 +.PP +If +.B \-o +is supplied with no \fIoption\-name\fP, the values of the current options are +printed. +If +.B +o +is supplied with no \fIoption\-name\fP, a series of +.B set +commands to recreate the current option settings is displayed on +the standard output. +.RE +.TP 8 +.B \-p +Turn on +.I privileged +mode. In this mode, the +.SM +.B $ENV +and +.SM +.B $BASH_ENV +files are not processed, shell functions are not inherited from the +environment, and the +.SM +.B SHELLOPTS +variable, if it appears in the environment, is ignored. +If the shell is started with the effective user (group) id not equal to the +real user (group) id, and the \fB\-p\fP option is not supplied, these actions +are taken and the effective user id is set to the real user id. +If the \fB\-p\fP option is supplied at startup, the effective user id is +not reset. +Turning this option off causes the effective user +and group ids to be set to the real user and group ids. +.TP 8 +.B \-t +Exit after reading and executing one command. +.TP 8 +.B \-u +Treat unset variables as an error when performing +parameter expansion. If expansion is attempted on an +unset variable, the shell prints an error message, and, +if not interactive, exits with a non-zero status. +.TP 8 +.B \-v +Print shell input lines as they are read. +.TP 8 +.B \-x +After expanding each \fIsimple command\fP, +\fBfor\fP command, \fBcase\fP command, \fBselect\fP command, or +arithmetic \fBfor\fP command, display the expanded value of +.SM +.BR PS4 , +followed by the command and its expanded arguments +or associated word list. +.TP 8 +.B \-B +The shell performs brace expansion (see +.B Brace Expansion +above). This is on by default. +.TP 8 +.B \-C +If set, +.B bash +does not overwrite an existing file with the +.BR > , +.BR >& , +and +.B <> +redirection operators. This may be overridden when +creating output files by using the redirection operator +.B >| +instead of +.BR > . +.TP 8 +.B \-E +If set, any trap on \fBERR\fP is inherited by shell functions, command +substitutions, and commands executed in a subshell environment. +The \fBERR\fP trap is normally not inherited in such cases. +.TP 8 +.B \-H +Enable +.B ! +style history substitution. This option is on by +default when the shell is interactive. +.TP 8 +.B \-P +If set, the shell does not follow symbolic links when executing +commands such as +.B cd +that change the current working directory. It uses the +physical directory structure instead. By default, +.B bash +follows the logical chain of directories when performing commands +which change the current directory. +.TP 8 +.B \-T +If set, any trap on \fBDEBUG\fP is inherited by shell functions, command +substitutions, and commands executed in a subshell environment. +The \fBDEBUG\fP trap is normally not inherited in such cases. +.TP 8 +.B \-\- +If no arguments follow this option, then the positional parameters are +unset. Otherwise, the positional parameters are set to the +\fIarg\fPs, even if some of them begin with a +.BR \- . +.TP 8 +.B \- +Signal the end of options, cause all remaining \fIarg\fPs to be +assigned to the positional parameters. The +.B \-x +and +.B \-v +options are turned off. +If there are no \fIarg\fPs, +the positional parameters remain unchanged. +.PD +.PP +The options are off by default unless otherwise noted. +Using + rather than \- causes these options to be turned off. +The options can also be specified as arguments to an invocation of +the shell. +The current set of options may be found in +.BR $\- . +The return status is always true unless an invalid option is encountered. +.RE +.TP +\fBshift\fP [\fIn\fP] +The positional parameters from \fIn\fP+1 ... are renamed to +.B $1 +.B .... +Parameters represented by the numbers \fB$#\fP +down to \fB$#\fP\-\fIn\fP+1 are unset. +.I n +must be a non-negative number less than or equal to \fB$#\fP. +If +.I n +is 0, no parameters are changed. +If +.I n +is not given, it is assumed to be 1. +If +.I n +is greater than \fB$#\fP, the positional parameters are not changed. +The return status is greater than zero if +.I n +is greater than +.B $# +or less than zero; otherwise 0. +.TP +\fBshopt\fP [\fB\-pqsu\fP] [\fB\-o\fP] [\fIoptname\fP ...] +Toggle the values of variables controlling optional shell behavior. +With no options, or with the +.B \-p +option, a list of all settable options is displayed, with +an indication of whether or not each is set. +The \fB\-p\fP option causes output to be displayed in a form that +may be reused as input. +Other options have the following meanings: +.RS +.PD 0 +.TP +.B \-s +Enable (set) each \fIoptname\fP. +.TP +.B \-u +Disable (unset) each \fIoptname\fP. +.TP +.B \-q +Suppresses normal output (quiet mode); the return status indicates +whether the \fIoptname\fP is set or unset. +If multiple \fIoptname\fP arguments are given with +.BR \-q , +the return status is zero if all \fIoptnames\fP are enabled; non-zero +otherwise. +.TP +.B \-o +Restricts the values of \fIoptname\fP to be those defined for the +.B \-o +option to the +.B set +builtin. +.PD +.PP +If either +.B \-s +or +.B \-u +is used with no \fIoptname\fP arguments, the display is limited to +those options which are set or unset, respectively. +Unless otherwise noted, the \fBshopt\fP options are disabled (unset) +by default. +.PP +The return status when listing options is zero if all \fIoptnames\fP +are enabled, non-zero otherwise. When setting or unsetting options, +the return status is zero unless an \fIoptname\fP is not a valid shell +option. +.PP +The list of \fBshopt\fP options is: +.if t .sp .5v +.if n .sp 1v +.PD 0 +.TP 8 +.B cdable_vars +If set, an argument to the +.B cd +builtin command that +is not a directory is assumed to be the name of a variable whose +value is the directory to change to. +.TP 8 +.B cdspell +If set, minor errors in the spelling of a directory component in a +.B cd +command will be corrected. +The errors checked for are transposed characters, +a missing character, and one character too many. +If a correction is found, the corrected file name is printed, +and the command proceeds. +This option is only used by interactive shells. +.TP 8 +.B checkhash +If set, \fBbash\fP checks that a command found in the hash +table exists before trying to execute it. If a hashed command no +longer exists, a normal path search is performed. +.TP 8 +.B checkwinsize +If set, \fBbash\fP checks the window size after each command +and, if necessary, updates the values of +.SM +.B LINES +and +.SM +.BR COLUMNS . +.TP 8 +.B cmdhist +If set, +.B bash +attempts to save all lines of a multiple-line +command in the same history entry. This allows +easy re-editing of multi-line commands. +.TP 8 +.B dotglob +If set, +.B bash +includes filenames beginning with a `.' in the results of pathname +expansion. +.TP 8 +.B execfail +If set, a non-interactive shell will not exit if +it cannot execute the file specified as an argument to the +.B exec +builtin command. An interactive shell does not exit if +.B exec +fails. +.TP 8 +.B expand_aliases +If set, aliases are expanded as described above under +.SM +.BR ALIASES . +This option is enabled by default for interactive shells. +.TP 8 +.B extdebug +If set, behavior intended for use by debuggers is enabled: +.RS +.TP +.B 1. +The \fB\-F\fP option to the \fBdeclare\fP builtin displays the source +file name and line number corresponding to each function name supplied +as an argument. +.TP +.B 2. +If the command run by the \fBDEBUG\fP trap returns a non-zero value, the +next command is skipped and not executed. +.TP +.B 3. +If the command run by the \fBDEBUG\fP trap returns a value of 2, and the +shell is executing in a subroutine (a shell function or a shell script +executed by the \fB.\fP or \fBsource\fP builtins), a call to +\fBreturn\fP is simulated. +.RE +.TP 8 +.B extglob +If set, the extended pattern matching features described above under +\fBPathname Expansion\fP are enabled. +.TP 8 +.B extquote +If set, \fB$\fP'\fIstring\fP' and \fB$\fP"\fIstring\fP" quoting is +performed within \fB${\fP\fIparameter\fP\fB}\fP expansions +enclosed in double quotes. This option is enabled by default. +.TP 8 +.B histappend +If set, the history list is appended to the file named by the value +of the +.B HISTFILE +variable when the shell exits, rather than overwriting the file. +.TP 8 +.B histreedit +If set, and +.B readline +is being used, a user is given the opportunity to re-edit a +failed history substitution. +.TP 8 +.B histverify +If set, and +.B readline +is being used, the results of history substitution are not immediately +passed to the shell parser. Instead, the resulting line is loaded into +the \fBreadline\fP editing buffer, allowing further modification. +.TP 8 +.B hostcomplete +If set, and +.B readline +is being used, \fBbash\fP will attempt to perform hostname completion when a +word containing a \fB@\fP is being completed (see +.B Completing +under +.SM +.B READLINE +above). +This is enabled by default. +.TP 8 +.B huponexit +If set, \fBbash\fP will send +.SM +.B SIGHUP +to all jobs when an interactive login shell exits. +.TP 8 +.B interactive_comments +If set, allow a word beginning with +.B # +to cause that word and all remaining characters on that +line to be ignored in an interactive shell (see +.SM +.B COMMENTS +above). This option is enabled by default. +.TP 8 +.B lithist +If set, and the +.B cmdhist +option is enabled, multi-line commands are saved to the history with +embedded newlines rather than using semicolon separators where possible. +.TP 8 +.B login_shell +The shell sets this option if it is started as a login shell (see +.SM +.B "INVOCATION" +above). +The value may not be changed. +.TP 8 +.B mailwarn +If set, and a file that \fBbash\fP is checking for mail has been +accessed since the last time it was checked, the message ``The mail in +\fImailfile\fP has been read'' is displayed. +.TP 8 +.B no_empty_cmd_completion +If set, and +.B readline +is being used, +.B bash +will not attempt to search the \fBPATH\fP for possible completions when +completion is attempted on an empty line. +.TP 8 +.B nocaseglob +If set, +.B bash +matches filenames in a case\-insensitive fashion when performing pathname +expansion (see +.B Pathname Expansion +above). +.TP 8 +.B nullglob +If set, +.B bash +allows patterns which match no +files (see +.B Pathname Expansion +above) +to expand to a null string, rather than themselves. +.TP 8 +.B progcomp +If set, the programmable completion facilities (see +\fBProgrammable Completion\fP above) are enabled. +This option is enabled by default. +.TP 8 +.B promptvars +If set, prompt strings undergo variable and parameter expansion after +being expanded as described in +.SM +.B PROMPTING +above. This option is enabled by default. +.TP 8 +.B restricted_shell +The shell sets this option if it is started in restricted mode (see +.SM +.B "RESTRICTED SHELL" +below). +The value may not be changed. +This is not reset when the startup files are executed, allowing +the startup files to discover whether or not a shell is restricted. +.TP 8 +.B shift_verbose +If set, the +.B shift +builtin prints an error message when the shift count exceeds the +number of positional parameters. +.TP 8 +.B sourcepath +If set, the +\fBsource\fP (\fB.\fP) builtin uses the value of +.SM +.B PATH +to find the directory containing the file supplied as an argument. +This option is enabled by default. +.TP 8 +.B xpg_echo +If set, the \fBecho\fP builtin expands backslash-escape sequences +by default. +.RE +.TP +\fBsuspend\fP [\fB\-f\fP] +Suspend the execution of this shell until it receives a +.SM +.B SIGCONT +signal. The +.B \-f +option says not to complain if this is +a login shell; just suspend anyway. The return status is 0 unless +the shell is a login shell and +.B \-f +is not supplied, or if job control is not enabled. +.TP +\fBtest\fP \fIexpr\fP +.PD 0 +.TP +\fB[\fP \fIexpr\fP \fB]\fP +Return a status of 0 or 1 depending on +the evaluation of the conditional expression +.IR expr . +Each operator and operand must be a separate argument. +Expressions are composed of the primaries described above under +.SM +.BR "CONDITIONAL EXPRESSIONS" . +.if t .sp 0.5 +.if n .sp 1 +Expressions may be combined using the following operators, listed +in decreasing order of precedence. +.RS +.PD 0 +.TP +.B ! \fIexpr\fP +True if +.I expr +is false. +.TP +.B ( \fIexpr\fP ) +Returns the value of \fIexpr\fP. +This may be used to override the normal precedence of operators. +.TP +\fIexpr1\fP \-\fBa\fP \fIexpr2\fP +True if both +.I expr1 +and +.I expr2 +are true. +.TP +\fIexpr1\fP \-\fBo\fP \fIexpr2\fP +True if either +.I expr1 +or +.I expr2 +is true. +.PD +.PP +\fBtest\fP and \fB[\fP evaluate conditional +expressions using a set of rules based on the number of arguments. +.if t .sp 0.5 +.if n .sp 1 +.PD 0 +.TP +0 arguments +The expression is false. +.TP +1 argument +The expression is true if and only if the argument is not null. +.TP +2 arguments +If the first argument is \fB!\fP, the expression is true if and +only if the second argument is null. +If the first argument is one of the unary conditional operators listed above +under +.SM +.BR "CONDITIONAL EXPRESSIONS" , +the expression is true if the unary test is true. +If the first argument is not a valid unary conditional operator, the expression +is false. +.TP +3 arguments +If the second argument is one of the binary conditional operators listed above +under +.SM +.BR "CONDITIONAL EXPRESSIONS" , +the result of the expression is the result of the binary test using +the first and third arguments as operands. +If the first argument is \fB!\fP, the value is the negation of +the two-argument test using the second and third arguments. +If the first argument is exactly \fB(\fP and the third argument is +exactly \fB)\fP, the result is the one-argument test of the second +argument. +Otherwise, the expression is false. +The \fB\-a\fP and \fB\-o\fP operators are considered binary operators +in this case. +.TP +4 arguments +If the first argument is \fB!\fP, the result is the negation of +the three-argument expression composed of the remaining arguments. +Otherwise, the expression is parsed and evaluated according to +precedence using the rules listed above. +.TP +5 or more arguments +The expression is parsed and evaluated according to precedence +using the rules listed above. +.RE +.PD +.TP +.B times +Print the accumulated user and system times for the shell and +for processes run from the shell. The return status is 0. +.TP +\fBtrap\fP [\fB\-lp\fP] [\fIarg\fP] [\fIsigspec\fP ...] +The command +.I arg +is to be read and executed when the shell receives +signal(s) +.IR sigspec . +If +.I arg +is absent or +.BR \- , +all specified signals are +reset to their original values (the values they had +upon entrance to the shell). +If +.I arg +is the null string the signal specified by each +.I sigspec +is ignored by the shell and by the commands it invokes. +If +.I arg +is not present and +.B \-p +has been supplied, then the trap commands associated with each +.I sigspec +are displayed. +If no arguments are supplied or if only +.B \-p +is given, +.B trap +prints the list of commands associated with each signal number. +The +.B \-l +option causes the shell to print a list of signal names and +their corresponding numbers. +Each +.I sigspec +is either +a signal name defined in <\fIsignal.h\fP>, or a signal number. +If a +.I sigspec +is +.SM +.B EXIT +(0) the command +.I arg +is executed on exit from the shell. +If a +.I sigspec +is +.SM +.BR DEBUG , +the command +.I arg +is executed before every \fIsimple command\fP, \fIfor\fP command, +\fIcase\fP command, \fIselect\fP command, every arithmetic \fIfor\fP +command, and before the first command executes in a shell function (see +.SM +.B SHELL GRAMMAR +above). +Refer to the description of the \fBextglob\fP option to the +\fBshopt\fP builtin for details of its effect on the \fBDEBUG\fP trap. +If a +.I sigspec +is +.SM +.BR ERR , +the command +.I arg +is executed whenever a simple command has a non\-zero exit status. +The +.SM +.B ERR +trap is not executed if the failed +command is part of the command list immediately following a +.B while +or +.B until +keyword, +part of the test in an +.I if +statement, part of a +.B && +or +.B \(bv\(bv +list, or if the command's return value is +being inverted via +.BR ! . +If a +.I sigspec +is +.SM +.BR RETURN , +the command +.I arg +is executed each time a shell function or a script executed with the +\fB.\fP or \fBsource\fP builtins finishes executing. +Signals ignored upon entry to the shell cannot be trapped or reset. +Trapped signals are reset to their original values in a child +process when it is created. +The return status is false if any +.I sigspec +is invalid; otherwise +.B trap +returns true. +.TP +\fBtype\fP [\fB\-aftpP\fP] \fIname\fP [\fIname\fP ...] +With no options, +indicate how each +.I name +would be interpreted if used as a command name. +If the +.B \-t +option is used, +.B type +prints a string which is one of +.IR alias , +.IR keyword , +.IR function , +.IR builtin , +or +.I file +if +.I name +is an alias, shell reserved word, function, builtin, or disk file, +respectively. +If the +.I name +is not found, then nothing is printed, and an exit status of false +is returned. +If the +.B \-p +option is used, +.B type +either returns the name of the disk file +that would be executed if +.I name +were specified as a command name, +or nothing if +.if t \f(CWtype -t name\fP +.if n ``type -t name'' +would not return +.IR file . +The +.B \-P +option forces a +.SM +.B PATH +search for each \fIname\fP, even if +.if t \f(CWtype -t name\fP +.if n ``type -t name'' +would not return +.IR file . +If a command is hashed, +.B \-p +and +.B \-P +print the hashed value, not necessarily the file that appears +first in +.SM +.BR PATH . +If the +.B \-a +option is used, +.B type +prints all of the places that contain +an executable named +.IR name . +This includes aliases and functions, +if and only if the +.B \-p +option is not also used. +The table of hashed commands is not consulted +when using +.BR \-a . +The +.B \-f +option suppresses shell function lookup, as with the \fBcommand\fP builtin. +.B type +returns true if any of the arguments are found, false if +none are found. +.TP +\fBulimit\fP [\fB\-SHacdflmnpstuv\fP [\fIlimit\fP]] +Provides control over the resources available to the shell and to +processes started by it, on systems that allow such control. +The \fB\-H\fP and \fB\-S\fP options specify that the hard or soft limit is +set for the given resource. A hard limit cannot be increased once it +is set; a soft limit may be increased up to the value of the hard limit. +If neither \fB\-H\fP nor \fB\-S\fP is specified, both the soft and hard +limits are set. +The value of +.I limit +can be a number in the unit specified for the resource +or one of the special values +.BR hard , +.BR soft , +or +.BR unlimited , +which stand for the current hard limit, the current soft limit, and +no limit, respectively. +If +.I limit +is omitted, the current value of the soft limit of the resource is +printed, unless the \fB\-H\fP option is given. When more than one +resource is specified, the limit name and unit are printed before the value. +Other options are interpreted as follows: +.RS +.PD 0 +.TP +.B \-a +All current limits are reported +.TP +.B \-c +The maximum size of core files created +.TP +.B \-d +The maximum size of a process's data segment +.TP +.B \-f +The maximum size of files created by the shell +.TP +.B \-l +The maximum size that may be locked into memory +.TP +.B \-m +The maximum resident set size +.TP +.B \-n +The maximum number of open file descriptors (most systems do not +allow this value to be set) +.TP +.B \-p +The pipe size in 512-byte blocks (this may not be set) +.TP +.B \-s +The maximum stack size +.TP +.B \-t +The maximum amount of cpu time in seconds +.TP +.B \-u +The maximum number of processes available to a single user +.TP +.B \-v +The maximum amount of virtual memory available to the shell +.PD +.PP +If +.I limit +is given, it is the new value of the specified resource (the +.B \-a +option is display only). +If no option is given, then +.B \-f +is assumed. Values are in 1024-byte increments, except for +.BR \-t , +which is in seconds, +.BR \-p , +which is in units of 512-byte blocks, +and +.B \-n +and +.BR \-u , +which are unscaled values. +The return status is 0 unless an invalid option or argument is supplied, +or an error occurs while setting a new limit. +.RE +.TP +\fBumask\fP [\fB\-p\fP] [\fB\-S\fP] [\fImode\fP] +The user file-creation mask is set to +.IR mode . +If +.I mode +begins with a digit, it +is interpreted as an octal number; otherwise +it is interpreted as a symbolic mode mask similar +to that accepted by +.IR chmod (1). +If +.I mode +is omitted, the current value of the mask is printed. +The +.B \-S +option causes the mask to be printed in symbolic form; the +default output is an octal number. +If the +.B \-p +option is supplied, and +.I mode +is omitted, the output is in a form that may be reused as input. +The return status is 0 if the mode was successfully changed or if +no \fImode\fP argument was supplied, and false otherwise. +.TP +\fBunalias\fP [\-\fBa\fP] [\fIname\fP ...] +Remove each \fIname\fP from the list of defined aliases. If +.B \-a +is supplied, all alias definitions are removed. The return +value is true unless a supplied +.I name +is not a defined alias. +.TP +\fBunset\fP [\-\fBfv\fP] [\fIname\fP ...] +For each +.IR name , +remove the corresponding variable or function. +If no options are supplied, or the +.B \-v +option is given, each +.I name +refers to a shell variable. +Read-only variables may not be unset. +If +.B \-f +is specifed, +each +.I name +refers to a shell function, and the function definition +is removed. +Each unset variable or function is removed from the environment +passed to subsequent commands. +If any of +.SM +.BR RANDOM , +.SM +.BR SECONDS , +.SM +.BR LINENO , +.SM +.BR HISTCMD , +.SM +.BR FUNCNAME , +.SM +.BR GROUPS , +or +.SM +.B DIRSTACK +are unset, they lose their special properties, even if they are +subsequently reset. The exit status is true unless a +.I name +is readonly. +.TP +\fBwait\fP [\fIn\fP] +Wait for the specified process and return its termination +status. +.I n +may be a process +ID or a job specification; if a job spec is given, all processes +in that job's pipeline are waited for. If +.I n +is not given, all currently active child processes +are waited for, and the return status is zero. If +.I n +specifies a non-existent process or job, the return status is +127. Otherwise, the return status is the exit status of the last +process or job waited for. +.\" bash_builtins +.if \n(zZ=1 .ig zZ +.SH "RESTRICTED SHELL" +.\" rbash.1 +.zY +.PP +If +.B bash +is started with the name +.BR rbash , +or the +.B \-r +option is supplied at invocation, +the shell becomes restricted. +A restricted shell is used to +set up an environment more controlled than the standard shell. +It behaves identically to +.B bash +with the exception that the following are disallowed or not performed: +.IP \(bu +changing directories with \fBcd\fP +.IP \(bu +setting or unsetting the values of +.BR SHELL , +.BR PATH , +.BR ENV , +or +.B BASH_ENV +.IP \(bu +specifying command names containing +.B / +.IP \(bu +specifying a file name containing a +.B / +as an argument to the +.B . +builtin command +.IP \(bu +Specifying a filename containing a slash as an argument to the +.B \-p +option to the +.B hash +builtin command +.IP \(bu +importing function definitions from the shell environment at startup +.IP \(bu +parsing the value of \fBSHELLOPTS\fP from the shell environment at startup +.IP \(bu +redirecting output using the >, >|, <>, >&, &>, and >> redirection operators +.IP \(bu +using the +.B exec +builtin command to replace the shell with another command +.IP \(bu +adding or deleting builtin commands with the +.B \-f +and +.B \-d +options to the +.B enable +builtin command +.IP \(bu +Using the \fBenable\fP builtin command to enable disabled shell builtins +.IP \(bu +specifying the +.B \-p +option to the +.B command +builtin command +.IP \(bu +turning off restricted mode with +\fBset +r\fP or \fBset +o restricted\fP. +.PP +These restrictions are enforced after any startup files are read. +.PP +When a command that is found to be a shell script is executed (see +.SM +.B "COMMAND EXECUTION" +above), +.B rbash +turns off any restrictions in the shell spawned to execute the +script. +.\" end of rbash.1 +.if \n(zY=1 .ig zY +.SH "SEE ALSO" +.PD 0 +.TP +\fIBash Reference Manual\fP, Brian Fox and Chet Ramey +.TP +\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey +.TP +\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey +.TP +\fIPortable Operating System Interface (POSIX) Part 2: Shell and Utilities\fP, IEEE +.TP +\fIsh\fP(1), \fIksh\fP(1), \fIcsh\fP(1) +.TP +\fIemacs\fP(1), \fIvi\fP(1) +.TP +\fIreadline\fP(3) +.PD +.SH FILES +.PD 0 +.TP +.FN /bin/bash +The \fBbash\fP executable +.TP +.FN /etc/profile +The systemwide initialization file, executed for login shells +.TP +.FN ~/.bash_profile +The personal initialization file, executed for login shells +.TP +.FN ~/.bashrc +The individual per-interactive-shell startup file +.TP +.FN ~/.bash_logout +The individual login shell cleanup file, executed when a login shell exits +.TP +.FN ~/.inputrc +Individual \fIreadline\fP initialization file +.PD +.SH AUTHORS +Brian Fox, Free Software Foundation +.br +bfox@gnu.org +.PP +Chet Ramey, Case Western Reserve University +.br +chet@po.CWRU.Edu +.SH BUG REPORTS +If you find a bug in +.B bash, +you should report it. But first, you should +make sure that it really is a bug, and that it appears in the latest +version of +.BR bash . +The latest version is always available from +\fIftp://ftp.gnu.org/pub/bash/\fP. +.PP +Once you have determined that a bug actually exists, use the +.I bashbug +command to submit a bug report. +If you have a fix, you are encouraged to mail that as well! +Suggestions and `philosophical' bug reports may be mailed +to \fIbug-bash@gnu.org\fP or posted to the Usenet +newsgroup +.BR gnu.bash.bug . +.PP +ALL bug reports should include: +.PP +.PD 0 +.TP 20 +The version number of \fBbash\fR +.TP +The hardware and operating system +.TP +The compiler used to compile +.TP +A description of the bug behaviour +.TP +A short script or `recipe' which exercises the bug +.PD +.PP +.I bashbug +inserts the first three items automatically into the template +it provides for filing a bug report. +.PP +Comments and bug reports concerning +this manual page should be directed to +.IR chet@po.CWRU.Edu . +.SH BUGS +.PP +It's too big and too slow. +.PP +There are some subtle differences between +.B bash +and traditional versions of +.BR sh , +mostly because of the +.SM +.B POSIX +specification. +.PP +Aliases are confusing in some uses. +.PP +Shell builtin commands and functions are not stoppable/restartable. +.PP +Compound commands and command sequences of the form `a ; b ; c' +are not handled gracefully when process suspension is attempted. +When a process is stopped, the shell immediately executes the next +command in the sequence. +It suffices to place the sequence of commands between +parentheses to force it into a subshell, which may be stopped as +a unit. +.PP +Commands inside of \fB$(\fP...\fB)\fP command substitution are not +parsed until substitution is attempted. This will delay error +reporting until some time after the command is entered. +.PP +Array variables may not (yet) be exported. +.zZ +.zY diff --git a/doc/bash.html b/doc/bash.html index 2cfb6547..c19bc7be 100644 --- a/doc/bash.html +++ b/doc/bash.html @@ -642,7 +642,6 @@ command: -  

SHELL GRAMMAR

@@ -5411,7 +5410,7 @@ the version of bash (e.g., 2.00)
\V
-the release of bash, version + patchelvel (e.g., 2.00.0) +the release of bash, version + patch level (e.g., 2.00.0)
\w
@@ -11355,6 +11354,6 @@ Array variables may not (yet) be exported.
This document was created by man2html from bash.1.
-Time: 29 June 2004 10:37:49 EDT +Time: 19 July 2004 16:04:22 EDT diff --git a/doc/bash.pdf b/doc/bash.pdf index 0d7436b5950a14952a369708d7d649a8ffa0524e..9a671a1ace62e7f99e7e697390eac53bb5142c02 100644 GIT binary patch literal 308031 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%0ATZfG(bCTI5L#46Rae};^14nhchM1x`v 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

S=^2EKrD!m!nODulEP5;Mp)_xsLP7-RfZWEHxqY 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 z

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

kBZB{F)|-Qovi(v{E$V%Zpwh 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 MZ+v6;%_IE(7gaZ!`2YX_ diff --git a/doc/bash.ps b/doc/bash.ps index 2c086e6e..f2686220 100644 --- a/doc/bash.ps +++ b/doc/bash.ps @@ -1,6 +1,6 @@ %!PS-Adobe-3.0 %%Creator: groff version 1.18.1 -%%CreationDate: Tue Jun 29 10:37:28 2004 +%%CreationDate: Mon Jul 19 16:03:47 2004 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Times-Italic @@ -3625,15 +3625,16 @@ F1(\\@)144 156 Q F0(the current time in 12-hour am/pm format)23.92 E F1 144 180 Q F0(the username of the current user)27.66 E F1(\\v)144 192 Q F0(the v)28.22 E(ersion of)-.15 E F1(bash)2.5 E F0(\(e.g., 2.00\))2.5 E F1(\\V)144 204 Q F0(the release of)26 E F1(bash)2.5 E F0 2.5(,v)C -(ersion + patchelv)-2.65 E(el \(e.g., 2.00.0\))-.15 E F1(\\w)144 216 Q -F0(the current w)26 E(orking directory)-.1 E 2.5(,w)-.65 G(ith)-2.5 E F1 -($HOME)2.5 E F0(abbre)2.5 E(viated with a tilde)-.25 E F1(\\W)144 228 Q -F0(the basename of the current w)23.22 E(orking directory)-.1 E 2.5(,w) --.65 G(ith)-2.5 E F1($HOME)2.5 E F0(abbre)2.5 E(viated with a tilde)-.25 -E F1(\\!)144 240 Q F0(the history number of this command)29.89 E F1(\\#) -144 252 Q F0(the command number of this command)28.22 E F1(\\$)144 264 Q -F0(if the ef)28.22 E(fecti)-.25 E .3 -.15(ve U)-.25 H(ID is 0, a).15 E -F1(#)2.5 E F0 2.5(,o)C(therwise a)-2.5 E F1($)2.5 E(\\)144 276 Q/F2 10 +(ersion + patch le)-2.65 E -.15(ve)-.25 G 2.5(l\().15 G(e.g., 2.00.0\)) +-2.5 E F1(\\w)144 216 Q F0(the current w)26 E(orking directory)-.1 E 2.5 +(,w)-.65 G(ith)-2.5 E F1($HOME)2.5 E F0(abbre)2.5 E(viated with a tilde) +-.25 E F1(\\W)144 228 Q F0(the basename of the current w)23.22 E +(orking directory)-.1 E 2.5(,w)-.65 G(ith)-2.5 E F1($HOME)2.5 E F0 +(abbre)2.5 E(viated with a tilde)-.25 E F1(\\!)144 240 Q F0 +(the history number of this command)29.89 E F1(\\#)144 252 Q F0 +(the command number of this command)28.22 E F1(\\$)144 264 Q F0 +(if the ef)28.22 E(fecti)-.25 E .3 -.15(ve U)-.25 H(ID is 0, a).15 E F1 +(#)2.5 E F0 2.5(,o)C(therwise a)-2.5 E F1($)2.5 E(\\)144 276 Q/F2 10 /Times-Italic@0 SF(nnn)A F0 (the character corresponding to the octal number)18.22 E F2(nnn)2.5 E F1 (\\\\)144 288 Q F0 2.5(ab)30.44 G(ackslash)-2.5 E F1(\\[)144 300 Q F0 diff --git a/doc/bashref.dvi b/doc/bashref.dvi index 333e9c48f61ae37d96919099485d44d4b84612b4..f8894897384e7b962eb6ee6896ccf40b499f7454 100644 GIT binary patch delta 1957 zcmZ9Mc~DhV9LM>dbMJkR`|k39j4(vZ3Q<8eAE~8iF6kKHMCLM#8nBYJ5^^--JGiNh^Yag5V!m_IT+FJ9y};EB!8{>G3N+ELn}kZ#RvYT`(sw2CpEa zXBpozDJj+8M*K+$2`RDhE4O)*lS@iNLxyGL<`FI`tmH0(Ukx8u%=5sj87-n~myr9#Qdb;G?g`G8D9- z)PQgQTpfo3J5J2gQDmdsx{6@-{mp>UcvHt&oAtY1>cO$ViFsCGD&6L!uQjfu+#(EVwnyv17h$ zWa>Cb#nbS;j&vJ-Fb@ePV(G*Ra06>djQygHa*C;dZla|v)Q@KD2AOQv9g01KT^d?# z+VKqf2V)D3tw+5F(KdYjXXFO6rn_|h8r%jp&`CjBu>&gB(l>5irJ>9=V*Xu- zI`A?DLn%FyCu`{7FnhZ3H7bTvMlzQ<9=1)w5*|g%eZ10xNb(Kh<25$$u0wsD&M6q< zXweux-NZ15c_NS38e-bNyussi>})qA%9UuiNc&dtp$3-P@!xjyPSj@uPgHT7rf%Z} zI+EeO{wt z0adBeL<4U)%(D?vv4L}REJpHZSpA==P*bE}tS8Si(lFgVP~n!CRU|DNA$2#=k#>xg zRMWn0;nvBeQUqPilier-1-%uyZD)bFsg!~}E1Z+$B@dyHb|L3_%&SSW5^*UM55kNr4=TkWNnwMege z@Gv#smcn%Gcu=J?rMToe6}99Im7i5`&S926BEKc$QPQI1Hx-<5n0=4So7~8t>^S*j z54t(b;68GQN1W%;gXM)PIysD%A=hhIM_0zndsKY(z(iX6t7Vz$C&{XcsTEB#WF4RW z-$pNxPim;5Ys=;2P<;M>Jz<^vvW}~?ce{Kt7>obYBx+v{Miy<}CpSo#+HPp$K^Z18 zY13(WmyUcpE?^H@dr?j`(3wuR$fV*uhdF**u5@9PRRkpm18mVcQi&ulQ^p$DOjEpy z_0Mw|Znc}81U<8|`L@PdVqochqT+@}-Ifdsf2y$g$BnnJGrFsP`yk zv&=H@SaqXCdlRL-q}(v!qTZ90eI}c9#}eQLdah8Z_F^yHEmo#@QDeg|%auz8dRgl$ zM9*AnzsL174cMyeH*j<}DP2Nw*k&&uQF6WF$*cKJ`NPBt8{WR6eC)*%+VZCo5hC6o z(L3CQV(WaUD@WYEXTn?qMnbaYzapB0EzykHJ<&BWO8j5;0)e{Gp#`p#;V7ZM4!c^@ taDcA5-NRE6AYYohF@g=aOP$8Kw~j;u9opi~P87jz=iSXv!r71F`y1U#*mD2? delta 1965 zcmYk6c~n$Y9LN3M``(+Gw+?72iYQ_!2s$`8Aexe<9Zf@1D>WC6;L;(N)X3~ubTH2` z7j(*pmZX+oVrdS{uPnC%Zl_J~gci88P)Z%c)KXjQ%}nB(|L*7Wy}$drcka8ZDica7 z6N=+qzTSQNXQq0*>Ha-i64#CUkhken<98q{D&^T3slC^1UA-QKvrms)JU1^e9@F3s z;p7dxY-V4dKSccpS^MOa(m4zL!*b^=nlo>%-`m@h{HBndpP#dEk$>_0;?d`Fa~9?0 z`tM9&Jc*?&_4nq3g;24;GyHjxF&_BY*^+{zfiu1V9#Ej&tl@odH86QYp^Qv(Yl+Y{ z(6XgT$ESh%-AxQtVdQVwA_PwDJtE`Hz{dR(nLoZ^Kp^E%frh%k_Ag%4P!x)_H?xB1 z8kpEn?qUrHu%_!8zO#uwSJx>x9XR~&Un;h=@&x)*!AuQr(bO0m(eQxHOznXRh4tX1 zc#$2AW}A9r7~BRjscbw(s90_@NjVs!;VW7?7vE}_WHZGt!egKx9exd5x3$ncxCtFK zyi1+Rp&7Upo@>DS#dSK7#VS?ouo)W7 zvJ6b28&9zu1E+1qpU=Ds`qQxjmTI6ZY{;s1pNcc&^Rv%n+|wG5r_56JlZx*szJe9V ztfGxg)m5=Bnz3Z{+rPJIvwHQq=%|O!rlpw+8kvVY)hwW)))tPfWy2Lz(~L$oNyQMG z`Qsv6BV#iyzseqzk!v%z|6$cK%Bb4OcdOWDGZpvn4U+zted&H?RJ7QSiemW{1@X4* z2R-@gGA7VaFBdtwg$+&j@e>MqQqmAUIn)kHSqIaCU1w z&1-aP3+JEXDH;y6nm8I##OJB{ul9C)p>{l`o482Vin*X;U1VkV+x$`4I_hcf@q7(~ zB2_HdIY|6T4HY!8hBv9mxGQL3Enh4njxIIu**cEf%&X1(mW)&?yv`G4Om8)@bnZ5< zk@c1KmeRv5(FIvZ(D8~bn;s*q(D4Hu>>(&BO7EKTf4zbWJL&d7;bHC0owRz5r58pD zNe1qx?Gpvr`2X{!W3z>hZey)|%?wZELUdgstWt3}QrgPJ(Anj}Tn(#elwTMxq8C{Y z#PjX&GIe}k=&RypD49-09}7D*BvYSbLXiPI0)MF&nicq|{(B)`iM&AR^ulFfhJtQ% z?xxUI!~RgxM?D>4gN#}dqQ#*Seu%(j9mGNrJ%VxKQVHiHY;SjQn-i01LW;OcL0SZ6 z^cSNP>*|kuNPI~~Vi*Rq#YPqH(b>u3KG_`G%sZH#&0;*AoGHpO3d$SiiyHQsg_U9k zwOb~hRPhNltrWe{sENR_o5iUbZqS~c;z<|Ql9jyI`sb+RfcT?;g3u!E%{Oj}z35=I zSg+$L+E6D}X;|E9l4(Jv7xVnW0D1 z8mCcGoK&IUYpPF_`l!~)g<+;os#nlNQA4CpWVD2!H#l0V=GbM{jIoNnLy2RhcSSbV zX@2#%HU7Z-@RHPtvY(K?G0>J0XGsSPHp>~NrbRPoV1ZQW#&No`LVDVblQy%vMEYLG z0CRo0RcJv-3?%Ok>5z_kx)zk;qj4$%A3GuCxvi(|qi>`e228S&7u_hPO}C_&C@hJD zS`y?sb;2@>rP01+j*uSg%;XZ=FCa8g0W|u&5#n - + + +

- +
digit-argument (M-0, M-1, ... M--) -
+
Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.

- +

universal-argument () -
+
This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. @@ -1662,30 +1670,30 @@ By default, this is not bound to a key.

- +
complete (TAB) -
+
Attempt to perform completion on the text before point. The actual completion performed is application-specific. The default is filename completion.

- +

possible-completions (M-?) -
+
List the possible completions of the text before point.

- +

insert-completions (M-*) -
+
Insert all completions of the text before point that would have been generated by possible-completions.

- +

menu-complete () -
+
Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list @@ -1700,9 +1708,9 @@ This command is intended to be bound to TAB, but is unbound by default.

- +

delete-char-or-list () -
+
Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to @@ -1731,22 +1739,22 @@ This command is unbound by default.
- +
start-kbd-macro (C-x () -
+
Begin saving the characters typed into the current keyboard macro.

- +

end-kbd-macro (C-x )) -
+
Stop saving the characters typed into the current keyboard macro and save the definition.

- +

call-last-kbd-macro (C-x e) -
+
Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.

@@ -1772,87 +1780,87 @@ in the macro appear as if typed at the keyboard.

- +
re-read-init-file (C-x C-r) -
+
Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.

- +

abort (C-g) -
+
Abort the current editing command and ring the terminal's bell (subject to the setting of bell-style).

- +

do-uppercase-version (M-a, M-b, M-x, ...) -
+
If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.

- +

prefix-meta (ESC) -
+
Metafy the next character typed. This is for keyboards without a meta key. Typing `ESC f' is equivalent to typing M-f.

- +

undo (C-_ or C-x C-u) -
+
Incremental undo, separately remembered for each line.

- +

revert-line (M-r) -
+
Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.

- +

tilde-expand (M-~) -
+
Perform tilde expansion on the current word.

- +

set-mark (C-@) -
+
Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.

- +

exchange-point-and-mark (C-x C-x) -
+
Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.

- +

character-search (C-]) -
+
A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.

- +

character-search-backward (M-C-]) -
+
A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.

- +

insert-comment (M-#) -
+
Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if @@ -1863,43 +1871,43 @@ the line. In either case, the line is accepted as if a newline had been typed.

- +

dump-functions () -
+
Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-variables () -
+
Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-macros () -
+
Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

emacs-editing-mode (C-e) -
+
When in vi command mode, this causes a switch to emacs editing mode.

- +

vi-editing-mode (M-C-j) -
+
When in emacs editing mode, this causes a switch to vi editing mode.

@@ -1950,7 +1958,7 @@ in the consitency of user interface across discrete programs that need to provide a command line interface.

-Copyright (C) 1988-2002 Free Software Foundation, Inc. +Copyright (C) 1988-2004 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of @@ -2034,8 +2042,8 @@ the simplest way possible, perhaps to replace calls in your code to gets() or fgets().

- - + +

The function readline() prints a prompt prompt @@ -2349,7 +2357,7 @@ and a non-zero value if some error occurs. These variables are available to function writers.

- +

Variable: char * rl_line_buffer
This is the line gathered so far. You are welcome to modify the @@ -2359,7 +2367,7 @@ the memory allocated to rl_line_buffer.

- +

Variable: int rl_point
The offset of the current cursor position in rl_line_buffer @@ -2367,7 +2375,7 @@ the memory allocated to rl_line_buffer.

- +

Variable: int rl_end
The number of characters present in rl_line_buffer. When @@ -2376,7 +2384,7 @@ the memory allocated to rl_line_buffer.

- +

Variable: int rl_mark
The mark (saved position) in the current line. If set, the mark @@ -2384,7 +2392,7 @@ and point define a region.

- +

Variable: int rl_done
Setting this to a non-zero value causes Readline to return the current @@ -2392,7 +2400,7 @@ line immediately.

- +

Variable: int rl_num_chars_to_read
Setting this to a positive value before calling readline() causes @@ -2401,7 +2409,7 @@ than reading up to a character bound to accept-line.

- +

Variable: int rl_pending_input
Setting this to a value makes it the next keystroke read. This is a @@ -2409,7 +2417,7 @@ way to stuff a single character into the input stream.

- +

Variable: int rl_dispatching
Set to a non-zero value if a function is being called from a key binding; @@ -2418,7 +2426,7 @@ they were called directly or by Readline's dispatching mechanism.

- +

Variable: int rl_erase_empty_line
Setting this to a non-zero value causes Readline to completely erase @@ -2428,7 +2436,7 @@ the beginning of the newly-blank line.

- +

Variable: char * rl_prompt
The prompt Readline uses. This is set from the argument to @@ -2438,7 +2446,7 @@ be used to modify the prompt string after calling readline().

- +

Variable: int rl_already_prompted
If an application wishes to display the prompt itself, rather than have @@ -2451,14 +2459,14 @@ never sets it.

- +

Variable: const char * rl_library_version
The version number of this revision of the library.

- +

Variable: int rl_readline_version
An integer encoding the current version of the library. The encoding is @@ -2469,7 +2477,7 @@ value 0x0402.

- +

Variable: int rl_gnu_readline_p
Always set to 1, denoting that this is GNU readline rather than some @@ -2477,7 +2485,7 @@ emulation.

- +

Variable: const char * rl_terminal_name
The terminal type, used for initialization. If not set by the application, @@ -2486,7 +2494,7 @@ the first time it is called.

- +

Variable: const char * rl_readline_name
This variable is set to a unique name by each application using Readline. @@ -2495,7 +2503,7 @@ The value allows conditional parsing of the inputrc file

- +

Variable: FILE * rl_instream
The stdio stream from which Readline reads input. @@ -2503,7 +2511,7 @@ If NULL, Readline defaults to stdin.

- +

Variable: FILE * rl_outstream
The stdio stream to which Readline performs output. @@ -2511,7 +2519,7 @@ If NULL, Readline defaults to stdout.

- +

Variable: rl_command_func_t * rl_last_func
The address of the last command function Readline executed. May be used to @@ -2520,7 +2528,7 @@ example.

- +

Variable: rl_hook_func_t * rl_startup_hook
If non-zero, this is the address of a function to call just @@ -2528,7 +2536,7 @@ before readline prints the first prompt.

- +

Variable: rl_hook_func_t * rl_pre_input_hook
If non-zero, this is the address of a function to call after @@ -2537,7 +2545,7 @@ starts reading input characters.

- +

Variable: rl_hook_func_t * rl_event_hook
If non-zero, this is the address of a function to call periodically @@ -2547,7 +2555,7 @@ is no keyboard input.

- +

Variable: rl_getc_func_t * rl_getc_function
If non-zero, Readline will call indirectly through this pointer @@ -2557,7 +2565,7 @@ to get a character from the input stream. By default, it is set to

- +

Variable: rl_voidfunc_t * rl_redisplay_function
If non-zero, Readline will call indirectly through this pointer @@ -2567,7 +2575,7 @@ redisplay function (see section 2.4.6 Redisplay

- +

Variable: rl_vintfunc_t * rl_prep_term_function
If non-zero, Readline will call indirectly through this pointer @@ -2578,7 +2586,7 @@ By default, this is set to rl_prep_terminal

- +

Variable: rl_voidfunc_t * rl_deprep_term_function
If non-zero, Readline will call indirectly through this pointer @@ -2589,7 +2597,7 @@ By default, this is set to rl_deprep_terminal

- +

Variable: Keymap rl_executing_keymap
This variable is set to the keymap (see section 2.4.2 Selecting a Keymap) in which the @@ -2597,7 +2605,7 @@ currently executing readline function was found.

- +

Variable: Keymap rl_binding_keymap
This variable is set to the keymap (see section 2.4.2 Selecting a Keymap) in which the @@ -2605,14 +2613,14 @@ last key binding occurred.

- +

Variable: char * rl_executing_macro
This variable is set to the text of any currently-executing macro.

- +

Variable: int rl_readline_state
A variable with bit values that encapsulate the current Readline state. @@ -2668,7 +2676,7 @@ and is about to return the line to the caller.

- +

Variable: int rl_explicit_arg
Set to a non-zero value if an explicit numeric argument was specified by @@ -2676,7 +2684,7 @@ the user. Only valid in a bindable command function.

- +

Variable: int rl_numeric_arg
Set to the value of any numeric argument explicitly specified by the user @@ -2685,7 +2693,7 @@ command function.

- +

Variable: int rl_editing_mode
Set to a value denoting Readline's current editing mode. A value of @@ -2763,7 +2771,7 @@ programmer, should bind the functions you write to descriptive names as well. Readline provides a function for doing that:

- +

Function: int rl_add_defun (const char *name, rl_command_func_t *function, int key)
Add name to the list of named functions. Make function be @@ -2803,7 +2811,7 @@ get run. You can make your own keymaps, copy existing keymaps, and tell Readline which keymap to use.

- +

Function: Keymap rl_make_bare_keymap (void)
Returns a new, empty keymap. The space for the keymap is allocated with @@ -2812,14 +2820,14 @@ Readline which keymap to use.

- +

Function: Keymap rl_copy_keymap (Keymap map)
Return a new keymap which is a copy of map.

- +

Function: Keymap rl_make_keymap (void)
Return a new keymap with the printing characters bound to rl_insert, @@ -2828,7 +2836,7 @@ the Meta digits bound to produce numeric arguments.

- +

Function: void rl_discard_keymap (Keymap keymap)
Free the storage associated with keymap. @@ -2839,21 +2847,21 @@ Readline has several internal keymaps. These functions allow you to change which keymap is active.

- +

Function: Keymap rl_get_keymap (void)
Returns the currently active keymap.

- +

Function: void rl_set_keymap (Keymap keymap)
Makes keymap the currently active keymap.

- +

Function: Keymap rl_get_keymap_by_name (const char *name)
Return the keymap matching name. name is one which would @@ -2861,7 +2869,7 @@ be supplied in a set keymap inputrc line (see section +
Function: char * rl_get_keymap_name (Keymap keymap)
Return the name matching keymap. name is one which would @@ -2906,7 +2914,7 @@ initialization function assigned to the rl_startup_hook variable These functions manage key bindings.

- +

Function: int rl_bind_key (int key, rl_command_func_t *function)
Binds key to function in the currently active keymap. @@ -2914,7 +2922,7 @@ Returns non-zero in the case of an invalid key.

- +

Function: int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map)
Bind key to function in map. @@ -2922,7 +2930,7 @@ Returns non-zero in the case of an invalid key.

- +

Function: int rl_bind_key_if_unbound (int key, rl_command_func_t *function)
Binds key to function if it is not already bound in the @@ -2932,7 +2940,7 @@ already bound.

- +

Function: int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map)
Binds key to function if it is not already bound in map. @@ -2941,7 +2949,7 @@ already bound.

- +

Function: int rl_unbind_key (int key)
Bind key to the null function in the currently active keymap. @@ -2949,7 +2957,7 @@ Returns non-zero in case of error.

- +

Function: int rl_unbind_key_in_map (int key, Keymap map)
Bind key to the null function in map. @@ -2957,21 +2965,21 @@ Returns non-zero in case of error.

- +

Function: int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map)
Unbind all keys that execute function in map.

- +

Function: int rl_unbind_command_in_map (const char *command, Keymap map)
Unbind all keys that are bound to command in map.

- +

Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function)
Bind the key sequence represented by the string keyseq to the function @@ -2981,7 +2989,7 @@ The return value is non-zero if keyseq is invalid.

- +

Function: int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
Bind the key sequence represented by the string keyseq to the function @@ -2991,14 +2999,14 @@ The return value is non-zero if keyseq is invalid.

- +

Function: int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map)
Equivalent to rl_bind_keyseq_in_map.

- +

Function: int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function)
Binds keyseq to function if it is not already bound in the @@ -3008,7 +3016,7 @@ already bound.

- +

Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
Binds keyseq to function if it is not already bound in map. @@ -3017,7 +3025,7 @@ already bound.

- +

Function: int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
Bind the key sequence represented by the string keyseq to the arbitrary @@ -3028,7 +3036,7 @@ necessary. The initial keymap in which to do bindings is map.

- +

Function: int rl_parse_and_bind (char *line)
Parse line as if it had been read from the inputrc file and @@ -3037,7 +3045,7 @@ perform any key bindings and variable assignments found

- +

Function: int rl_read_init_file (const char *filename)
Read keybindings and variable assignments from filename @@ -3068,14 +3076,14 @@ and the functions invoked by a particular key sequence. You may also associate a new function name with an arbitrary function.

- +

Function: rl_command_func_t * rl_named_function (const char *name)
Return the function with name name.

- +

Function: rl_command_func_t * rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
Return the function invoked by keyseq in keymap map. @@ -3085,7 +3093,7 @@ it points to (one of ISFUNC, ISKMAP, or ISMACR

- +

Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
Return an array of strings representing the key sequences used to @@ -3093,7 +3101,7 @@ invoke function in the current keymap.

- +

Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
Return an array of strings representing the key sequences used to @@ -3101,7 +3109,7 @@ invoke function in the keymap map.

- +

Function: void rl_function_dumper (int readable)
Print the readline function names and the key sequences currently @@ -3111,14 +3119,14 @@ the list is formatted in such a way that it can be made part of an

- +

Function: void rl_list_funmap_names (void)
Print the names of all bindable Readline functions to rl_outstream.

- +

Function: const char ** rl_funmap_names (void)
Return a NULL terminated array of known function names. The array is @@ -3127,7 +3135,7 @@ should free() the array when you are done, but not the pointers.

- +

Function: int rl_add_funmap_entry (const char *name, rl_command_func_t *function)
Add name to the list of bindable Readline command names, and make @@ -3182,7 +3190,7 @@ tells what to undo, not how to undo it. UNDO_BEGIN and rl_end_undo_group().

- +

Function: int rl_begin_undo_group (void)
Begins saving undo information in a group construct. The undo @@ -3192,7 +3200,7 @@ information usually comes from calls to rl_insert_text() and

- +

Function: int rl_end_undo_group (void)
Closes the current undo group started with rl_begin_undo_group @@ -3201,7 +3209,7 @@ for each call to rl_begin_undo_group().

- +

Function: void rl_add_undo (enum undo_code what, int start, int end, char *text)
Remember how to undo an event (according to what). The affected @@ -3209,14 +3217,14 @@ text runs from start to end, and encompasses text

- +

Function: void rl_free_undo_list (void)
Free the existing undo list.

- +

Function: int rl_do_undo (void)
Undo the first thing on the undo list. Returns 0 if there was @@ -3230,7 +3238,7 @@ once, just before you modify the text. You must supply the indices of the text range that you are going to modify.

- +

Function: int rl_modifying (int start, int end)
Tell Readline to save the text between start and end as a @@ -3257,7 +3265,7 @@ that text.

- +

Function: void rl_redisplay (void)
Change what's displayed on the screen to reflect the current contents @@ -3265,7 +3273,7 @@ of rl_line_buffer.

- +

Function: int rl_forced_update_display (void)
Force the line to be updated and redisplayed, whether or not @@ -3273,7 +3281,7 @@ Readline thinks the screen display is correct.

- +

Function: int rl_on_new_line (void)
Tell the update functions that we have moved onto a new (empty) line, @@ -3281,7 +3289,7 @@ usually after ouputting a newline.

- +

Function: int rl_on_new_line_with_prompt (void)
Tell the update functions that we have moved onto a new line, with @@ -3293,7 +3301,7 @@ It should be used after setting rl_already_prompted.

- +

Function: int rl_reset_line_state (void)
Reset the display state to a clean state and redisplay the current line @@ -3301,14 +3309,14 @@ starting on a new line.

- +

Function: int rl_crlf (void)
Move the cursor to the start of the next screen line.

- +

Function: int rl_show_char (int c)
Display character c on rl_outstream. @@ -3319,7 +3327,7 @@ redisplay.

- +

Function: int rl_message (const char *, ...)
The arguments are a format string as would be supplied to printf, @@ -3330,14 +3338,14 @@ is also used to display numeric arguments and search strings.

- +

Function: int rl_clear_message (void)
Clear the message in the echo area.

- +

Function: void rl_save_prompt (void)
Save the local Readline prompt display state in preparation for @@ -3345,7 +3353,7 @@ displaying a new message in the message area with rl_message().

- +

Function: void rl_restore_prompt (void)
Restore the local Readline prompt display state saved by the most @@ -3353,7 +3361,7 @@ recent call to rl_save_prompt.

- +

Function: int rl_expand_prompt (char *prompt)
Expand any special character sequences in prompt and set up the @@ -3363,10 +3371,15 @@ expand the primary prompt if the rl_on_new_line_with_prompt() function or rl_already_prompted variable is used. It returns the number of visible characters on the last line of the (possibly multi-line) prompt. +Applications may indicate that the prompt contains characters that take +up no physical screen space when displayed by bracketing a sequence of +such characters with the special markers RL_PROMPT_START_IGNORE +and RL_PROMPT_END_IGNORE (declared in `readline.h'. This may +be used to embed terminal-specific escape sequences in prompts.

- +

Function: int rl_set_prompt (const char *prompt)
Make Readline use prompt for subsequent redisplay. This calls @@ -3393,7 +3406,7 @@ to the result.

- +

Function: int rl_insert_text (const char *text)
Insert text into the line at the current cursor position. @@ -3401,7 +3414,7 @@ Returns the number of characters inserted.

- +

Function: int rl_delete_text (int start, int end)
Delete the text between start and end in the current line. @@ -3409,7 +3422,7 @@ Returns the number of characters deleted.

- +

Function: char * rl_copy_text (int start, int end)
Return a copy of the text between start and end in @@ -3417,7 +3430,7 @@ the current line.

- +

Function: int rl_kill_text (int start, int end)
Copy the text between start and end in the current line @@ -3429,7 +3442,7 @@ not a kill, a new kill ring slot is used.

- +

Function: int rl_push_macro_input (char *macro)
Cause macro to be inserted into the line, as if it had been invoked @@ -3456,7 +3469,7 @@ by a key bound to a macro. Not especially useful; use

- +

Function: int rl_read_key (void)
Return the next character available from Readline's current input stream. @@ -3468,7 +3481,7 @@ the rl_event_hook variable.

- +

Function: int rl_getc (FILE *stream)
Return the next character available from stream, which is assumed to @@ -3476,7 +3489,7 @@ be the keyboard.

- +

Function: int rl_stuff_char (int c)
Insert c into the Readline input stream. It will be "read" @@ -3487,7 +3500,7 @@ before Readline attempts to read characters from the terminal with

- +

Function: int rl_execute_next (int c)
Make c be the next command to be executed when rl_read_key() @@ -3495,7 +3508,7 @@ is called. This sets rl_pending_input.

- +

Function: int rl_clear_pending_input (void)
Unset rl_pending_input, effectively negating the effect of any @@ -3504,7 +3517,7 @@ pending input has not already been read with rl_read_key().

- +

Function: int rl_set_keyboard_input_timeout (int u)
While waiting for keyboard input in rl_read_key(), Readline will @@ -3532,7 +3545,7 @@ one-tenth of a second. Returns the old timeout value.

- +

Function: void rl_prep_terminal (int meta_flag)
Modify the terminal settings for Readline's use, so readline() @@ -3542,7 +3555,7 @@ read eight-bit input.

- +

Function: void rl_deprep_terminal (void)
Undo the effects of rl_prep_terminal(), leaving the terminal in @@ -3551,7 +3564,7 @@ the state in which it was before the most recent call to

- +

Function: void rl_tty_set_default_bindings (Keymap kmap)
Read the operating system's terminal editing characters (as would be @@ -3560,7 +3573,7 @@ The bindings are performed in kmap.

- +

Function: void rl_tty_unset_default_bindings (Keymap kmap)
Reset the bindings manipulated by rl_tty_set_default_bindings so @@ -3569,7 +3582,7 @@ The bindings are performed in kmap.

- +

Function: int rl_reset_terminal (const char *terminal_name)
Reinitialize Readline's idea of the terminal settings using @@ -3597,7 +3610,7 @@ environment variable is used.

- +

Function: void rl_replace_line (const char *text, int clear_undo)
Replace the contents of rl_line_buffer with text. @@ -3607,7 +3620,7 @@ current line is cleared.

- +

Function: int rl_extend_line_buffer (int len)
Ensure that rl_line_buffer has enough space to hold len @@ -3615,7 +3628,7 @@ characters, possibly reallocating it if necessary.

- +

Function: int rl_initialize (void)
Initialize or re-initialize Readline's internal state. @@ -3624,21 +3637,21 @@ reading any input.

- +

Function: int rl_ding (void)
Ring the terminal bell, obeying the setting of bell-style.

- +

Function: int rl_alphabetic (int c)
Return 1 if c is an alphabetic character.

- +

Function: void rl_display_match_list (char **matches, int len, int max)
A convenience function for displaying a list of strings in @@ -3655,28 +3668,28 @@ The following are implemented as macros, defined in chardefs.h. Applications should refrain from using them.

- +

Function: int _rl_uppercase_p (int c)
Return 1 if c is an uppercase alphabetic character.

- +

Function: int _rl_lowercase_p (int c)
Return 1 if c is a lowercase alphabetic character.

- +

Function: int _rl_digit_p (int c)
Return 1 if c is a numeric character.

- +

Function: int _rl_to_upper (int c)
If c is a lowercase alphabetic character, return the corresponding @@ -3684,7 +3697,7 @@ uppercase character.

- +

Function: int _rl_to_lower (int c)
If c is an uppercase alphabetic character, return the corresponding @@ -3692,7 +3705,7 @@ lowercase character.

- +

Function: int _rl_digit_value (int c)
If c is a number, return the value it represents. @@ -3717,7 +3730,7 @@ lowercase character.

- +

Function: int rl_macro_bind (const char *keyseq, const char *macro, Keymap map)
Bind the key sequence keyseq to invoke the macro macro. @@ -3727,7 +3740,7 @@ use rl_generic_bind() instead.

- +

Function: void rl_macro_dumper (int readable)
Print the key sequences bound to macros and their values, using @@ -3737,7 +3750,7 @@ that it can be made part of an inputrc file and re-read.

- +

Function: int rl_variable_bind (const char *variable, const char *value)
Make the Readline variable variable have value. @@ -3747,7 +3760,7 @@ file (see section 1.3.1 Readline Init File Syntax<

- +

Function: void rl_variable_dumper (int readable)
Print the readline variable names and their current values @@ -3757,7 +3770,7 @@ that it can be made part of an inputrc file and re-read.

- +

Function: int rl_set_paren_blink_timeout (int u)
Set the time interval (in microseconds) that Readline waits when showing @@ -3765,7 +3778,7 @@ a balancing character when blink-matching-paren has been enabled.

- +

Function: char * rl_get_termcap (const char *cap)
Retrieve the string value of the termcap capability cap. @@ -3803,7 +3816,7 @@ also be invoked as a `callback' function from an event loop. There are functions available to make this easy.

- +

Function: void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
Set up the terminal for readline I/O and display the initial @@ -3813,7 +3826,7 @@ The function takes the text of the line as an argument.

- +

Function: void rl_callback_read_char (void)
Whenever an application determines that keyboard input is available, it @@ -3832,7 +3845,7 @@ the terminal settings are modified for Readline's use again.

- +

Function: void rl_callback_handler_remove (void)
Restore the terminal to its initial state and remove the line handler. @@ -3990,7 +4003,7 @@ values of these variables only when calling readline(), not in a signal handler, so Readline's internal signal state is not corrupted.

- +

Variable: int rl_catch_signals
If this variable is non-zero, Readline will install signal handlers for @@ -4002,7 +4015,7 @@ The default value of rl_catch_signals is 1.

- +

Variable: int rl_catch_sigwinch
If this variable is non-zero, Readline will install a signal handler for @@ -4020,7 +4033,7 @@ Readline provides convenience functions to do the necessary terminal and internal state cleanup upon receipt of a signal.

- +

Function: void rl_cleanup_after_signal (void)
This function will reset the state of the terminal to what it was before @@ -4030,7 +4043,7 @@ all signals, depending on the values of rl_catch_signals and

- +

Function: void rl_free_line_state (void)
This will free any partial state associated with the current input line @@ -4042,7 +4055,7 @@ current input line.

- +

Function: void rl_reset_after_signal (void)
This will reinitialize the terminal and reinstall any Readline signal @@ -4057,14 +4070,14 @@ Readline to update its idea of the terminal size when a SIGWINCH is received.

- +

Function: void rl_resize_terminal (void)
Update Readline's internal screen size by reading values from the kernel.

- +

Function: void rl_set_screen_size (int rows, int cols)
Set Readline's idea of the terminal size to rows rows and @@ -4077,7 +4090,7 @@ is still interested in the screen dimensions, Readline's idea of the screen size may be queried.

- +

Function: void rl_get_screen_size (int *rows, int *cols)
Return Readline's idea of the terminal's size in the @@ -4088,7 +4101,7 @@ variables pointed to by the arguments. The following functions install and remove Readline's signal handlers.

- +

Function: int rl_set_signals (void)
Install Readline's signal handler for SIGINT, SIGQUIT, @@ -4098,7 +4111,7 @@ The following functions install and remove Readline's signal handlers.

- +

Function: int rl_clear_signals (void)
Remove all of the Readline signal handlers installed by @@ -4211,7 +4224,7 @@ Such a generator function is referred to as an

- +

Function: int rl_complete (int ignore, int invoking_key)
Complete the word at or before point. You have supplied the function @@ -4220,7 +4233,7 @@ that does the initial simple matching selection algorithm (see

- +

Variable: rl_compentry_func_t * rl_completion_entry_function
This is a pointer to the generator function for @@ -4256,7 +4269,7 @@ Here is the complete list of callable completion functions present in Readline.

- +

Function: int rl_complete_internal (int what_to_do)
Complete the word at or before point. what_to_do says what to do @@ -4270,7 +4283,7 @@ a common prefix.

- +

Function: int rl_complete (int ignore, int invoking_key)
Complete the word at or before point. You have supplied the function @@ -4282,7 +4295,7 @@ argument depending on invoking_key.

- +

Function: int rl_possible_completions (int count, int invoking_key)
List the possible completions. See description of rl_complete @@ -4291,7 +4304,7 @@ argument depending on invoking_key.

- +

Function: int rl_insert_completions (int count, int invoking_key)
Insert the list of possible completions into the line, deleting the @@ -4300,7 +4313,7 @@ This calls rl_complete_internal() with an argument of `*'

- +

Function: int rl_completion_mode (rl_command_func_t *cfunc)
Returns the apppriate value to pass to rl_complete_internal() @@ -4312,7 +4325,7 @@ the same interface as rl_complete().

- +

Function: char ** rl_completion_matches (const char *text, rl_compentry_func_t *entry_func)
Returns an array of strings which is a list of completions for @@ -4330,7 +4343,7 @@ when there are no more matches.

- +

Function: char * rl_filename_completion_function (const char *text, int state)
A generator function for filename completion in the general case. @@ -4341,7 +4354,7 @@ Readline functions).

- +

Function: char * rl_username_completion_function (const char *text, int state)
A completion generator for usernames. text contains a partial @@ -4369,7 +4382,7 @@ for subsequent calls.

- +

Variable: rl_compentry_func_t * rl_completion_entry_function
A pointer to the generator function for rl_completion_matches(). @@ -4378,7 +4391,7 @@ the default filename completer.

- +

Variable: rl_completion_func_t * rl_attempted_completion_function
A pointer to an alternative function to create matches. @@ -4395,7 +4408,7 @@ completion even if this function returns no matches.

- +

Variable: rl_quote_func_t * rl_filename_quoting_function
A pointer to a function that will quote a filename in an @@ -4412,7 +4425,7 @@ to reset this character.

- +

Variable: rl_dequote_func_t * rl_filename_dequoting_function
A pointer to a function that will remove application-specific quoting @@ -4425,7 +4438,7 @@ that delimits the filename (usually `'' or `"'). If

- +

Variable: rl_linebuf_func_t * rl_char_is_quoted_p
A pointer to a function to call that determines whether or not a specific @@ -4438,7 +4451,7 @@ used to break words for the completer.

- +

Variable: rl_compignore_func_t * rl_ignore_some_completions_function
This function, if defined, is called by the completer when real filename @@ -4451,7 +4464,7 @@ from the array must be freed.

- +

Variable: rl_icppfunc_t * rl_directory_completion_hook
This function, if defined, is allowed to modify the directory portion @@ -4467,7 +4480,7 @@ It could be used to expand symbolic links or shell variables in pathnames.

- +

Variable: rl_compdisp_func_t * rl_completion_display_matches_hook
If non-zero, then this is the address of a function to call when @@ -4484,7 +4497,7 @@ function may be called from this hook.

- +

Variable: const char * rl_basic_word_break_characters
The basic list of characters that signal a break between words for the @@ -4494,14 +4507,14 @@ which break words for completion in Bash:

- +

Variable: const char * rl_basic_quote_characters
A list of quote characters which can cause a word break.

- +

Variable: const char * rl_completer_word_break_characters
The list of characters that signal a break between words for @@ -4510,7 +4523,19 @@ which break words for completion in Bash:

- + +

+
Variable: rl_cpvfunc_t * rl_completion_word_break_hook +
If non-zero, this is the address of a function to call when Readline is +deciding where to separate words for word completion. It should return +a character string like rl_completer_word_break_characters to be +used to perform the current completion. The function may choose to set +rl_completer_word_break_characters itself. If the function +returns NULL, rl_completer_word_break_characters is used. +
+

+ +

Variable: const char * rl_completer_quote_characters
A list of characters which can be used to quote a substring of the line. @@ -4520,7 +4545,7 @@ unless they also appear within this list.

- +

Variable: const char * rl_filename_quote_characters
A list of characters that cause a filename to be quoted by the completer @@ -4528,7 +4553,7 @@ when they appear in a completed filename. The default is the null string.

- +

Variable: const char * rl_special_prefixes
The list of characters that are word break characters, but should be @@ -4539,7 +4564,7 @@ shell variables and hostnames.

- +

Variable: int rl_completion_query_items
Up to this many items will be displayed in response to a @@ -4548,7 +4573,7 @@ she wants to see them all. The default value is 100.

- +

Variable: int rl_completion_append_character
When a single completion alternative matches at the end of the command @@ -4561,17 +4586,47 @@ an application-specific command line syntax specification.

- +

Variable: int rl_completion_suppress_append
If non-zero, rl_completion_append_character is not appended to -matches at the end of the command line, as described above. It is -set to 0 before any application-specific completion function is called, -and may only be changed within such a function. +matches at the end of the command line, as described above. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function.

- + +

+
Variable: int rl_completion_quote_character +
When Readline is completing quoted text, as delimited by one of the +characters in rl_completer_quote_characters, it sets this variable +to the quoting character found. +This is set before any application-specific completion function is called. +
+

+ + +

+
Variable: int rl_completion_suppress_quote +
If non-zero, Readline does not append a matching quote character when +performing completion on a quoted string. +It is set to 0 before any application-specific completion function +is called, and may only be changed within such a function. +
+

+ + +

+
Variable: int rl_completion_found_quote +
When Readline is completing quoted text, it sets this variable +to a non-zero value if the word being completed contains or is delimited +by any quoting characters, including backslashes. +This is set before any application-specific completion function is called. +
+

+ +

Variable: int rl_completion_mark_symlink_dirs
If non-zero, a slash will be appended to completed filenames that are @@ -4586,7 +4641,7 @@ function modifies the value, the user's preferences are honored.

- +

Variable: int rl_ignore_completion_duplicates
If non-zero, then duplicates in the matches are removed. @@ -4594,7 +4649,7 @@ The default is 1.

- +

Variable: int rl_filename_completion_desired
Non-zero means that the results of the matches are to be treated as @@ -4608,7 +4663,7 @@ characters in rl_filename_quote_characters and

- +

Variable: int rl_filename_quoting_desired
Non-zero means that the results of the matches are to be quoted using @@ -4622,7 +4677,7 @@ by rl_filename_quoting_function.

- +

Variable: int rl_attempted_completion_over
If an application-specific completion function assigned to @@ -4633,7 +4688,7 @@ It should be set only by an application's completion function.

- +

Variable: int rl_completion_type
Set to a character describing the type of completion Readline is currently @@ -4645,7 +4700,7 @@ the same interface as rl_complete().

- +

Variable: int rl_inhibit_completion
If this variable is non-zero, completion is inhibited. The completion @@ -5156,7 +5211,7 @@ valid_argument (caller, arg)

- +

Version 1.2, November 2002
@@ -5726,7 +5781,7 @@ to permit their use in free software. editing command lines1.2.1 Readline Bare Essentials
F -FDL, GNU Free Documentation LicenseA.1 GNU Free Documentation License +FDL, GNU Free Documentation LicenseA.1 GNU Free Documentation License
I initialization file, readline1.3 Readline Init File @@ -5740,7 +5795,7 @@ to permit their use in free software. notation, readline1.2.1 Readline Bare Essentials
R -readline, function2.1 Basic Behavior +readline, function2.1 Basic Behavior
V variables, readline1.3.1 Readline Init File Syntax @@ -5834,16 +5889,16 @@ to permit their use in free software. Index Entry Section
_ -_rl_digit_p2.4.10 Utility Functions -_rl_digit_value2.4.10 Utility Functions -_rl_lowercase_p2.4.10 Utility Functions -_rl_to_lower2.4.10 Utility Functions -_rl_to_upper2.4.10 Utility Functions -_rl_uppercase_p2.4.10 Utility Functions +_rl_digit_p2.4.10 Utility Functions +_rl_digit_value2.4.10 Utility Functions +_rl_lowercase_p2.4.10 Utility Functions +_rl_to_lower2.4.10 Utility Functions +_rl_to_upper2.4.10 Utility Functions +_rl_uppercase_p2.4.10 Utility Functions
A -abort (C-g)1.4.8 Some Miscellaneous Commands -abort (C-g)1.4.8 Some Miscellaneous Commands +abort (C-g)1.4.8 Some Miscellaneous Commands +abort (C-g)1.4.8 Some Miscellaneous Commands accept-line (Newline or Return)1.4.2 Commands For Manipulating The History accept-line (Newline or Return)1.4.2 Commands For Manipulating The History
@@ -5865,62 +5920,62 @@ to permit their use in free software. bell-style1.3.1 Readline Init File Syntax
C -call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros -call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros +call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros +call-last-kbd-macro (C-x e)1.4.7 Keyboard Macros capitalize-word (M-c)1.4.3 Commands For Changing Text capitalize-word (M-c)1.4.3 Commands For Changing Text -character-search (C-])1.4.8 Some Miscellaneous Commands -character-search (C-])1.4.8 Some Miscellaneous Commands -character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands -character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands +character-search (C-])1.4.8 Some Miscellaneous Commands +character-search (C-])1.4.8 Some Miscellaneous Commands +character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands +character-search-backward (M-C-])1.4.8 Some Miscellaneous Commands clear-screen (C-l)1.4.1 Commands For Moving clear-screen (C-l)1.4.1 Commands For Moving comment-begin1.3.1 Readline Init File Syntax -complete (TAB)1.4.6 Letting Readline Type For You -complete (TAB)1.4.6 Letting Readline Type For You +complete (TAB)1.4.6 Letting Readline Type For You +complete (TAB)1.4.6 Letting Readline Type For You completion-query-items1.3.1 Readline Init File Syntax convert-meta1.3.1 Readline Init File Syntax -copy-backward-word ()1.4.4 Killing And Yanking -copy-backward-word ()1.4.4 Killing And Yanking -copy-forward-word ()1.4.4 Killing And Yanking -copy-forward-word ()1.4.4 Killing And Yanking -copy-region-as-kill ()1.4.4 Killing And Yanking -copy-region-as-kill ()1.4.4 Killing And Yanking +copy-backward-word ()1.4.4 Killing And Yanking +copy-backward-word ()1.4.4 Killing And Yanking +copy-forward-word ()1.4.4 Killing And Yanking +copy-forward-word ()1.4.4 Killing And Yanking +copy-region-as-kill ()1.4.4 Killing And Yanking +copy-region-as-kill ()1.4.4 Killing And Yanking
D delete-char (C-d)1.4.3 Commands For Changing Text delete-char (C-d)1.4.3 Commands For Changing Text -delete-char-or-list ()1.4.6 Letting Readline Type For You -delete-char-or-list ()1.4.6 Letting Readline Type For You -delete-horizontal-space ()1.4.4 Killing And Yanking -delete-horizontal-space ()1.4.4 Killing And Yanking -digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments -digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments +delete-char-or-list ()1.4.6 Letting Readline Type For You +delete-char-or-list ()1.4.6 Letting Readline Type For You +delete-horizontal-space ()1.4.4 Killing And Yanking +delete-horizontal-space ()1.4.4 Killing And Yanking +digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments +digit-argument (M-0, M-1, <small>...</small> M--)1.4.5 Specifying Numeric Arguments disable-completion1.3.1 Readline Init File Syntax -do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands -do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands +do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands +do-uppercase-version (M-a, M-b, M-x, <small>...</small>)1.4.8 Some Miscellaneous Commands downcase-word (M-l)1.4.3 Commands For Changing Text downcase-word (M-l)1.4.3 Commands For Changing Text -dump-functions ()1.4.8 Some Miscellaneous Commands -dump-functions ()1.4.8 Some Miscellaneous Commands -dump-macros ()1.4.8 Some Miscellaneous Commands -dump-macros ()1.4.8 Some Miscellaneous Commands -dump-variables ()1.4.8 Some Miscellaneous Commands -dump-variables ()1.4.8 Some Miscellaneous Commands +dump-functions ()1.4.8 Some Miscellaneous Commands +dump-functions ()1.4.8 Some Miscellaneous Commands +dump-macros ()1.4.8 Some Miscellaneous Commands +dump-macros ()1.4.8 Some Miscellaneous Commands +dump-variables ()1.4.8 Some Miscellaneous Commands +dump-variables ()1.4.8 Some Miscellaneous Commands
E editing-mode1.3.1 Readline Init File Syntax -emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands -emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands +emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands +emacs-editing-mode (C-e)1.4.8 Some Miscellaneous Commands enable-keypad1.3.1 Readline Init File Syntax -end-kbd-macro (C-x ))1.4.7 Keyboard Macros -end-kbd-macro (C-x ))1.4.7 Keyboard Macros +end-kbd-macro (C-x ))1.4.7 Keyboard Macros +end-kbd-macro (C-x ))1.4.7 Keyboard Macros end-of-history (M-&#62;)1.4.2 Commands For Manipulating The History end-of-history (M-&#62;)1.4.2 Commands For Manipulating The History end-of-line (C-e)1.4.1 Commands For Moving end-of-line (C-e)1.4.1 Commands For Moving -exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands -exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands +exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands +exchange-point-and-mark (C-x C-x)1.4.8 Some Miscellaneous Commands expand-tilde1.3.1 Readline Init File Syntax
F @@ -5943,18 +5998,18 @@ to permit their use in free software.
I input-meta1.3.1 Readline Init File Syntax -insert-comment (M-#)1.4.8 Some Miscellaneous Commands -insert-comment (M-#)1.4.8 Some Miscellaneous Commands -insert-completions (M-*)1.4.6 Letting Readline Type For You -insert-completions (M-*)1.4.6 Letting Readline Type For You +insert-comment (M-#)1.4.8 Some Miscellaneous Commands +insert-comment (M-#)1.4.8 Some Miscellaneous Commands +insert-completions (M-*)1.4.6 Letting Readline Type For You +insert-completions (M-*)1.4.6 Letting Readline Type For You isearch-terminators1.3.1 Readline Init File Syntax
K keymap1.3.1 Readline Init File Syntax kill-line (C-k)1.4.4 Killing And Yanking kill-line (C-k)1.4.4 Killing And Yanking -kill-region ()1.4.4 Killing And Yanking -kill-region ()1.4.4 Killing And Yanking +kill-region ()1.4.4 Killing And Yanking +kill-region ()1.4.4 Killing And Yanking kill-whole-line ()1.4.4 Killing And Yanking kill-whole-line ()1.4.4 Killing And Yanking kill-word (M-d)1.4.4 Killing And Yanking @@ -5964,8 +6019,8 @@ to permit their use in free software. mark-modified-lines1.3.1 Readline Init File Syntax mark-symlinked-directories1.3.1 Readline Init File Syntax match-hidden-files1.3.1 Readline Init File Syntax -menu-complete ()1.4.6 Letting Readline Type For You -menu-complete ()1.4.6 Letting Readline Type For You +menu-complete ()1.4.6 Letting Readline Type For You +menu-complete ()1.4.6 Letting Readline Type For You meta-flag1.3.1 Readline Init File Syntax
N @@ -5983,10 +6038,10 @@ to permit their use in free software.
P page-completions1.3.1 Readline Init File Syntax -possible-completions (M-?)1.4.6 Letting Readline Type For You -possible-completions (M-?)1.4.6 Letting Readline Type For You -prefix-meta (ESC)1.4.8 Some Miscellaneous Commands -prefix-meta (ESC)1.4.8 Some Miscellaneous Commands +possible-completions (M-?)1.4.6 Letting Readline Type For You +possible-completions (M-?)1.4.6 Letting Readline Type For You +prefix-meta (ESC)1.4.8 Some Miscellaneous Commands +prefix-meta (ESC)1.4.8 Some Miscellaneous Commands previous-history (C-p)1.4.2 Commands For Manipulating The History previous-history (C-p)1.4.2 Commands For Manipulating The History
@@ -5995,201 +6050,207 @@ to permit their use in free software. quoted-insert (C-q or C-v)1.4.3 Commands For Changing Text
R -re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands -re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands -readline2.1 Basic Behavior +re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands +re-read-init-file (C-x C-r)1.4.8 Some Miscellaneous Commands +readline2.1 Basic Behavior redraw-current-line ()1.4.1 Commands For Moving redraw-current-line ()1.4.1 Commands For Moving reverse-search-history (C-r)1.4.2 Commands For Manipulating The History reverse-search-history (C-r)1.4.2 Commands For Manipulating The History -revert-line (M-r)1.4.8 Some Miscellaneous Commands -revert-line (M-r)1.4.8 Some Miscellaneous Commands -rl_add_defun2.4.1 Naming a Function -rl_add_funmap_entry2.4.4 Associating Function Names and Bindings -rl_add_undo2.4.5 Allowing Undoing -rl_alphabetic2.4.10 Utility Functions -rl_already_prompted2.3 Readline Variables -rl_attempted_completion_function2.6.3 Completion Variables -rl_attempted_completion_over2.6.3 Completion Variables -rl_basic_quote_characters2.6.3 Completion Variables -rl_basic_word_break_characters2.6.3 Completion Variables -rl_begin_undo_group2.4.5 Allowing Undoing -rl_bind_key2.4.3 Binding Keys -rl_bind_key_if_unbound2.4.3 Binding Keys -rl_bind_key_if_unbound_in_map2.4.3 Binding Keys -rl_bind_key_in_map2.4.3 Binding Keys -rl_bind_keyseq2.4.3 Binding Keys -rl_bind_keyseq_if_unbound2.4.3 Binding Keys -rl_bind_keyseq_if_unbound_in_map2.4.3 Binding Keys -rl_bind_keyseq_in_map2.4.3 Binding Keys -rl_binding_keymap2.3 Readline Variables -rl_callback_handler_install2.4.12 Alternate Interface -rl_callback_handler_remove2.4.12 Alternate Interface -rl_callback_read_char2.4.12 Alternate Interface -rl_catch_signals2.5 Readline Signal Handling -rl_catch_sigwinch2.5 Readline Signal Handling -rl_char_is_quoted_p2.6.3 Completion Variables -rl_cleanup_after_signal2.5 Readline Signal Handling -rl_clear_message2.4.6 Redisplay -rl_clear_pending_input2.4.8 Character Input -rl_clear_signals2.5 Readline Signal Handling -rl_complete2.6.1 How Completing Works -rl_complete2.6.2 Completion Functions -rl_complete_internal2.6.2 Completion Functions -rl_completer_quote_characters2.6.3 Completion Variables -rl_completer_word_break_characters2.6.3 Completion Variables -rl_completion_append_character2.6.3 Completion Variables -rl_completion_display_matches_hook2.6.3 Completion Variables -rl_completion_entry_function2.6.1 How Completing Works -rl_completion_entry_function2.6.3 Completion Variables -rl_completion_mark_symlink_dirs2.6.3 Completion Variables -rl_completion_matches2.6.2 Completion Functions -rl_completion_mode2.6.2 Completion Functions -rl_completion_query_items2.6.3 Completion Variables -rl_completion_suppress_append2.6.3 Completion Variables -rl_completion_type2.6.3 Completion Variables -rl_copy_keymap2.4.2 Selecting a Keymap -rl_copy_text2.4.7 Modifying Text -rl_crlf2.4.6 Redisplay -rl_delete_text2.4.7 Modifying Text -rl_deprep_term_function2.3 Readline Variables -rl_deprep_terminal2.4.9 Terminal Management -rl_ding2.4.10 Utility Functions -rl_directory_completion_hook2.6.3 Completion Variables -rl_discard_keymap2.4.2 Selecting a Keymap -rl_dispatching2.3 Readline Variables -rl_display_match_list2.4.10 Utility Functions -rl_do_undo2.4.5 Allowing Undoing -rl_done2.3 Readline Variables -rl_editing_mode2.3 Readline Variables -rl_end2.3 Readline Variables -rl_end_undo_group2.4.5 Allowing Undoing -rl_erase_empty_line2.3 Readline Variables -rl_event_hook2.3 Readline Variables -rl_execute_next2.4.8 Character Input -rl_executing_keymap2.3 Readline Variables -rl_executing_macro2.3 Readline Variables -rl_expand_prompt2.4.6 Redisplay -rl_explicit_arg2.3 Readline Variables -rl_extend_line_buffer2.4.10 Utility Functions -rl_filename_completion_desired2.6.3 Completion Variables -rl_filename_completion_function2.6.2 Completion Functions -rl_filename_dequoting_function2.6.3 Completion Variables -rl_filename_quote_characters2.6.3 Completion Variables -rl_filename_quoting_desired2.6.3 Completion Variables -rl_filename_quoting_function2.6.3 Completion Variables -rl_forced_update_display2.4.6 Redisplay -rl_free_line_state2.5 Readline Signal Handling -rl_free_undo_list2.4.5 Allowing Undoing -rl_function_dumper2.4.4 Associating Function Names and Bindings -rl_function_of_keyseq2.4.4 Associating Function Names and Bindings -rl_funmap_names2.4.4 Associating Function Names and Bindings -rl_generic_bind2.4.3 Binding Keys -rl_get_keymap2.4.2 Selecting a Keymap -rl_get_keymap_by_name2.4.2 Selecting a Keymap -rl_get_keymap_name2.4.2 Selecting a Keymap -rl_get_screen_size2.5 Readline Signal Handling -rl_get_termcap2.4.11 Miscellaneous Functions -rl_getc2.4.8 Character Input -rl_getc_function2.3 Readline Variables -rl_gnu_readline_p2.3 Readline Variables -rl_ignore_completion_duplicates2.6.3 Completion Variables -rl_ignore_some_completions_function2.6.3 Completion Variables -rl_inhibit_completion2.6.3 Completion Variables -rl_initialize2.4.10 Utility Functions -rl_insert_completions2.6.2 Completion Functions -rl_insert_text2.4.7 Modifying Text -rl_instream2.3 Readline Variables -rl_invoking_keyseqs2.4.4 Associating Function Names and Bindings -rl_invoking_keyseqs_in_map2.4.4 Associating Function Names and Bindings -rl_kill_text2.4.7 Modifying Text -rl_last_func2.3 Readline Variables -rl_library_version2.3 Readline Variables -rl_line_buffer2.3 Readline Variables -rl_list_funmap_names2.4.4 Associating Function Names and Bindings -rl_macro_bind2.4.11 Miscellaneous Functions -rl_macro_dumper2.4.11 Miscellaneous Functions -rl_make_bare_keymap2.4.2 Selecting a Keymap -rl_make_keymap2.4.2 Selecting a Keymap -rl_mark2.3 Readline Variables -rl_message2.4.6 Redisplay -rl_modifying2.4.5 Allowing Undoing -rl_named_function2.4.4 Associating Function Names and Bindings -rl_num_chars_to_read2.3 Readline Variables -rl_numeric_arg2.3 Readline Variables -rl_on_new_line2.4.6 Redisplay -rl_on_new_line_with_prompt2.4.6 Redisplay -rl_outstream2.3 Readline Variables -rl_parse_and_bind2.4.3 Binding Keys -rl_pending_input2.3 Readline Variables -rl_point2.3 Readline Variables -rl_possible_completions2.6.2 Completion Functions -rl_pre_input_hook2.3 Readline Variables -rl_prep_term_function2.3 Readline Variables -rl_prep_terminal2.4.9 Terminal Management -rl_prompt2.3 Readline Variables -rl_push_macro_input2.4.7 Modifying Text -rl_read_init_file2.4.3 Binding Keys -rl_read_key2.4.8 Character Input -rl_readline_name2.3 Readline Variables -rl_readline_state2.3 Readline Variables -rl_readline_version2.3 Readline Variables -rl_redisplay2.4.6 Redisplay -rl_redisplay_function2.3 Readline Variables -rl_replace_line2.4.10 Utility Functions -rl_reset_after_signal2.5 Readline Signal Handling -rl_reset_line_state2.4.6 Redisplay -rl_reset_terminal2.4.9 Terminal Management -rl_resize_terminal2.5 Readline Signal Handling -rl_restore_prompt2.4.6 Redisplay -rl_save_prompt2.4.6 Redisplay -rl_set_key2.4.3 Binding Keys -rl_set_keyboard_input_timeout2.4.8 Character Input -rl_set_keymap2.4.2 Selecting a Keymap -rl_set_paren_blink_timeout2.4.11 Miscellaneous Functions -rl_set_prompt2.4.6 Redisplay -rl_set_screen_size2.5 Readline Signal Handling -rl_set_signals2.5 Readline Signal Handling -rl_show_char2.4.6 Redisplay -rl_special_prefixes2.6.3 Completion Variables -rl_startup_hook2.3 Readline Variables -rl_stuff_char2.4.8 Character Input -rl_terminal_name2.3 Readline Variables -rl_tty_set_default_bindings2.4.9 Terminal Management -rl_tty_unset_default_bindings2.4.9 Terminal Management -rl_unbind_command_in_map2.4.3 Binding Keys -rl_unbind_function_in_map2.4.3 Binding Keys -rl_unbind_key2.4.3 Binding Keys -rl_unbind_key_in_map2.4.3 Binding Keys -rl_username_completion_function2.6.2 Completion Functions -rl_variable_bind2.4.11 Miscellaneous Functions -rl_variable_dumper2.4.11 Miscellaneous Functions +revert-line (M-r)1.4.8 Some Miscellaneous Commands +revert-line (M-r)1.4.8 Some Miscellaneous Commands +rl_add_defun2.4.1 Naming a Function +rl_add_funmap_entry2.4.4 Associating Function Names and Bindings +rl_add_undo2.4.5 Allowing Undoing +rl_alphabetic2.4.10 Utility Functions +rl_already_prompted2.3 Readline Variables +rl_attempted_completion_function2.6.3 Completion Variables +rl_attempted_completion_over2.6.3 Completion Variables +rl_basic_quote_characters2.6.3 Completion Variables +rl_basic_word_break_characters2.6.3 Completion Variables +rl_begin_undo_group2.4.5 Allowing Undoing +rl_bind_key2.4.3 Binding Keys +rl_bind_key_if_unbound2.4.3 Binding Keys +rl_bind_key_if_unbound_in_map2.4.3 Binding Keys +rl_bind_key_in_map2.4.3 Binding Keys +rl_bind_keyseq2.4.3 Binding Keys +rl_bind_keyseq_if_unbound2.4.3 Binding Keys +rl_bind_keyseq_if_unbound_in_map2.4.3 Binding Keys +rl_bind_keyseq_in_map2.4.3 Binding Keys +rl_binding_keymap2.3 Readline Variables +rl_callback_handler_install2.4.12 Alternate Interface +rl_callback_handler_remove2.4.12 Alternate Interface +rl_callback_read_char2.4.12 Alternate Interface +rl_catch_signals2.5 Readline Signal Handling +rl_catch_sigwinch2.5 Readline Signal Handling +rl_char_is_quoted_p2.6.3 Completion Variables +rl_cleanup_after_signal2.5 Readline Signal Handling +rl_clear_message2.4.6 Redisplay +rl_clear_pending_input2.4.8 Character Input +rl_clear_signals2.5 Readline Signal Handling +rl_complete2.6.1 How Completing Works +rl_complete2.6.2 Completion Functions +rl_complete_internal2.6.2 Completion Functions +rl_completer_quote_characters2.6.3 Completion Variables +rl_completer_word_break_characters2.6.3 Completion Variables +rl_completion_append_character2.6.3 Completion Variables +rl_completion_display_matches_hook2.6.3 Completion Variables +rl_completion_entry_function2.6.1 How Completing Works +rl_completion_entry_function2.6.3 Completion Variables +rl_completion_found_quote2.6.3 Completion Variables +rl_completion_mark_symlink_dirs2.6.3 Completion Variables +rl_completion_matches2.6.2 Completion Functions +rl_completion_mode2.6.2 Completion Functions +rl_completion_query_items2.6.3 Completion Variables +rl_completion_quote_character2.6.3 Completion Variables +rl_completion_suppress_append2.6.3 Completion Variables +rl_completion_suppress_quote2.6.3 Completion Variables +rl_completion_type2.6.3 Completion Variables +rl_completion_word_break_hook2.6.3 Completion Variables +rl_copy_keymap2.4.2 Selecting a Keymap +rl_copy_text2.4.7 Modifying Text +rl_crlf2.4.6 Redisplay +rl_delete_text2.4.7 Modifying Text +rl_deprep_term_function2.3 Readline Variables +rl_deprep_terminal2.4.9 Terminal Management +rl_ding2.4.10 Utility Functions +rl_directory_completion_hook2.6.3 Completion Variables +rl_discard_keymap2.4.2 Selecting a Keymap +rl_dispatching2.3 Readline Variables +rl_display_match_list2.4.10 Utility Functions +rl_do_undo2.4.5 Allowing Undoing +rl_done2.3 Readline Variables +rl_editing_mode2.3 Readline Variables +rl_end2.3 Readline Variables +rl_end_undo_group2.4.5 Allowing Undoing +rl_erase_empty_line2.3 Readline Variables +rl_event_hook2.3 Readline Variables +rl_execute_next2.4.8 Character Input +rl_executing_keymap2.3 Readline Variables +rl_executing_macro2.3 Readline Variables +rl_expand_prompt2.4.6 Redisplay +rl_explicit_arg2.3 Readline Variables +rl_extend_line_buffer2.4.10 Utility Functions +rl_filename_completion_desired2.6.3 Completion Variables +rl_filename_completion_function2.6.2 Completion Functions +rl_filename_dequoting_function2.6.3 Completion Variables +rl_filename_quote_characters2.6.3 Completion Variables +rl_filename_quoting_desired2.6.3 Completion Variables +rl_filename_quoting_function2.6.3 Completion Variables +rl_forced_update_display2.4.6 Redisplay +rl_free_line_state2.5 Readline Signal Handling +rl_free_undo_list2.4.5 Allowing Undoing +rl_function_dumper2.4.4 Associating Function Names and Bindings +rl_function_of_keyseq2.4.4 Associating Function Names and Bindings +rl_funmap_names2.4.4 Associating Function Names and Bindings +rl_generic_bind2.4.3 Binding Keys +rl_get_keymap2.4.2 Selecting a Keymap +rl_get_keymap_by_name2.4.2 Selecting a Keymap +rl_get_keymap_name2.4.2 Selecting a Keymap +rl_get_screen_size2.5 Readline Signal Handling +rl_get_termcap2.4.11 Miscellaneous Functions +rl_getc2.4.8 Character Input +rl_getc_function2.3 Readline Variables +rl_gnu_readline_p2.3 Readline Variables +rl_ignore_completion_duplicates2.6.3 Completion Variables +rl_ignore_some_completions_function2.6.3 Completion Variables +rl_inhibit_completion2.6.3 Completion Variables +rl_initialize2.4.10 Utility Functions +rl_insert_completions2.6.2 Completion Functions +rl_insert_text2.4.7 Modifying Text +rl_instream2.3 Readline Variables +rl_invoking_keyseqs2.4.4 Associating Function Names and Bindings +rl_invoking_keyseqs_in_map2.4.4 Associating Function Names and Bindings +rl_kill_text2.4.7 Modifying Text +rl_last_func2.3 Readline Variables +rl_library_version2.3 Readline Variables +rl_line_buffer2.3 Readline Variables +rl_list_funmap_names2.4.4 Associating Function Names and Bindings +rl_macro_bind2.4.11 Miscellaneous Functions +rl_macro_dumper2.4.11 Miscellaneous Functions +rl_make_bare_keymap2.4.2 Selecting a Keymap +rl_make_keymap2.4.2 Selecting a Keymap +rl_mark2.3 Readline Variables +rl_message2.4.6 Redisplay +rl_modifying2.4.5 Allowing Undoing +rl_named_function2.4.4 Associating Function Names and Bindings +rl_num_chars_to_read2.3 Readline Variables +rl_numeric_arg2.3 Readline Variables +rl_on_new_line2.4.6 Redisplay +rl_on_new_line_with_prompt2.4.6 Redisplay +rl_outstream2.3 Readline Variables +rl_parse_and_bind2.4.3 Binding Keys +rl_pending_input2.3 Readline Variables +rl_point2.3 Readline Variables +rl_possible_completions2.6.2 Completion Functions +rl_pre_input_hook2.3 Readline Variables +rl_prep_term_function2.3 Readline Variables +rl_prep_terminal2.4.9 Terminal Management +rl_prompt2.3 Readline Variables +rl_push_macro_input2.4.7 Modifying Text +rl_read_init_file2.4.3 Binding Keys +rl_read_key2.4.8 Character Input +rl_readline_name2.3 Readline Variables +rl_readline_state2.3 Readline Variables +rl_readline_version2.3 Readline Variables +rl_redisplay2.4.6 Redisplay +rl_redisplay_function2.3 Readline Variables +rl_replace_line2.4.10 Utility Functions +rl_reset_after_signal2.5 Readline Signal Handling +rl_reset_line_state2.4.6 Redisplay +rl_reset_terminal2.4.9 Terminal Management +rl_resize_terminal2.5 Readline Signal Handling +rl_restore_prompt2.4.6 Redisplay +rl_save_prompt2.4.6 Redisplay +rl_set_key2.4.3 Binding Keys +rl_set_keyboard_input_timeout2.4.8 Character Input +rl_set_keymap2.4.2 Selecting a Keymap +rl_set_paren_blink_timeout2.4.11 Miscellaneous Functions +rl_set_prompt2.4.6 Redisplay +rl_set_screen_size2.5 Readline Signal Handling +rl_set_signals2.5 Readline Signal Handling +rl_show_char2.4.6 Redisplay +rl_special_prefixes2.6.3 Completion Variables +rl_startup_hook2.3 Readline Variables +rl_stuff_char2.4.8 Character Input +rl_terminal_name2.3 Readline Variables +rl_tty_set_default_bindings2.4.9 Terminal Management +rl_tty_unset_default_bindings2.4.9 Terminal Management +rl_unbind_command_in_map2.4.3 Binding Keys +rl_unbind_function_in_map2.4.3 Binding Keys +rl_unbind_key2.4.3 Binding Keys +rl_unbind_key_in_map2.4.3 Binding Keys +rl_username_completion_function2.6.2 Completion Functions +rl_variable_bind2.4.11 Miscellaneous Functions +rl_variable_dumper2.4.11 Miscellaneous Functions
S self-insert (a, b, A, 1, !, <small>...</small>)1.4.3 Commands For Changing Text self-insert (a, b, A, 1, !, <small>...</small>)1.4.3 Commands For Changing Text -set-mark (C-@)1.4.8 Some Miscellaneous Commands -set-mark (C-@)1.4.8 Some Miscellaneous Commands +set-mark (C-@)1.4.8 Some Miscellaneous Commands +set-mark (C-@)1.4.8 Some Miscellaneous Commands show-all-if-ambiguous1.3.1 Readline Init File Syntax show-all-if-unmodified1.3.1 Readline Init File Syntax -start-kbd-macro (C-x ()1.4.7 Keyboard Macros -start-kbd-macro (C-x ()1.4.7 Keyboard Macros +start-kbd-macro (C-x ()1.4.7 Keyboard Macros +start-kbd-macro (C-x ()1.4.7 Keyboard Macros
T tab-insert (M-TAB)1.4.3 Commands For Changing Text tab-insert (M-TAB)1.4.3 Commands For Changing Text -tilde-expand (M-~)1.4.8 Some Miscellaneous Commands -tilde-expand (M-~)1.4.8 Some Miscellaneous Commands +tilde-expand (M-~)1.4.8 Some Miscellaneous Commands +tilde-expand (M-~)1.4.8 Some Miscellaneous Commands transpose-chars (C-t)1.4.3 Commands For Changing Text transpose-chars (C-t)1.4.3 Commands For Changing Text transpose-words (M-t)1.4.3 Commands For Changing Text transpose-words (M-t)1.4.3 Commands For Changing Text
U -undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands -undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands -universal-argument ()1.4.5 Specifying Numeric Arguments -universal-argument ()1.4.5 Specifying Numeric Arguments +undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands +undo (C-_ or C-x C-u)1.4.8 Some Miscellaneous Commands +universal-argument ()1.4.5 Specifying Numeric Arguments +universal-argument ()1.4.5 Specifying Numeric Arguments +unix-filename-rubout ()1.4.4 Killing And Yanking +unix-filename-rubout ()1.4.4 Killing And Yanking unix-line-discard (C-u)1.4.4 Killing And Yanking unix-line-discard (C-u)1.4.4 Killing And Yanking unix-word-rubout (C-w)1.4.4 Killing And Yanking @@ -6198,19 +6259,19 @@ to permit their use in free software. upcase-word (M-u)1.4.3 Commands For Changing Text
V -vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands -vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands +vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands +vi-editing-mode (M-C-j)1.4.8 Some Miscellaneous Commands visible-stats1.3.1 Readline Init File Syntax
Y -yank (C-y)1.4.4 Killing And Yanking -yank (C-y)1.4.4 Killing And Yanking +yank (C-y)1.4.4 Killing And Yanking +yank (C-y)1.4.4 Killing And Yanking yank-last-arg (M-. or M-_)1.4.2 Commands For Manipulating The History yank-last-arg (M-. or M-_)1.4.2 Commands For Manipulating The History yank-nth-arg (M-C-y)1.4.2 Commands For Manipulating The History yank-nth-arg (M-C-y)1.4.2 Commands For Manipulating The History -yank-pop (M-y)1.4.4 Killing And Yanking -yank-pop (M-y)1.4.4 Killing And Yanking +yank-pop (M-y)1.4.4 Killing And Yanking +yank-pop (M-y)1.4.4 Killing And Yanking

Jump to:   _   @@ -6425,7 +6486,7 @@ to permit their use in free software. [ ? ]

About this document

-This document was generated by Chet Ramey on September, 22 2003 +This document was generated by Chet Ramey on July, 27 2004 using texi2html

@@ -6587,7 +6648,7 @@ the following structure:
This document was generated -by Chet Ramey on September, 22 2003 +by Chet Ramey on July, 27 2004 using texi2html diff --git a/lib/readline/doc/readline.info b/lib/readline/doc/readline.info index 264ebdfb..4f7b4ae7 100644 --- a/lib/readline/doc/readline.info +++ b/lib/readline/doc/readline.info @@ -1,12 +1,11 @@ This is readline.info, produced by makeinfo version 4.5 from ./rlman.texi. -This manual describes the GNU Readline Library (version 5.0, 19 -September 2003), a library which aids in the consistency of user -interface across discrete programs which provide a command line -interface. +This manual describes the GNU Readline Library (version 5.0, 28 January +2004), a library which aids in the consistency of user interface across +discrete programs which provide a command line interface. - Copyright (C) 1988-2003 Free Software Foundation, Inc. + Copyright (C) 1988-2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -1040,6 +1039,11 @@ Killing And Yanking Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring. +`unix-filename-rubout ()' + Kill the word behind point, using white space and the slash + character as the word boundaries. The killed text is saved on the + kill-ring. + `delete-horizontal-space ()' Delete all spaces and tabs around point. By default, this is unbound. @@ -1261,7 +1265,7 @@ the standard `vi' movement keys, move to previous history lines with aiding in the consitency of user interface across discrete programs that need to provide a command line interface. - Copyright (C) 1988-2002 Free Software Foundation, Inc. + Copyright (C) 1988-2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice pare @@ -2141,7 +2145,12 @@ Redisplay primary prompt if the `rl_on_new_line_with_prompt()' function or `rl_already_prompted' variable is used. It returns the number of visible characters on the last line of the (possibly multi-line) - prompt. + prompt. Applications may indicate that the prompt contains + characters that take up no physical screen space when displayed by + bracketing a sequence of such characters with the special markers + `RL_PROMPT_START_IGNORE' and `RL_PROMPT_END_IGNORE' (declared in + `readline.h'. This may be used to embed terminal-specific escape + sequences in prompts. - Function: int rl_set_prompt (const char *prompt) Make Readline use PROMPT for subsequent redisplay. This calls @@ -2836,6 +2845,15 @@ Completion Variables `rl_complete_internal()'. The default list is the value of `rl_basic_word_break_characters'. + - Variable: rl_cpvfunc_t * rl_completion_word_break_hook + If non-zero, this is the address of a function to call when + Readline is deciding where to separate words for word completion. + It should return a character string like + `rl_completer_word_break_characters' to be used to perform the + current completion. The function may choose to set + `rl_completer_word_break_characters' itself. If the function + returns `NULL', `rl_completer_word_break_characters' is used. + - Variable: const char * rl_completer_quote_characters A list of characters which can be used to quote a substring of the line. Completion occurs on the entire substring, and within the @@ -2875,6 +2893,25 @@ Completion Variables set to 0 before any application-specific completion function is called, and may only be changed within such a function. + - Variable: int rl_completion_quote_character + When Readline is completing quoted text, as delimited by one of the + characters in RL_COMPLETER_QUOTE_CHARACTERS, it sets this variable + to the quoting character found. This is set before any + application-specific completion function is called. + + - Variable: int rl_completion_suppress_quote + If non-zero, Readline does not append a matching quote character + when performing completion on a quoted string. It is set to 0 + before any application-specific completion function is called, and + may only be changed within such a function. + + - Variable: int rl_completion_found_quote + When Readline is completing quoted text, it sets this variable to + a non-zero value if the word being completed contains or is + delimited by any quoting characters, including backslashes. This + is set before any application-specific completion function is + called. + - Variable: int rl_completion_mark_symlink_dirs If non-zero, a slash will be appended to completed filenames that are symbolic links to directory names, subject to the value of the @@ -3958,21 +3995,25 @@ Function and Variable Index * rl_clear_message: Redisplay. * rl_clear_pending_input: Character Input. * rl_clear_signals: Readline Signal Handling. -* rl_complete <1>: Completion Functions. -* rl_complete: How Completing Works. +* rl_complete <1>: How Completing Works. +* rl_complete: Completion Functions. * rl_complete_internal: Completion Functions. * rl_completer_quote_characters: Completion Variables. * rl_completer_word_break_characters: Completion Variables. * rl_completion_append_character: Completion Variables. * rl_completion_display_matches_hook: Completion Variables. -* rl_completion_entry_function <1>: How Completing Works. -* rl_completion_entry_function: Completion Variables. +* rl_completion_entry_function <1>: Completion Variables. +* rl_completion_entry_function: How Completing Works. +* rl_completion_found_quote: Completion Variables. * rl_completion_mark_symlink_dirs: Completion Variables. * rl_completion_matches: Completion Functions. * rl_completion_mode: Completion Functions. * rl_completion_query_items: Completion Variables. +* rl_completion_quote_character: Completion Variables. * rl_completion_suppress_append: Completion Variables. +* rl_completion_suppress_quote: Completion Variables. * rl_completion_type: Completion Variables. +* rl_completion_word_break_hook: Completion Variables. * rl_copy_keymap: Keymaps. * rl_copy_text: Modifying Text. * rl_crlf: Redisplay. @@ -4098,6 +4139,7 @@ Function and Variable Index * transpose-words (M-t): Commands For Text. * undo (C-_ or C-x C-u): Miscellaneous Commands. * universal-argument (): Numeric Arguments. +* unix-filename-rubout (): Commands For Killing. * unix-line-discard (C-u): Commands For Killing. * unix-word-rubout (C-w): Commands For Killing. * upcase-word (M-u): Commands For Text. @@ -4110,58 +4152,58 @@ Function and Variable Index  Tag Table: -Node: Top1298 -Node: Command Line Editing1939 -Node: Introduction and Notation2590 -Node: Readline Interaction4208 -Node: Readline Bare Essentials5395 -Node: Readline Movement Commands7176 -Node: Readline Killing Commands8133 -Node: Readline Arguments10043 -Node: Searching11079 -Node: Readline Init File13222 -Node: Readline Init File Syntax14283 -Node: Conditional Init Constructs25646 -Node: Sample Init File28171 -Node: Bindable Readline Commands31355 -Node: Commands For Moving32405 -Node: Commands For History33255 -Node: Commands For Text36114 -Node: Commands For Killing38829 -Node: Numeric Arguments40780 -Node: Commands For Completion41908 -Node: Keyboard Macros43441 -Node: Miscellaneous Commands44001 -Node: Readline vi Mode47351 -Node: Programming with GNU Readline49169 -Node: Basic Behavior50143 -Node: Custom Functions53573 -Node: Readline Typedefs55051 -Node: Function Writing56681 -Node: Readline Variables57889 -Node: Readline Convenience Functions67312 -Node: Function Naming68294 -Node: Keymaps69546 -Node: Binding Keys71302 -Node: Associating Function Names and Bindings75824 -Node: Allowing Undoing78069 -Node: Redisplay80604 -Node: Modifying Text83675 -Node: Character Input84904 -Node: Terminal Management86684 -Node: Utility Functions88103 -Node: Miscellaneous Functions90442 -Node: Alternate Interface92506 -Node: A Readline Example94651 -Node: Readline Signal Handling96588 -Node: Custom Completers102191 -Node: How Completing Works102906 -Node: Completion Functions106209 -Node: Completion Variables109764 -Node: A Short Completion Example120386 -Node: Copying This Manual132939 -Node: GNU Free Documentation License133179 -Node: Concept Index155573 -Node: Function and Variable Index156522 +Node: Top1296 +Node: Command Line Editing1937 +Node: Introduction and Notation2588 +Node: Readline Interaction4206 +Node: Readline Bare Essentials5393 +Node: Readline Movement Commands7174 +Node: Readline Killing Commands8131 +Node: Readline Arguments10041 +Node: Searching11077 +Node: Readline Init File13220 +Node: Readline Init File Syntax14281 +Node: Conditional Init Constructs25644 +Node: Sample Init File28169 +Node: Bindable Readline Commands31353 +Node: Commands For Moving32403 +Node: Commands For History33253 +Node: Commands For Text36112 +Node: Commands For Killing38827 +Node: Numeric Arguments40958 +Node: Commands For Completion42086 +Node: Keyboard Macros43619 +Node: Miscellaneous Commands44179 +Node: Readline vi Mode47529 +Node: Programming with GNU Readline49347 +Node: Basic Behavior50321 +Node: Custom Functions53751 +Node: Readline Typedefs55229 +Node: Function Writing56859 +Node: Readline Variables58067 +Node: Readline Convenience Functions67490 +Node: Function Naming68472 +Node: Keymaps69724 +Node: Binding Keys71480 +Node: Associating Function Names and Bindings76002 +Node: Allowing Undoing78247 +Node: Redisplay80782 +Node: Modifying Text84216 +Node: Character Input85445 +Node: Terminal Management87225 +Node: Utility Functions88644 +Node: Miscellaneous Functions90983 +Node: Alternate Interface93047 +Node: A Readline Example95192 +Node: Readline Signal Handling97129 +Node: Custom Completers102732 +Node: How Completing Works103447 +Node: Completion Functions106750 +Node: Completion Variables110305 +Node: A Short Completion Example122375 +Node: Copying This Manual134928 +Node: GNU Free Documentation License135168 +Node: Concept Index157562 +Node: Function and Variable Index158511  End Tag Table diff --git a/lib/readline/doc/readline.ps b/lib/readline/doc/readline.ps index d3718386..a6b031ac 100644 --- a/lib/readline/doc/readline.ps +++ b/lib/readline/doc/readline.ps @@ -1,14 +1,14 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software %%Title: readline.dvi -%%Pages: 72 +%%Pages: 74 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -D 300 -o readline.ps readline.dvi %DVIPSParameters: dpi=300, compressed -%DVIPSSource: TeX output 2003.09.22:0904 +%DVIPSSource: TeX output 2004.07.27:0931 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -797,8 +797,8 @@ FC000F006C6C131E6C6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D 306C1560A26C15C06CEC01806C6CEB0300D800E0130E0178133C90381F01F0903807FFC0 D900FEC7FC272B7DA02E>13 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fr cmbx12 14.4 53 -/Fr 53 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612 +%DVIPSBitmapFont: Fr cmbx12 14.4 54 +/Fr 54 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612 0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46 D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49 DII65 DI<91387FE003903907FFFC07011FEBFF0F90397FF00F -9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290C9 -FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397F -F007C0011FB512800107EBFE009038007FF028297CA831>IIII<91387FE0 -03903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848804848804848 -80485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C -7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I -II75 DII -III< -ECFFC0010F13FC90383FC0FF9039FE001FC048486D7ED803F0EB03F000078148486D7E48 -486D7EA24848147FA2007F1680A290C8123FA24816C0AA6C16806D147FA2003F1600A26C -6C14FE143E3A0FE07F81FC00079038C1C1F83A03F18063F0D801F9EB67E0D800FFEB3FC0 -90263FC07FC7FC90380FFFFC01004913C0EC003C811601ED1F8316FF6F1380A21700816F -5A6F5A6F5A2A357CA833>II<9038FF80600003EBF0E0 -000F13F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7F -FCEBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E0 -1303A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA8 -25>I<007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A24815 -01A5C791C7FCB3A490B612C0A32A287EA72F>IIII89 +>I<1238123E003FB512F0A34814E015C0158015003870000EA25C485B5C5CC6485AA249 +5A130791C7FC5B5B131E133EA2137E137CA213FCA41201A76C5A13701C297CA822>I65 DI<91387FE003903907FFFC07011FEBFF0F90397FF00F9F9039 +FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290C9FC5AA9 +7E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397FF007C0 +011FB512800107EBFE009038007FF028297CA831>IIII<91387FE0039039 +07FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F484880484880484880485A +82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C7E6C7E +6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>III75 DIIIIIII<9038FF80600003EBF0E0000F13 +F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFCEBFF +E06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E01303A4 +6C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825>I< +007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A2481501A5C7 +91C7FCB3A490B612C0A32A287EA72F>IIII89 D<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA 0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21 >97 D) -195 367 y(#include)g()195 411 y(#include)g()195 455 y(#include)g()195 -498 y(#include)g()195 585 y(#include)g()195 629 y(#include)g()195 716 y(extern)g(char)h(*xmalloc)f(\(\);)195 -803 y(/*)i(The)f(names)g(of)h(functions)d(that)i(actually)f(do)h(the)h -(manipulat)o(ion)o(.)d(*/)195 847 y(int)i(com_list)f(__P\(\(char)f -(*\)\);)195 890 y(int)i(com_view)f(__P\(\(char)f(*\)\);)195 -934 y(int)i(com_rename)e(__P\(\(char)g(*\)\);)195 978 -y(int)i(com_stat)f(__P\(\(char)f(*\)\);)195 1021 y(int)i(com_pwd)f -(__P\(\(char)f(*\)\);)195 1065 y(int)i(com_delete)e(__P\(\(char)g -(*\)\);)195 1108 y(int)i(com_help)f(__P\(\(char)f(*\)\);)195 -1152 y(int)i(com_cd)g(__P\(\(char)e(*\)\);)195 1196 y(int)i(com_quit)f -(__P\(\(char)f(*\)\);)195 1283 y(/*)j(A)g(structure)d(which)i(contains) -e(information)g(on)j(the)f(commands)f(this)h(program)254 -1326 y(can)g(understand)o(.)f(*/)195 1413 y(typedef)g(struct)g({)234 -1457 y(char)h(*name;)g(/*)g(User)g(printable)f(name)h(of)h(the)f -(function.)e(*/)234 1501 y(rl_icpfunc)o(_t)g(*func;)h(/*)i(Function)e -(to)i(call)f(to)h(do)f(the)h(job.)f(*/)234 1544 y(char)g(*doc;)g(/*)h -(Documenta)o(tio)o(n)d(for)j(this)f(function.)36 b(*/)195 -1588 y(})19 b(COMMAND;)195 1675 y(COMMAND)e(commands[)o(])g(=)i({)234 -1719 y({)g("cd",)f(com_cd,)f("Change)g(to)i(directory)d(DIR")i(},)234 -1762 y({)h("delete",)e(com_dele)o(te,)f("Delete)h(FILE")h(},)234 -1806 y({)h("help",)e(com_help,)f("Display)h(this)h(text")g(},)234 -1849 y({)h("?",)g(com_help)o(,)e("Synonym)f(for)j(`help'")e(},)234 -1893 y({)i("list",)e(com_list,)f("List)i(files)g(in)h(DIR")f(},)234 +(Readline)843 b(47)1685 149 y([V)l(ariable])-1799 b Fg(int)20 +b Ff(rl)p 216 149 18 3 v 25 w(inhibit)p 404 149 V 28 +w(completion)195 204 y Ft(If)14 b(this)h(v)m(ariable)g(is)g(non-zero,)f +(completion)i(is)e(inhibited.)22 b(The)15 b(completion)g(c)o(haracter)e +(will)j(b)q(e)195 259 y(inserted)g(as)f(an)o(y)g(other)g(b)q(ound)h(to) +e Fs(self-insert)p Ft(.)75 371 y Fh(2.6.4)30 b(A)21 b(Short)f +(Completion)g(Example)137 493 y Ft(Here)11 b(is)f(a)g(small)h +(application)h(demonstrating)e(the)g(use)h(of)e(the)i(GNU)f(Readline)h +(library)l(.)19 b(It)11 b(is)f(called)75 548 y Fs(fileman)p +Ft(,)17 b(and)h(the)g(source)g(co)q(de)g(resides)h(in)f(`)p +Fs(examples/fileman.c)p Ft('.)25 b(This)18 b(sample)g(application)75 +603 y(pro)o(vides)c(completion)g(of)e(command)h(names,)g(line)i +(editing)g(features,)d(and)i(access)f(to)f(the)h(history)h(list.)p +eop +%%Page: 48 52 +48 51 bop 75 -58 a Ft(48)1299 b(GNU)15 b(Readline)h(Library)195 +149 y Fd(/*)j(fileman.c)d(--)j(A)g(tiny)f(applicatio)o(n)e(which)i +(demonstrat)o(es)e(how)j(to)f(use)h(the)254 193 y(GNU)f(Readline)f +(library.)36 b(This)18 b(applicatio)o(n)e(interactive)o(ly)g(allows)h +(users)254 237 y(to)i(manipulat)o(e)d(files)i(and)h(their)e(modes.)h +(*/)195 324 y(#include)f()195 367 y(#include)g()195 411 y(#include)g()195 +455 y(#include)g()195 498 y(#include)g()195 585 y(#include)g()195 +629 y(#include)g()195 +716 y(extern)g(char)h(*xmalloc)f(\(\);)195 803 y(/*)i(The)f(names)g(of) +h(functions)d(that)i(actually)f(do)h(the)h(manipulat)o(ion)o(.)d(*/)195 +847 y(int)i(com_list)f(__P\(\(char)f(*\)\);)195 890 y(int)i(com_view)f +(__P\(\(char)f(*\)\);)195 934 y(int)i(com_rename)e(__P\(\(char)g +(*\)\);)195 978 y(int)i(com_stat)f(__P\(\(char)f(*\)\);)195 +1021 y(int)i(com_pwd)f(__P\(\(char)f(*\)\);)195 1065 +y(int)i(com_delete)e(__P\(\(char)g(*\)\);)195 1108 y(int)i(com_help)f +(__P\(\(char)f(*\)\);)195 1152 y(int)i(com_cd)g(__P\(\(char)e(*\)\);) +195 1196 y(int)i(com_quit)f(__P\(\(char)f(*\)\);)195 +1283 y(/*)j(A)g(structure)d(which)i(contains)e(information)g(on)j(the)f +(commands)f(this)h(program)254 1326 y(can)g(understand)o(.)f(*/)195 +1413 y(typedef)g(struct)g({)234 1457 y(char)h(*name;)g(/*)g(User)g +(printable)f(name)h(of)h(the)f(function.)e(*/)234 1501 +y(rl_icpfunc)o(_t)g(*func;)h(/*)i(Function)e(to)i(call)f(to)h(do)f(the) +h(job.)f(*/)234 1544 y(char)g(*doc;)g(/*)h(Documenta)o(tio)o(n)d(for)j +(this)f(function.)36 b(*/)195 1588 y(})19 b(COMMAND;)195 +1675 y(COMMAND)e(commands[)o(])g(=)i({)234 1719 y({)g("cd",)f(com_cd,)f +("Change)g(to)i(directory)d(DIR")i(},)234 1762 y({)h("delete",)e +(com_dele)o(te,)f("Delete)h(FILE")h(},)234 1806 y({)h("help",)e +(com_help,)f("Display)h(this)h(text")g(},)234 1849 y({)h("?",)g +(com_help)o(,)e("Synonym)f(for)j(`help'")e(},)234 1893 +y({)i("list",)e(com_list,)f("List)i(files)g(in)h(DIR")f(},)234 1936 y({)h("ls",)f(com_list,)e("Synonym)h(for)h(`list'")f(},)234 1980 y({)i("pwd",)f(com_pwd,)e("Print)i(the)g(current)f(working)g (directory)o(")g(},)234 2024 y({)i("quit",)e(com_quit,)f("Quit)i(using) @@ -4507,37 +4565,38 @@ y(/*)j(The)f(name)g(of)h(this)f(program,)f(as)i(taken)e(from)h (argv[0].)f(*/)195 2547 y(char)h(*progname;)195 2634 y(/*)h(When)f(non-zero,)e(this)i(means)g(the)g(user)g(is)h(done)f (using)g(this)g(program.)f(*/)p eop -%%Page: 48 52 -48 51 bop 75 -58 a Ft(48)1299 b(GNU)15 b(Readline)h(Library)195 -149 y Fd(int)i(done;)195 237 y(char)g(*)195 280 y(dupstr)f(\(s\))293 -324 y(int)i(s;)195 367 y({)234 411 y(char)f(*r;)234 498 -y(r)h(=)h(xmalloc)d(\(strlen)f(\(s\))j(+)g(1\);)234 542 -y(strcpy)f(\(r,)g(s\);)234 585 y(return)g(\(r\);)195 -629 y(})195 716 y(main)g(\(argc,)f(argv\))293 760 y(int)i(argc;)293 -803 y(char)f(**argv;)195 847 y({)234 890 y(char)g(*line,)g(*s;)234 -978 y(progname)f(=)i(argv[0];)234 1065 y(initialize)o(_re)o(ad)o(lin)o -(e)d(\(\);)j(/*)g(Bind)f(our)g(completer.)e(*/)234 1152 -y(/*)j(Loop)f(reading)f(and)h(executing)f(lines)g(until)h(the)g(user)h -(quits.)e(*/)234 1196 y(for)i(\()g(;)g(done)f(==)h(0;)g(\))273 -1239 y({)313 1283 y(line)f(=)h(readline)d(\("FileMan:)g("\);)313 -1370 y(if)j(\(!line\))352 1413 y(break;)313 1501 y(/*)g(Remove)e -(leading)g(and)h(trailing)f(whitespac)o(e)f(from)j(the)f(line.)372 -1544 y(Then,)f(if)i(there)f(is)h(anything)d(left,)i(add)g(it)h(to)g -(the)f(history)f(list)372 1588 y(and)h(execute)f(it.)h(*/)313 -1631 y(s)h(=)g(stripwhite)d(\(line\);)313 1719 y(if)j(\(*s\))352 -1762 y({)391 1806 y(add_histor)o(y)d(\(s\);)391 1849 -y(execute_li)o(ne)g(\(s\);)352 1893 y(})313 1980 y(free)i(\(line\);)273 -2024 y(})234 2067 y(exit)g(\(0\);)195 2111 y(})195 2198 -y(/*)h(Execute)e(a)i(command)e(line.)h(*/)195 2242 y(int)195 -2285 y(execute_li)o(ne)e(\(line\))293 2329 y(char)i(*line;)195 -2372 y({)234 2416 y(register)f(int)h(i;)234 2460 y(COMMAND)f(*command;) -234 2503 y(char)h(*word;)234 2590 y(/*)h(Isolate)e(the)h(command)f -(word.)h(*/)234 2634 y(i)h(=)h(0;)p eop %%Page: 49 53 49 52 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g -(Readline)843 b(49)234 149 y Fd(while)18 b(\(line[i])e(&&)j(whitespace) -d(\(line[i]\)\))273 193 y(i++;)234 237 y(word)i(=)i(line)e(+)h(i;)234 -324 y(while)f(\(line[i])e(&&)j(!whitespac)o(e)e(\(line[i]\))o(\))273 +(Readline)843 b(49)195 149 y Fd(int)18 b(done;)195 237 +y(char)g(*)195 280 y(dupstr)f(\(s\))293 324 y(int)i(s;)195 +367 y({)234 411 y(char)f(*r;)234 498 y(r)h(=)h(xmalloc)d(\(strlen)f +(\(s\))j(+)g(1\);)234 542 y(strcpy)f(\(r,)g(s\);)234 +585 y(return)g(\(r\);)195 629 y(})195 716 y(main)g(\(argc,)f(argv\))293 +760 y(int)i(argc;)293 803 y(char)f(**argv;)195 847 y({)234 +890 y(char)g(*line,)g(*s;)234 978 y(progname)f(=)i(argv[0];)234 +1065 y(initialize)o(_re)o(ad)o(lin)o(e)d(\(\);)j(/*)g(Bind)f(our)g +(completer.)e(*/)234 1152 y(/*)j(Loop)f(reading)f(and)h(executing)f +(lines)g(until)h(the)g(user)h(quits.)e(*/)234 1196 y(for)i(\()g(;)g +(done)f(==)h(0;)g(\))273 1239 y({)313 1283 y(line)f(=)h(readline)d +(\("FileMan:)g("\);)313 1370 y(if)j(\(!line\))352 1413 +y(break;)313 1501 y(/*)g(Remove)e(leading)g(and)h(trailing)f(whitespac) +o(e)f(from)j(the)f(line.)372 1544 y(Then,)f(if)i(there)f(is)h(anything) +d(left,)i(add)g(it)h(to)g(the)f(history)f(list)372 1588 +y(and)h(execute)f(it.)h(*/)313 1631 y(s)h(=)g(stripwhite)d(\(line\);) +313 1719 y(if)j(\(*s\))352 1762 y({)391 1806 y(add_histor)o(y)d(\(s\);) +391 1849 y(execute_li)o(ne)g(\(s\);)352 1893 y(})313 +1980 y(free)i(\(line\);)273 2024 y(})234 2067 y(exit)g(\(0\);)195 +2111 y(})195 2198 y(/*)h(Execute)e(a)i(command)e(line.)h(*/)195 +2242 y(int)195 2285 y(execute_li)o(ne)e(\(line\))293 +2329 y(char)i(*line;)195 2372 y({)234 2416 y(register)f(int)h(i;)234 +2460 y(COMMAND)f(*command;)234 2503 y(char)h(*word;)234 +2590 y(/*)h(Isolate)e(the)h(command)f(word.)h(*/)234 +2634 y(i)h(=)h(0;)p eop +%%Page: 50 54 +50 53 bop 75 -58 a Ft(50)1299 b(GNU)15 b(Readline)h(Library)234 +149 y Fd(while)i(\(line[i])e(&&)j(whitespace)d(\(line[i]\)\))273 +193 y(i++;)234 237 y(word)i(=)i(line)e(+)h(i;)234 324 +y(while)f(\(line[i])e(&&)j(!whitespac)o(e)e(\(line[i]\))o(\))273 367 y(i++;)234 455 y(if)i(\(line[i]\))273 498 y(line[i++])e(=)i('\\0';) 234 585 y(command)e(=)i(find_comma)o(nd)d(\(word\);)234 672 y(if)j(\(!command\))273 716 y({)313 760 y(fprintf)e(\(stderr,)f @@ -4565,43 +4624,44 @@ y(char)i(*string;)195 2242 y({)234 2285 y(register)f(char)h(*s,)g(*t;) 273 2416 y(;)234 2503 y(if)h(\(*s)g(==)f(0\))273 2547 y(return)g(\(s\);)234 2634 y(t)h(=)h(s)f(+)g(strlen)e(\(s\))i(-)g(1;)p eop -%%Page: 50 54 -50 53 bop 75 -58 a Ft(50)1299 b(GNU)15 b(Readline)h(Library)234 -149 y Fd(while)i(\(t)h(>)g(s)g(&&)g(whitespace)d(\(*t\)\))273 -193 y(t--;)234 237 y(*++t)i(=)i('\\0';)234 324 y(return)e(s;)195 -367 y(})195 455 y(/*)h(*********)o(***)o(**)o(***)o(**)o(***)o(***)o -(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**) -o(***)o(***)d(*/)195 498 y(/*)1294 b(*/)195 542 y(/*)352 -b(Interface)16 b(to)j(Readline)e(Completio)o(n)311 b(*/)195 -585 y(/*)1294 b(*/)195 629 y(/*)19 b(*********)o(***)o(**)o(***)o(**)o -(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o -(**)o(***)o(**)o(***)o(***)d(*/)195 716 y(char)i(*command_g)o(en)o(era) -o(to)o(r)f(__P\(\(cons)o(t)f(char)j(*,)f(int\)\);)195 -760 y(char)g(**fileman_)o(co)o(mpl)o(et)o(ion)e(__P\(\(cons)o(t)h(char) -h(*,)h(int,)f(int\)\);)195 847 y(/*)h(Tell)f(the)g(GNU)h(Readline)d -(library)h(how)i(to)g(complete)o(.)36 b(We)19 b(want)f(to)h(try)g(to) -254 890 y(complete)d(on)j(command)e(names)h(if)h(this)f(is)h(the)f -(first)g(word)g(in)h(the)f(line,)g(or)254 934 y(on)h(filenames)d(if)j -(not.)f(*/)195 978 y(initialize)o(_r)o(ead)o(li)o(ne)e(\(\))195 -1021 y({)234 1065 y(/*)j(Allow)f(condition)o(al)e(parsing)h(of)i(the)f -(~/.inputrc)e(file.)i(*/)234 1108 y(rl_readlin)o(e_n)o(am)o(e)f(=)i -("FileMan")o(;)234 1196 y(/*)g(Tell)f(the)h(complete)o(r)e(that)h(we)h -(want)f(a)h(crack)f(first.)f(*/)234 1239 y(rl_attempt)o(ed_)o(co)o(mpl) -o(et)o(ion)o(_fu)o(nc)o(tio)o(n)f(=)k(fileman_c)o(om)o(ple)o(tio)o(n;) -195 1283 y(})195 1370 y(/*)f(Attempt)e(to)i(complete)d(on)j(the)f -(contents)f(of)i(TEXT.)37 b(START)18 b(and)g(END)254 -1413 y(bound)g(the)g(region)f(of)i(rl_line_bu)o(ff)o(er)d(that)i -(contains)f(the)h(word)g(to)254 1457 y(complete.)36 b(TEXT)18 -b(is)g(the)h(word)f(to)h(complete.)36 b(We)18 b(can)h(use)f(the)h -(entire)254 1501 y(contents)d(of)j(rl_line_bu)o(ffe)o(r)d(in)j(case)f -(we)h(want)f(to)h(do)g(some)f(simple)254 1544 y(parsing.)36 -b(Returnthe)16 b(array)i(of)h(matches,)d(or)j(NULL)f(if)h(there)f -(aren't)f(any.)h(*/)195 1588 y(char)g(**)195 1631 y(fileman_co)o(mp)o -(let)o(io)o(n)f(\(text,)g(start,)g(end\))293 1675 y(const)h(char)g -(*text;)293 1719 y(int)h(start,)e(end;)195 1762 y({)234 -1806 y(char)h(**matches;)234 1893 y(matches)f(=)i(\(char)f(**\)NULL;) -234 1980 y(/*)h(If)g(this)f(word)g(is)h(at)g(the)f(start)g(of)h(the)f -(line,)g(then)g(it)h(is)g(a)g(command)293 2024 y(to)g(complete.)36 +%%Page: 51 55 +51 54 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)843 b(51)234 149 y Fd(while)18 b(\(t)h(>)g(s)g(&&)g +(whitespace)d(\(*t\)\))273 193 y(t--;)234 237 y(*++t)i(=)i('\\0';)234 +324 y(return)e(s;)195 367 y(})195 455 y(/*)h(*********)o(***)o(**)o +(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o +(***)o(***)o(**)o(***)o(**)o(***)o(***)d(*/)195 498 y(/*)1294 +b(*/)195 542 y(/*)352 b(Interface)16 b(to)j(Readline)e(Completio)o(n) +311 b(*/)195 585 y(/*)1294 b(*/)195 629 y(/*)19 b(*********)o(***)o(**) +o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o +(***)o(***)o(**)o(***)o(**)o(***)o(***)d(*/)195 716 y(char)i +(*command_g)o(en)o(era)o(to)o(r)f(__P\(\(cons)o(t)f(char)j(*,)f +(int\)\);)195 760 y(char)g(**fileman_)o(co)o(mpl)o(et)o(ion)e +(__P\(\(cons)o(t)h(char)h(*,)h(int,)f(int\)\);)195 847 +y(/*)h(Tell)f(the)g(GNU)h(Readline)d(library)h(how)i(to)g(complete)o(.) +36 b(We)19 b(want)f(to)h(try)g(to)254 890 y(complete)d(on)j(command)e +(names)h(if)h(this)f(is)h(the)f(first)g(word)g(in)h(the)f(line,)g(or) +254 934 y(on)h(filenames)d(if)j(not.)f(*/)195 978 y(initialize)o(_r)o +(ead)o(li)o(ne)e(\(\))195 1021 y({)234 1065 y(/*)j(Allow)f(condition)o +(al)e(parsing)h(of)i(the)f(~/.inputrc)e(file.)i(*/)234 +1108 y(rl_readlin)o(e_n)o(am)o(e)f(=)i("FileMan")o(;)234 +1196 y(/*)g(Tell)f(the)h(complete)o(r)e(that)h(we)h(want)f(a)h(crack)f +(first.)f(*/)234 1239 y(rl_attempt)o(ed_)o(co)o(mpl)o(et)o(ion)o(_fu)o +(nc)o(tio)o(n)f(=)k(fileman_c)o(om)o(ple)o(tio)o(n;)195 +1283 y(})195 1370 y(/*)f(Attempt)e(to)i(complete)d(on)j(the)f(contents) +f(of)i(TEXT.)37 b(START)18 b(and)g(END)254 1413 y(bound)g(the)g(region) +f(of)i(rl_line_bu)o(ff)o(er)d(that)i(contains)f(the)h(word)g(to)254 +1457 y(complete.)36 b(TEXT)18 b(is)g(the)h(word)f(to)h(complete.)36 +b(We)18 b(can)h(use)f(the)h(entire)254 1501 y(contents)d(of)j +(rl_line_bu)o(ffe)o(r)d(in)j(case)f(we)h(want)f(to)h(do)g(some)f +(simple)254 1544 y(parsing.)36 b(Returnthe)16 b(array)i(of)h(matches,)d +(or)j(NULL)f(if)h(there)f(aren't)f(any.)h(*/)195 1588 +y(char)g(**)195 1631 y(fileman_co)o(mp)o(let)o(io)o(n)f(\(text,)g +(start,)g(end\))293 1675 y(const)h(char)g(*text;)293 +1719 y(int)h(start,)e(end;)195 1762 y({)234 1806 y(char)h(**matches;) +234 1893 y(matches)f(=)i(\(char)f(**\)NULL;)234 1980 +y(/*)h(If)g(this)f(word)g(is)h(at)g(the)f(start)g(of)h(the)f(line,)g +(then)g(it)h(is)g(a)g(command)293 2024 y(to)g(complete.)36 b(Otherwise)16 b(it)j(is)f(the)h(name)f(of)h(a)g(file)f(in)h(the)f (current)293 2067 y(directory.)e(*/)234 2111 y(if)j(\(start)e(==)i(0\)) 273 2154 y(matches)e(=)j(rl_compl)o(eti)o(on_)o(ma)o(tch)o(es)c @@ -4614,14 +4674,14 @@ b(lets)g(us)254 2416 y(know)g(whether)f(to)i(start)e(from)h(scratch;)f 2503 y(char)g(*)195 2547 y(command_ge)o(ne)o(rat)o(or)e(\(text,)h (state\))293 2590 y(const)h(char)g(*text;)293 2634 y(int)h(state;)p eop -%%Page: 51 55 -51 54 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g -(Readline)843 b(51)195 149 y Fd({)234 193 y(static)18 -b(int)g(list_inde)o(x,)e(len;)234 237 y(char)i(*name;)234 -324 y(/*)h(If)g(this)f(is)h(a)g(new)f(word)h(to)f(complete,)f(initiali) -o(ze)f(now.)38 b(This)293 367 y(includes)17 b(saving)g(the)h(length)g -(of)g(TEXT)h(for)f(efficiency)o(,)e(and)293 411 y(initializi)o(ng)g -(the)i(index)g(variable)f(to)i(0.)f(*/)234 455 y(if)h(\(!state\))273 +%%Page: 52 56 +52 55 bop 75 -58 a Ft(52)1299 b(GNU)15 b(Readline)h(Library)195 +149 y Fd({)234 193 y(static)i(int)g(list_inde)o(x,)e(len;)234 +237 y(char)i(*name;)234 324 y(/*)h(If)g(this)f(is)h(a)g(new)f(word)h +(to)f(complete,)f(initiali)o(ze)f(now.)38 b(This)293 +367 y(includes)17 b(saving)g(the)h(length)g(of)g(TEXT)h(for)f +(efficiency)o(,)e(and)293 411 y(initializi)o(ng)g(the)i(index)g +(variable)f(to)i(0.)f(*/)234 455 y(if)h(\(!state\))273 498 y({)313 542 y(list_inde)o(x)d(=)k(0;)313 585 y(len)e(=)h(strlen)f (\(text\);)273 629 y(})234 716 y(/*)h(Return)e(the)i(next)f(name)g (which)g(partially)e(matches)h(from)h(the)293 760 y(command)f(list.)h @@ -4650,17 +4710,17 @@ b(This)18 b(is)h(for)g(the)f(LIST,)g(VIEW)g(and)g(RENAME)254 (arg\)\))273 2416 y(return)h(1;)234 2503 y(sprintf)f(\(syscom,)g("more) g(\045s",)h(arg\);)234 2547 y(return)g(\(system)e(\(syscom\)\);)195 2590 y(})p eop -%%Page: 52 56 -52 55 bop 75 -58 a Ft(52)1299 b(GNU)15 b(Readline)h(Library)195 -149 y Fd(com_rename)g(\(arg\))293 193 y(char)i(*arg;)195 -237 y({)234 280 y(too_danger)o(ous)e(\("rename")o(\);)234 -324 y(return)i(\(1\);)195 367 y(})195 455 y(com_stat)f(\(arg\))293 -498 y(char)h(*arg;)195 542 y({)234 585 y(struct)g(stat)g(finfo;)234 -672 y(if)h(\(!valid_ar)o(gu)o(men)o(t)d(\("stat",)h(arg\)\))273 -716 y(return)h(\(1\);)234 803 y(if)h(\(stat)f(\(arg,)f(&finfo\))g(==)i -(-1\))273 847 y({)313 890 y(perror)e(\(arg\);)313 934 -y(return)g(\(1\);)273 978 y(})234 1065 y(printf)h(\("Statis)o(tic)o(s)e -(for)j(`\045s':\\n",)d(arg\);)234 1152 y(printf)i(\("\045s)g(has)g +%%Page: 53 57 +53 56 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)843 b(53)195 149 y Fd(com_rename)16 b(\(arg\))293 +193 y(char)i(*arg;)195 237 y({)234 280 y(too_danger)o(ous)e(\("rename") +o(\);)234 324 y(return)i(\(1\);)195 367 y(})195 455 y(com_stat)f +(\(arg\))293 498 y(char)h(*arg;)195 542 y({)234 585 y(struct)g(stat)g +(finfo;)234 672 y(if)h(\(!valid_ar)o(gu)o(men)o(t)d(\("stat",)h +(arg\)\))273 716 y(return)h(\(1\);)234 803 y(if)h(\(stat)f(\(arg,)f +(&finfo\))g(==)i(-1\))273 847 y({)313 890 y(perror)e(\(arg\);)313 +934 y(return)g(\(1\);)273 978 y(})234 1065 y(printf)h(\("Statis)o(tic)o +(s)e(for)j(`\045s':\\n",)d(arg\);)234 1152 y(printf)i(\("\045s)g(has)g (\045d)h(link\045s,)e(and)h(is)h(\045d)g(byte\045s)e(in)i(length.\\n")o (,)d(arg,)391 1196 y(finfo.st_n)o(li)o(nk,)391 1239 y(\(finfo.st_)o(nl) o(ink)g(==)j(1\))g(?)g("")g(:)g("s",)391 1283 y(finfo.st_s)o(iz)o(e,) @@ -4683,17 +4743,16 @@ y(})195 1936 y(/*)h(Print)f(out)g(help)g(for)g(ARG,)h(or)f(for)h(all)f 2460 y(printf)e(\("\045s\\t\\t\045s.)o(\\n)o(",)f(commands[i)o(].n)o (am)o(e,)g(commands[i)o(].d)o(oc\))o(;)391 2503 y(printed++;)352 2547 y(})273 2590 y(})p eop -%%Page: 53 57 -53 56 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g -(Readline)843 b(53)234 149 y Fd(if)19 b(\(!printed\))273 -193 y({)313 237 y(printf)e(\("No)h(commands)f(match)g(`\045s'.)38 -b(Possibil)o(tie)o(s)17 b(are:\\n",)f(arg\);)313 324 -y(for)i(\(i)h(=)g(0;)g(commands[i)o(].)o(nam)o(e;)d(i++\))352 -367 y({)391 411 y(/*)j(Print)f(in)g(six)h(columns.)d(*/)391 -455 y(if)j(\(printed)d(==)j(6\))430 498 y({)470 542 y(printed)d(=)k(0;) -470 585 y(printf)d(\("\\n"\);)430 629 y(})391 716 y(printf)g -(\("\045s\\t",)g(commands[)o(i].)o(nam)o(e\))o(;)391 -760 y(printed++;)352 803 y(})313 890 y(if)i(\(printed)o(\))352 +%%Page: 54 58 +54 57 bop 75 -58 a Ft(54)1299 b(GNU)15 b(Readline)h(Library)234 +149 y Fd(if)j(\(!printed\))273 193 y({)313 237 y(printf)e(\("No)h +(commands)f(match)g(`\045s'.)38 b(Possibil)o(tie)o(s)17 +b(are:\\n",)f(arg\);)313 324 y(for)i(\(i)h(=)g(0;)g(commands[i)o(].)o +(nam)o(e;)d(i++\))352 367 y({)391 411 y(/*)j(Print)f(in)g(six)h +(columns.)d(*/)391 455 y(if)j(\(printed)d(==)j(6\))430 +498 y({)470 542 y(printed)d(=)k(0;)470 585 y(printf)d(\("\\n"\);)430 +629 y(})391 716 y(printf)g(\("\045s\\t",)g(commands[)o(i].)o(nam)o(e\)) +o(;)391 760 y(printed++;)352 803 y(})313 890 y(if)i(\(printed)o(\))352 934 y(printf)e(\("\\n"\);)273 978 y(})234 1021 y(return)h(\(0\);)195 1065 y(})195 1152 y(/*)h(Change)e(to)i(the)f(directory)f(ARG.)h(*/)195 1196 y(com_cd)f(\(arg\))293 1239 y(char)h(*arg;)195 1283 @@ -4711,14 +4770,15 @@ y({)234 1326 y(if)h(\(chdir)e(\(arg\))h(==)h(-1\))273 y(})195 2503 y(/*)h(The)f(user)g(wishes)g(to)g(quit)h(using)e(this)h (program.)36 b(Just)19 b(set)f(DONE)254 2547 y(non-zero.)e(*/)195 2590 y(com_quit)h(\(arg\))293 2634 y(char)h(*arg;)p eop -%%Page: 54 58 -54 57 bop 75 -58 a Ft(54)1299 b(GNU)15 b(Readline)h(Library)195 -149 y Fd({)234 193 y(done)i(=)i(1;)234 237 y(return)e(\(0\);)195 -280 y(})195 367 y(/*)h(Function)d(which)i(tells)g(you)g(that)g(you)h -(can't)e(do)i(this.)f(*/)195 411 y(too_danger)o(ou)o(s)f(\(caller\))293 -455 y(char)h(*caller;)195 498 y({)234 542 y(fprintf)f(\(stderr,)411 -585 y("\045s:)h(Too)g(dangerous)e(for)j(me)g(to)g(distribu)o(te.)o -(\\n")411 629 y(caller\);)234 672 y(fprintf)e(\(stderr,)g("Write)g(it)i +%%Page: 55 59 +55 58 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)843 b(55)195 149 y Fd({)234 193 y(done)18 b(=)i(1;)234 +237 y(return)e(\(0\);)195 280 y(})195 367 y(/*)h(Function)d(which)i +(tells)g(you)g(that)g(you)h(can't)e(do)i(this.)f(*/)195 +411 y(too_danger)o(ou)o(s)f(\(caller\))293 455 y(char)h(*caller;)195 +498 y({)234 542 y(fprintf)f(\(stderr,)411 585 y("\045s:)h(Too)g +(dangerous)e(for)j(me)g(to)g(distribu)o(te.)o(\\n")411 +629 y(caller\);)234 672 y(fprintf)e(\(stderr,)g("Write)g(it)i (yourself.)o(\\n")o(\);)195 716 y(})195 803 y(/*)g(Return)e(non-zero)g (if)h(ARG)h(is)g(a)g(valid)f(argument)e(for)j(CALLER,)254 847 y(else)f(print)g(an)g(error)g(message)f(and)h(return)g(zero.)f(*/) @@ -4728,9 +4788,12 @@ h(!*arg\))273 1108 y({)313 1152 y(fprintf)e(\(stderr,)f("\045s:)i (Argument)f(required.)o(\\n)o(",)f(caller\);)313 1196 y(return)h(\(0\);)273 1239 y(})234 1326 y(return)h(\(1\);)195 1370 y(})p eop -%%Page: 55 59 -55 58 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o -(ual)1053 b(55)75 149 y Fp(App)r(endix)25 b(A)20 b(Cop)n(ying)26 +%%Page: 56 60 +56 59 bop 75 -58 a Ft(56)1299 b(GNU)15 b(Readline)h(Library)p +eop +%%Page: 57 61 +57 60 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o +(ual)1053 b(57)75 149 y Fp(App)r(endix)25 b(A)20 b(Cop)n(ying)26 b(This)g(Man)n(ual)75 345 y Fr(A.1)33 b(GNU)21 b(F)-6 b(ree)23 b(Do)r(cumen)n(tation)g(License)698 455 y Ft(V)l(ersion)16 b(1.2,)e(No)o(v)o(em)o(b)q(er)h(2002)195 526 y(Cop)o(yrigh)o(t)421 @@ -4802,8 +4865,8 @@ h(ma)o(y)e(not)h(explain)h(an)o(y)f(mathematics.\))18 b(The)165 2670 y(relationship)d(could)g(b)q(e)f(a)g(matter)e(of)i (historical)g(connection)h(with)f(the)g(sub)s(ject)f(or)h(with)g (related)p eop -%%Page: 56 60 -56 59 bop 75 -58 a Ft(56)1299 b(GNU)15 b(Readline)h(Library)165 +%%Page: 58 62 +58 61 bop 75 -58 a Ft(58)1299 b(GNU)15 b(Readline)h(Library)165 149 y(matters,)h(or)g(of)g(legal,)i(commercial,)g(philosophical,)i (ethical)e(or)e(p)q(olitical)j(p)q(osition)f(regarding)165 204 y(them.)165 275 y(The)13 b(\\In)o(v)m(arian)o(t)g(Sections")g(are)g @@ -4893,9 +4956,9 @@ k(are)d(considered)j(to)165 2560 y(b)q(e)g(included)j(b)o(y)d d(ha)o(v)o(e)h(is)h(v)o(oid)g(and)g(has)f(no)165 2670 y(e\013ect)d(on)g(the)g(meaning)h(of)f(this)h(License.)p eop -%%Page: 57 61 -57 60 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o -(ual)1053 b(57)100 149 y(2.)29 b(VERBA)l(TIM)15 b(COPYING)165 +%%Page: 59 63 +59 62 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o +(ual)1053 b(59)100 149 y(2.)29 b(VERBA)l(TIM)15 b(COPYING)165 222 y(Y)l(ou)k(ma)o(y)g(cop)o(y)f(and)i(distribute)g(the)f(Do)q(cumen)o (t)g(in)h(an)o(y)f(medium,)h(either)g(commercially)g(or)165 277 y(noncommercially)l(,)k(pro)o(vided)e(that)f(this)h(License,)i(the) @@ -4977,8 +5040,8 @@ q(cumen)o(t.)100 2378 y(4.)29 b(MODIFICA)l(TIONS)165 (er)h(p)q(ossesses)h(a)e(cop)o(y)h(of)165 2670 y(it.)j(In)c(addition,)g (y)o(ou)f(m)o(ust)f(do)h(these)h(things)g(in)g(the)f(Mo)q(di\014ed)h(V) l(ersion:)p eop -%%Page: 58 62 -58 61 bop 75 -58 a Ft(58)1299 b(GNU)15 b(Readline)h(Library)178 +%%Page: 60 64 +60 63 bop 75 -58 a Ft(60)1299 b(GNU)15 b(Readline)h(Library)178 149 y(A.)30 b(Use)17 b(in)g(the)f(Title)h(P)o(age)f(\(and)g(on)h(the)f (co)o(v)o(ers,)g(if)g(an)o(y\))g(a)g(title)h(distinct)h(from)d(that)h (of)g(the)255 204 y(Do)q(cumen)o(t,)h(and)g(from)f(those)h(of)f @@ -5057,9 +5120,9 @@ h(Section.)177 2540 y(O.)30 b(Preserv)o(e)15 b(an)o(y)g(W)l(arran)o(t)o (that)d(qualify)165 2670 y(as)e(Secondary)g(Sections)h(and)f(con)o (tain)g(no)g(material)g(copied)h(from)e(the)h(Do)q(cumen)o(t,)g(y)o(ou) f(ma)o(y)h(at)p eop -%%Page: 59 63 -59 62 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o -(ual)1053 b(59)165 149 y(y)o(our)16 b(option)g(designate)h(some)f(or)f +%%Page: 61 65 +61 64 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o +(ual)1053 b(61)165 149 y(y)o(our)16 b(option)g(designate)h(some)f(or)f (all)i(of)f(these)h(sections)f(as)g(in)o(v)m(arian)o(t.)24 b(T)l(o)15 b(do)i(this,)f(add)g(their)165 204 y(titles)i(to)f(the)h (list)h(of)e(In)o(v)m(arian)o(t)h(Sections)h(in)f(the)g(Mo)q(di\014ed)h @@ -5142,8 +5205,8 @@ g(in)g(all)165 2440 y(other)c(resp)q(ects.)165 2506 y(Y)l(ou)h(ma)o(y)f 2615 y(do)q(cumen)o(t,)g(and)f(follo)o(w)g(this)h(License)h(in)f(all)h (other)d(resp)q(ects)i(regarding)g(v)o(erbatim)f(cop)o(ying)g(of)165 2670 y(that)e(do)q(cumen)o(t.)p eop -%%Page: 60 64 -60 63 bop 75 -58 a Ft(60)1299 b(GNU)15 b(Readline)h(Library)100 +%%Page: 62 66 +62 65 bop 75 -58 a Ft(62)1299 b(GNU)15 b(Readline)h(Library)100 149 y(7.)29 b(A)o(GGREGA)l(TION)14 b(WITH)i(INDEPENDENT)e(W)o(ORKS)165 214 y(A)g(compilation)h(of)f(the)g(Do)q(cumen)o(t)g(or)f(its)i(deriv)m (ativ)o(es)g(with)f(other)g(separate)f(and)i(indep)q(enden)o(t)165 @@ -5227,9 +5290,9 @@ b(If)17 b(the)g(Do)q(cumen)o(t)f(do)q(es)g(not)g(sp)q(ecify)i(a)e(v)o (ma)o(y)f(c)o(ho)q(ose)i(an)o(y)e(v)o(ersion)i(ev)o(er)f(published)j (\(not)c(as)h(a)g(draft\))f(b)o(y)i(the)f(F)l(ree)165 2660 y(Soft)o(w)o(are)d(F)l(oundation.)p eop -%%Page: 61 65 -61 64 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o -(ual)1053 b(61)75 149 y Fh(A.1.1)30 b(ADDENDUM:)22 b(Ho)n(w)f(to)f(use) +%%Page: 63 67 +63 66 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o +(ual)1053 b(63)75 149 y Fh(A.1.1)30 b(ADDENDUM:)22 b(Ho)n(w)f(to)f(use) h(this)f(License)h(for)f(y)n(our)h(do)r(cumen)n(ts)137 271 y Ft(T)l(o)14 b(use)g(this)g(License)h(in)g(a)e(do)q(cumen)o(t)h(y) o(ou)f(ha)o(v)o(e)h(written,)f(include)j(a)d(cop)o(y)h(of)f(the)h @@ -5262,11 +5325,11 @@ Fc(list)h(their)g(titles)p Fd(,)f(with)273 860 y(the)i(Front-Cov)o(er)d (license,)k(suc)o(h)e(as)g(the)f(GNU)75 1196 y(General)16 b(Public)h(License,)f(to)f(p)q(ermit)h(their)f(use)h(in)g(free)f(soft)o (w)o(are.)p eop -%%Page: 62 66 -62 65 bop 75 -58 a Ft(62)1299 b(GNU)15 b(Readline)h(Library)p +%%Page: 64 68 +64 67 bop 75 -58 a Ft(64)1299 b(GNU)15 b(Readline)h(Library)p eop -%%Page: 63 67 -63 66 bop 75 -58 a Ft(Concept)15 b(Index)1466 b(63)75 +%%Page: 65 69 +65 68 bop 75 -58 a Ft(Concept)15 b(Index)1466 b(65)75 149 y Fp(Concept)27 b(Index)75 319 y Fr(A)75 380 y Fb(application)q (-sp)q(eci)q(\014c)16 b(completion)f(functions)5 b Fa(.)j(.)e(.)g(.)g (.)g(.)h(.)17 b Fb(41)75 511 y Fr(C)75 571 y Fb(command)d(editing)e @@ -5276,7 +5339,7 @@ Fb(1)75 703 y Fr(E)75 763 y Fb(editing)15 b(command)f(lines)f Fa(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)24 b Fb(1)75 895 y Fr(F)75 955 y Fb(FDL,)13 b(GNU)f(F)m(ree)h(Do)q(cumen)o(tation)j(License)6 -b Fa(.)h(.)f(.)g(.)g(.)g(.)h(.)18 b Fb(55)75 1086 y Fr(I)75 +b Fa(.)h(.)f(.)g(.)g(.)g(.)h(.)18 b Fb(57)75 1086 y Fr(I)75 1147 y Fb(initiali)q(zati)q(on)e(\014le,)e(readline)t Fa(.)8 b(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)17 b Fb(4)75 1192 y(in)o(teraction,)e(readline)5 @@ -5301,12 +5364,12 @@ Fb(5)1012 1131 y Fr(Y)1012 1192 y Fb(y)o(anking)e(text)t Fa(.)7 b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b Fb(2)p eop -%%Page: 64 68 -64 67 bop 75 -58 a Ft(64)1299 b(GNU)15 b(Readline)h(Library)p +%%Page: 66 70 +66 69 bop 75 -58 a Ft(66)1299 b(GNU)15 b(Readline)h(Library)p eop -%%Page: 65 69 -65 68 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 -b(65)75 149 y Fp(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 +%%Page: 67 71 +67 70 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 +b(67)75 149 y Fp(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 b(Index)p 80 305 21 3 v 75 366 a Fd(_rl_digit_)o(p)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 @@ -5491,8 +5554,8 @@ b Fb(14)1012 2626 y Fd(non-increme)o(nt)o(al-)o(re)o(ver)o(se)o(-se)o (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h (.)20 b Fb(14)p eop -%%Page: 66 70 -66 69 bop 75 -58 a Ft(66)1299 b(GNU)15 b(Readline)h(Library)75 +%%Page: 68 72 +68 71 bop 75 -58 a Ft(68)1299 b(GNU)15 b(Readline)h(Library)75 149 y Fr(O)75 209 y Fb(output-meta)5 b Fa(.)i(.)f(.)h(.)f(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fb(7)75 253 @@ -5604,352 +5667,363 @@ b Fb(45)75 2670 y Fd(rl_complet)o(io)o(n_d)o(is)o(pla)o(y_m)o(at)o(che) o(s_)o(hoo)o(k)9 b Fa(.)d(.)g(.)g(.)g(.)g(.)h(.)24 b Fb(44)1012 149 y Fd(rl_completi)o(on)o(_en)o(tr)o(y_f)o(un)o(cti)o(on)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17 b Fb(42,)c(43)1012 -194 y Fd(rl_completi)o(on)o(_ma)o(rk)o(_sy)o(ml)o(ink)o(_di)o(rs)t -Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(45)1012 -238 y Fd(rl_completi)o(on)o(_ma)o(tc)o(hes)8 b Fa(.)f(.)f(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 -b Fb(42)1012 282 y Fd(rl_completi)o(on)o(_mo)o(de)t Fa(.)t(.)6 -b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(42)1012 326 y Fd(rl_completi)o(on)o(_qu) -o(er)o(y_i)o(te)o(ms)9 b Fa(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)23 b Fb(45)1012 371 y Fd(rl_completi)o(on)o(_su) -o(pp)o(res)o(s_)o(app)o(end)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)20 b Fb(45)1012 415 y Fd(rl_completi)o(on)o(_ty)o(pe)t +194 y Fd(rl_completi)o(on)o(_fo)o(un)o(d_q)o(uo)o(te)c +Fa(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 +b Fb(46)1012 238 y Fd(rl_completi)o(on)o(_ma)o(rk)o(_sy)o(ml)o(ink)o +(_di)o(rs)t Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 +b Fb(46)1012 282 y Fd(rl_completi)o(on)o(_ma)o(tc)o(hes)8 +b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)h(.)25 b Fb(42)1012 326 y Fd(rl_completi)o(on)o(_mo)o(de)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(46)1012 459 y -Fd(rl_copy_key)o(ma)o(p)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)21 b Fb(28)1012 503 y Fd(rl_copy_tex)o(t)6 b Fa(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)1012 547 y -Fd(rl_crlf)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(33)1012 592 y Fd(rl_delete_t)o(ex)o(t)8 +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(42)1012 371 y +Fd(rl_completi)o(on)o(_qu)o(er)o(y_i)o(te)o(ms)9 b Fa(.)s(.)d(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 +b Fb(45)1012 415 y Fd(rl_completi)o(on)o(_qu)o(ot)o(e_c)o(ha)o(rac)o +(ter)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 +b Fb(45)1012 459 y Fd(rl_completi)o(on)o(_su)o(pp)o(res)o(s_)o(app)o +(end)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 +b Fb(45)1012 503 y Fd(rl_completi)o(on)o(_su)o(pp)o(res)o(s_)o(quo)o +(te)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)20 +b Fb(46)1012 547 y Fd(rl_completi)o(on)o(_ty)o(pe)t Fa(.)t(.)6 +b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(46)1012 592 y Fd(rl_completi)o(on)o(_wo) +o(rd)o(_br)o(ea)o(k_h)o(ook)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)20 b Fb(45)1012 636 y Fd(rl_copy_key)o(ma)o(p)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b -Fb(34)1012 636 y Fd(rl_deprep_t)o(er)o(m_f)o(un)o(cti)o(on)7 +Fb(28)1012 680 y Fd(rl_copy_tex)o(t)6 b Fa(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)1012 724 y Fd(rl_crlf)t +Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)h(.)17 b Fb(33)1012 769 y Fd(rl_delete_t)o(ex)o(t)8 +b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b +Fb(34)1012 813 y Fd(rl_deprep_t)o(er)o(m_f)o(un)o(cti)o(on)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)24 b Fb(26)1012 680 y Fd(rl_deprep_t)o(er)o(min)o(al)t +g(.)g(.)24 b Fb(26)1012 857 y Fd(rl_deprep_t)o(er)o(min)o(al)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(35)1012 724 y +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(35)1012 901 y Fd(rl_ding)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(36)1012 769 y Fd(rl_director)o(y_)o +f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(36)1012 945 y Fd(rl_director)o(y_)o (com)o(pl)o(eti)o(on)o(_ho)o(ok)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(44)1012 813 y Fd(rl_discard_)o(ke)o(yma) +(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(44)1012 990 y Fd(rl_discard_)o(ke)o(yma) o(p)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(29)1012 -857 y Fd(rl_dispatch)o(in)o(g)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)21 b Fb(24)1012 901 y Fd(rl_display_)o(ma)o(tch)o(_l)o(ist)8 -b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)25 b Fb(36)1012 945 y Fd(rl_do_undo)8 +1034 y Fd(rl_dispatch)o(in)o(g)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)h(.)21 b Fb(24)1012 1078 y Fd(rl_display_)o(ma)o(tch)o(_l)o +(ist)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(36)1012 1122 y Fd(rl_do_undo)8 b Fa(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)24 -b Fb(32)1012 990 y Fd(rl_done)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(24)1012 -1034 y Fd(rl_editing_)o(mo)o(de)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g +b Fb(32)1012 1167 y Fd(rl_done)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(24)1012 +1211 y Fd(rl_editing_)o(mo)o(de)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)21 b Fb(28)1012 1078 y Fd(rl_end)5 b Fa(.)t(.)h(.)g(.)h(.)f(.)g +g(.)g(.)21 b Fb(28)1012 1255 y Fd(rl_end)5 b Fa(.)t(.)h(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 -b Fb(24)1012 1122 y Fd(rl_end_undo)o(_g)o(rou)o(p)6 b +b Fb(24)1012 1299 y Fd(rl_end_undo)o(_g)o(rou)o(p)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(32)1012 1167 +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(32)1012 1343 y Fd(rl_erase_em)o(pt)o(y_l)o(in)o(e)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 -b Fb(24)1012 1211 y Fd(rl_event_ho)o(ok)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g +b Fb(24)1012 1388 y Fd(rl_event_ho)o(ok)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(26)1012 1255 y Fd(rl_execute_)o(ne)o +g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(26)1012 1432 y Fd(rl_execute_)o(ne)o (xt)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 -b Fb(34)1012 1299 y Fd(rl_executin)o(g_)o(key)o(ma)o(p)t +b Fb(35)1012 1476 y Fd(rl_executin)o(g_)o(key)o(ma)o(p)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Fb(26)1012 1343 y Fd(rl_executin)o(g_) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Fb(26)1012 1520 y Fd(rl_executin)o(g_) o(mac)o(ro)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(26)1012 -1388 y Fd(rl_expand_p)o(ro)o(mpt)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g +1564 y Fd(rl_expand_p)o(ro)o(mpt)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)20 b Fb(33)1012 1432 y Fd(rl_explicit)o(_a)o(rg)7 +g(.)20 b Fb(33)1012 1609 y Fd(rl_explicit)o(_a)o(rg)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(27)1012 -1476 y Fd(rl_extend_l)o(in)o(e_b)o(uf)o(fer)8 b Fa(.)f(.)f(.)g(.)g(.)g +1653 y Fd(rl_extend_l)o(in)o(e_b)o(uf)o(fer)8 b Fa(.)f(.)f(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 -b Fb(35)1012 1520 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(des)o +b Fb(35)1012 1697 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(des)o (ire)o(d)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 -b Fb(46)1012 1564 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(fun)o +b Fb(46)1012 1741 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(fun)o (cti)o(on)t Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 -b Fb(43)1012 1609 y Fd(rl_filename)o(_d)o(equ)o(ot)o(ing)o(_f)o(unc)o +b Fb(43)1012 1786 y Fd(rl_filename)o(_d)o(equ)o(ot)o(ing)o(_f)o(unc)o (tio)o(n)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 -b Fb(43)1012 1653 y Fd(rl_filename)o(_q)o(uot)o(e_)o(cha)o(ra)o(cte)o +b Fb(43)1012 1830 y Fd(rl_filename)o(_q)o(uot)o(e_)o(cha)o(ra)o(cte)o (rs)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)20 -b Fb(45)1012 1697 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_d)o(es)o(ire)o +b Fb(45)1012 1874 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_d)o(es)o(ire)o (d)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 -b Fb(46)1012 1741 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_f)o(un)o(cti)o +b Fb(46)1012 1918 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_f)o(un)o(cti)o (on)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)20 -b Fb(43)1012 1786 y Fd(rl_forced_u)o(pd)o(ate)o(_d)o(isp)o(la)o(y)7 +b Fb(43)1012 1962 y Fd(rl_forced_u)o(pd)o(ate)o(_d)o(isp)o(la)o(y)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)23 b Fb(33)1012 1830 y Fd(rl_free_lin)o(e_)o(sta)o(te)t +f(.)23 b Fb(33)1012 2007 y Fd(rl_free_lin)o(e_)o(sta)o(te)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(40)1012 1874 +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(40)1012 2051 y Fd(rl_free_und)o(o_)o(lis)o(t)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -19 b Fb(32)1012 1918 y Fd(rl_function)o(_d)o(ump)o(er)t +19 b Fb(32)1012 2095 y Fd(rl_function)o(_d)o(ump)o(er)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(31)1012 1962 +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(31)1012 2139 y Fd(rl_function)o(_o)o(f_k)o(ey)o(seq)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 -b Fb(31)1012 2007 y Fd(rl_funmap_n)o(am)o(es)7 b Fa(.)s(.)f(.)g(.)h(.)f +b Fb(31)1012 2184 y Fd(rl_funmap_n)o(am)o(es)7 b Fa(.)s(.)f(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)21 b Fb(31)1012 2051 y Fd(rl_generic_)o(bi)o(nd)7 +h(.)f(.)g(.)g(.)g(.)21 b Fb(31)1012 2228 y Fd(rl_generic_)o(bi)o(nd)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(30)1012 -2095 y Fd(rl_get_keym)o(ap)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h +2272 y Fd(rl_get_keym)o(ap)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)22 b Fb(29)1012 2139 y Fd(rl_get_keym)o(ap)o(_by)o(_n)o +h(.)f(.)g(.)22 b Fb(29)1012 2316 y Fd(rl_get_keym)o(ap)o(_by)o(_n)o (ame)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(29)1012 2184 y Fd(rl_get_keym)o(ap)o +(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(29)1012 2360 y Fd(rl_get_keym)o(ap)o (_na)o(me)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(29)1012 -2228 y Fd(rl_get_scre)o(en)o(_si)o(ze)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.) +2405 y Fd(rl_get_scre)o(en)o(_si)o(ze)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)19 b Fb(40)1012 2272 y Fd(rl_get_term)o(ca)o(p)8 b +(.)19 b Fb(40)1012 2449 y Fd(rl_get_term)o(ca)o(p)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b Fb(37)1012 -2316 y Fd(rl_getc)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) +2493 y Fd(rl_getc)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(34)1012 2360 y +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(34)1012 2537 y Fd(rl_getc_fun)o(ct)o(ion)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 -b Fb(26)1012 2405 y Fd(rl_gnu_read)o(li)o(ne_)o(p)6 b +b Fb(26)1012 2582 y Fd(rl_gnu_read)o(li)o(ne_)o(p)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(25)1012 2449 +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(25)1012 2626 y Fd(rl_ignore_c)o(om)o(ple)o(ti)o(on_)o(du)o(pli)o(cat)o(es)t -Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(45)1012 -2493 y Fd(rl_ignore_s)o(om)o(e_c)o(om)o(ple)o(ti)o(ons)o(_fu)o(nc)o -(tio)o(n)8 b Fa(.)e(.)g(.)g(.)g(.)h(.)24 b Fb(44)1012 -2537 y Fd(rl_inhibit_)o(co)o(mpl)o(et)o(ion)8 b Fa(.)f(.)f(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 -b Fb(46)1012 2582 y Fd(rl_initiali)o(ze)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(35)1012 2626 y Fd(rl_insert_c)o(om)o -(ple)o(ti)o(ons)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(42)1012 2670 -y Fd(rl_insert_t)o(ex)o(t)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)21 b Fb(34)p eop -%%Page: 67 71 -67 70 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 -b(67)75 149 y Fd(rl_instrea)o(m)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g +Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(46)1012 +2670 y Fd(rl_ignore_s)o(om)o(e_c)o(om)o(ple)o(ti)o(ons)o(_fu)o(nc)o +(tio)o(n)8 b Fa(.)e(.)g(.)g(.)g(.)h(.)24 b Fb(44)p eop +%%Page: 69 73 +69 72 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 +b(69)75 149 y Fd(rl_inhibit)o(_c)o(omp)o(le)o(tio)o(n)9 +b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)25 b Fb(47)75 193 y Fd(rl_initial)o(iz)o(e)9 +b Fa(.)s(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 +b Fb(36)75 237 y Fd(rl_insert_)o(co)o(mpl)o(et)o(ion)o(s)9 +b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)25 b Fb(42)75 280 y Fd(rl_insert_)o(te)o(xt)8 +b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b +Fb(34)75 324 y Fd(rl_instrea)o(m)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(25)75 194 y Fd(rl_invokin)o(g_)o(key)o +g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(25)75 368 y Fd(rl_invokin)o(g_)o(key)o (se)o(qs)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(31)75 -238 y Fd(rl_invokin)o(g_)o(key)o(se)o(qs_)o(in_)o(ma)o(p)8 +411 y Fd(rl_invokin)o(g_)o(key)o(se)o(qs_)o(in_)o(ma)o(p)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 -b Fb(31)75 282 y Fd(rl_kill_te)o(xt)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g +b Fb(31)75 455 y Fd(rl_kill_te)o(xt)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(34)75 326 y Fd(rl_last_fu)o(nc)6 +g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(34)75 499 y Fd(rl_last_fu)o(nc)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22 -b Fb(25)75 371 y Fd(rl_library)o(_v)o(ers)o(io)o(n)5 +b Fb(25)75 542 y Fd(rl_library)o(_v)o(ers)o(io)o(n)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(25)75 415 y Fd(rl_line_bu)o(ff) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(25)75 586 y Fd(rl_line_bu)o(ff) o(er)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 -b Fb(24)75 459 y Fd(rl_list_fu)o(nm)o(ap_)o(na)o(mes)s +b Fb(24)75 629 y Fd(rl_list_fu)o(nm)o(ap_)o(na)o(mes)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(31)75 503 y Fd(rl_macro_b)o(in)o(d)9 +f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(31)75 673 y Fd(rl_macro_b)o(in)o(d)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 -b Fb(36)75 548 y Fd(rl_macro_d)o(um)o(per)6 b Fa(.)t(.)g(.)g(.)g(.)g(.) +b Fb(36)75 717 y Fd(rl_macro_d)o(um)o(per)6 b Fa(.)t(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)20 b Fb(36)75 592 y Fd(rl_make_ba)o(re)o(_ke)o(ym)o +(.)g(.)h(.)f(.)g(.)20 b Fb(36)75 760 y Fd(rl_make_ba)o(re)o(_ke)o(ym)o (ap)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(28)75 636 +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(28)75 804 y Fd(rl_make_ke)o(ym)o(ap)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)21 b Fb(28)75 680 y Fd(rl_mark)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.) +(.)g(.)21 b Fb(28)75 848 y Fd(rl_mark)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 -b Fb(24)75 725 y Fd(rl_message)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g +b Fb(24)75 891 y Fd(rl_message)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fb(33)75 769 y Fd(rl_modifyi)o(ng)6 +g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fb(33)75 935 y Fd(rl_modifyi)o(ng)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22 -b Fb(32)75 813 y Fd(rl_named_f)o(un)o(cti)o(on)5 b Fa(.)s(.)i(.)f(.)g +b Fb(32)75 979 y Fd(rl_named_f)o(un)o(cti)o(on)5 b Fa(.)s(.)i(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)19 b Fb(31)75 858 y Fd(rl_num_cha)o(rs)o(_to)o(_r)o +g(.)g(.)g(.)g(.)19 b Fb(31)75 1022 y Fd(rl_num_cha)o(rs)o(_to)o(_r)o (ead)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(24)75 902 y Fd(rl_numeric)o(_a)o -(rg)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(24)75 1066 y Fd(rl_numeric)o(_a) +o(rg)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 -b Fb(28)75 946 y Fd(rl_on_new_)o(li)o(ne)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 990 y Fd(rl_on_new_)o(li)o(ne_)o(wi)o -(th_)o(pro)o(mp)o(t)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)21 b Fb(33)75 1035 y Fd(rl_outstre)o(am)6 +b Fb(28)75 1109 y Fd(rl_on_new_)o(li)o(ne)8 b Fa(.)s(.)e(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 1153 y Fd(rl_on_new_)o(li)o(ne_)o +(wi)o(th_)o(pro)o(mp)o(t)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)21 b Fb(33)75 1197 y Fd(rl_outstre)o(am)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22 -b Fb(25)75 1079 y Fd(rl_parse_a)o(nd)o(_bi)o(nd)5 b Fa(.)s(.)i(.)f(.)g +b Fb(25)75 1240 y Fd(rl_parse_a)o(nd)o(_bi)o(nd)5 b Fa(.)s(.)i(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)19 b Fb(30)75 1123 y Fd(rl_pending)o(_i)o(npu)o(t)6 +g(.)g(.)g(.)g(.)19 b Fb(30)75 1284 y Fd(rl_pending)o(_i)o(npu)o(t)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(24)75 -1167 y Fd(rl_point)s Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +1328 y Fd(rl_point)s Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Fb(24)75 1212 y Fd(rl_possibl)o(e_)o +g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Fb(24)75 1371 y Fd(rl_possibl)o(e_)o (com)o(pl)o(eti)o(ons)7 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(42)75 1256 y +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(42)75 1415 y Fd(rl_pre_inp)o(ut)o(_ho)o(ok)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 -b Fb(25)75 1300 y Fd(rl_prep_te)o(rm)o(_fu)o(nc)o(tio)o(n)9 +b Fb(25)75 1459 y Fd(rl_prep_te)o(rm)o(_fu)o(nc)o(tio)o(n)9 b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)25 b Fb(26)75 1344 y Fd(rl_prep_te)o(rm)o(ina)o(l)6 +f(.)g(.)g(.)g(.)25 b Fb(26)75 1502 y Fd(rl_prep_te)o(rm)o(ina)o(l)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(35)75 -1389 y Fd(rl_prompt)8 b Fa(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +1546 y Fd(rl_prompt)8 b Fa(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)24 b Fb(25)75 1433 y Fd(rl_push_ma)o(cr)o(o_i)o(np) +g(.)g(.)g(.)g(.)h(.)24 b Fb(25)75 1589 y Fd(rl_push_ma)o(cr)o(o_i)o(np) o(ut)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(34)75 1477 +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(34)75 1633 y Fd(rl_read_in)o(it)o(_fi)o(le)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -19 b Fb(31)75 1521 y Fd(rl_read_ke)o(y)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g +19 b Fb(31)75 1677 y Fd(rl_read_ke)o(y)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)75 1566 y +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)75 1720 y Fd(rl_readlin)o(e_)o(nam)o(e)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) -19 b Fb(25)75 1610 y Fd(rl_readlin)o(e_)o(sta)o(te)5 +19 b Fb(25)75 1764 y Fd(rl_readlin)o(e_)o(sta)o(te)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Fb(26)75 1654 +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Fb(26)75 1808 y Fd(rl_readlin)o(e_)o(ver)o(si)o(on)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 -b Fb(25)75 1698 y Fd(rl_redispl)o(ay)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g +b Fb(25)75 1851 y Fd(rl_redispl)o(ay)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(32)75 1743 y Fd(rl_redispl)o(ay)o(_fu)o +g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(32)75 1895 y Fd(rl_redispl)o(ay)o(_fu)o (nc)o(tio)o(n)9 b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25 b Fb(26)75 1787 y +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25 b Fb(26)75 1939 y Fd(rl_replace)o(_l)o(ine)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -20 b Fb(35)75 1831 y Fd(rl_reset_a)o(ft)o(er_)o(si)o(gna)o(l)9 +20 b Fb(35)75 1982 y Fd(rl_reset_a)o(ft)o(er_)o(si)o(gna)o(l)9 b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)25 b Fb(40)75 1875 y Fd(rl_reset_l)o(in)o(e_s)o(ta)o +f(.)g(.)g(.)g(.)25 b Fb(40)75 2026 y Fd(rl_reset_l)o(in)o(e_s)o(ta)o (te)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(33)75 1920 +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(33)75 2069 y Fd(rl_reset_t)o(er)o(min)o(al)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -19 b Fb(35)75 1964 y Fd(rl_resize_)o(te)o(rmi)o(na)o(l)5 +19 b Fb(35)75 2113 y Fd(rl_resize_)o(te)o(rmi)o(na)o(l)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(40)75 2008 y +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(40)75 2157 y Fd(rl_restore)o(_p)o(rom)o(pt)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 -b Fb(33)75 2052 y Fd(rl_save_pr)o(om)o(pt)8 b Fa(.)s(.)e(.)g(.)g(.)g(.) +b Fb(33)75 2200 y Fd(rl_save_pr)o(om)o(pt)8 b Fa(.)s(.)e(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 2097 y Fd(rl_set_key)7 +(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 2244 y Fd(rl_set_key)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 -b Fb(30)75 2141 y Fd(rl_set_key)o(bo)o(ard)o(_i)o(npu)o(t_t)o(im)o(eou) +b Fb(30)75 2288 y Fd(rl_set_key)o(bo)o(ard)o(_i)o(npu)o(t_t)o(im)o(eou) o(t)6 b Fa(.)s(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 -b Fb(35)75 2185 y Fd(rl_set_key)o(ma)o(p)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f +b Fb(35)75 2331 y Fd(rl_set_key)o(ma)o(p)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)22 b Fb(29)75 2229 y Fd(rl_set_par)o(en)o(_bl)o +h(.)f(.)g(.)g(.)g(.)g(.)22 b Fb(29)75 2375 y Fd(rl_set_par)o(en)o(_bl)o (in)o(k_t)o(ime)o(ou)o(t)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)21 b Fb(37)75 2274 y Fd(rl_set_pro)o(mp)o(t)9 +(.)g(.)g(.)g(.)h(.)f(.)21 b Fb(37)75 2419 y Fd(rl_set_pro)o(mp)o(t)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 -b Fb(34)75 2318 y Fd(rl_set_scr)o(ee)o(n_s)o(iz)o(e)5 -b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(40)1012 149 y -Fd(rl_set_sign)o(al)o(s)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)21 b Fb(41)1012 193 y Fd(rl_show_cha)o(r)6 b Fa(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(33)1012 237 y -Fd(rl_special_)o(pr)o(efi)o(xe)o(s)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 -b Fb(45)1012 280 y Fd(rl_startup_)o(ho)o(ok)7 b Fa(.)s(.)f(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)21 b Fb(25)1012 324 y Fd(rl_stuff_ch)o(ar)8 -b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 -b Fb(34)1012 367 y Fd(rl_terminal)o(_n)o(ame)6 b Fa(.)s(.)g(.)g(.)g(.)h +b Fb(34)1012 149 y Fd(rl_set_scre)o(en)o(_si)o(ze)t Fa(.)t(.)6 +b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(40)1012 193 y Fd(rl_set_sign)o(al)o(s)8 +b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b +Fb(41)1012 237 y Fd(rl_show_cha)o(r)6 b Fa(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(33)1012 281 y Fd(rl_special_)o(pr)o +(efi)o(xe)o(s)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Fb(45)1012 +325 y Fd(rl_startup_)o(ho)o(ok)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)21 b Fb(25)1012 368 y Fd(rl_stuff_ch)o(ar)8 b +Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 +b Fb(34)1012 412 y Fd(rl_terminal)o(_n)o(ame)6 b Fa(.)s(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)20 b Fb(25)1012 411 y Fd(rl_tty_set_)o(de)o(fau)o(lt)o +h(.)f(.)g(.)g(.)20 b Fb(25)1012 456 y Fd(rl_tty_set_)o(de)o(fau)o(lt)o (_bi)o(nd)o(ing)o(s)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)21 b Fb(35)1012 455 y Fd(rl_tty_unse)o(t_)o(def)o(au)o +(.)h(.)f(.)g(.)21 b Fb(35)1012 500 y Fd(rl_tty_unse)o(t_)o(def)o(au)o (lt_)o(bi)o(ndi)o(ngs)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)20 b Fb(35)1012 498 y Fd(rl_unbind_c)o(om)o(man)o(d_)o(in_)o +g(.)g(.)20 b Fb(35)1012 544 y Fd(rl_unbind_c)o(om)o(man)o(d_)o(in_)o (ma)o(p)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)f(.)23 b Fb(30)1012 542 y Fd(rl_unbind_f)o(un)o(cti)o(on)o +(.)g(.)h(.)f(.)23 b Fb(30)1012 587 y Fd(rl_unbind_f)o(un)o(cti)o(on)o (_in)o(_m)o(ap)9 b Fa(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)23 b Fb(30)1012 585 y Fd(rl_unbind_k)o(ey)8 +(.)g(.)g(.)g(.)g(.)23 b Fb(30)1012 631 y Fd(rl_unbind_k)o(ey)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 -b Fb(30)1012 629 y Fd(rl_unbind_k)o(ey)o(_in)o(_m)o(ap)s +b Fb(30)1012 675 y Fd(rl_unbind_k)o(ey)o(_in)o(_m)o(ap)s Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)17 b Fb(30)1012 673 y Fd(rl_username)o(_c)o +g(.)g(.)g(.)h(.)f(.)g(.)17 b Fb(30)1012 719 y Fd(rl_username)o(_c)o (omp)o(le)o(tio)o(n_)o(fun)o(cti)o(on)t Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)18 b Fb(43)1012 716 y Fd(rl_variable)o(_b)o(ind)6 +g(.)h(.)f(.)g(.)18 b Fb(43)1012 763 y Fd(rl_variable)o(_b)o(ind)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Fb(37)1012 -760 y Fd(rl_variable)o(_d)o(ump)o(er)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f +806 y Fd(rl_variable)o(_d)o(ump)o(er)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -19 b Fb(37)1012 886 y Fr(S)1012 944 y Fd(self-insert)9 +19 b Fb(37)1012 933 y Fr(S)1012 992 y Fd(self-insert)9 b(\(a,)j(b,)g(A,)g(1,)g(!,)g(...)o(\))6 b Fa(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 987 y Fd(set-mark)10 +h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1035 y Fd(set-mark)10 b(\(C-@\))g Fa(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25 -b Fb(18)1012 1031 y(sho)o(w-all-if-am)o(bigu)q(ous)14 +b Fb(18)1012 1079 y(sho)o(w-all-if-am)o(bigu)q(ous)14 b Fa(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(7)1012 1074 +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(7)1012 1123 y(sho)o(w-all-if-unmo)q(di)q(\014ed)7 b Fa(.)i(.)d(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) -19 b Fb(7)1012 1118 y Fd(start-kbd-m)o(ac)o(ro)9 b(\(C-x)j(\(\))c +19 b Fb(7)1012 1167 y Fd(start-kbd-m)o(ac)o(ro)9 b(\(C-x)j(\(\))c Fa(.)d(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)22 b Fb(18)1012 1238 y Fr(T)1012 1296 y Fd(tab-insert)9 -b(\(M-)1281 1294 y Fk(h)p 1292 1268 74 2 v 1292 1296 -a Fj(T)m(AB)p 1292 1304 V 1364 1294 a Fk(i)1379 1296 +(.)g(.)g(.)22 b Fb(18)1012 1288 y Fr(T)1012 1347 y Fd(tab-insert)9 +b(\(M-)1281 1345 y Fk(h)p 1292 1319 74 2 v 1292 1347 +a Fj(T)m(AB)p 1292 1354 V 1364 1345 a Fk(i)1379 1347 y Fd(\))e Fa(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Fb(15)1012 1340 +f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Fb(15)1012 1391 y Fd(tilde-expan)o(d)10 b(\(M-~\))f Fa(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 -b Fb(18)1012 1384 y Fd(transpose-c)o(ha)o(rs)9 b(\(C-t\))d +b Fb(18)1012 1434 y Fd(transpose-c)o(ha)o(rs)9 b(\(C-t\))d Fa(.)f(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1427 y Fd(transpose-w)o(or)o(ds)9 +(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1478 y Fd(transpose-w)o(or)o(ds)9 b(\(M-t\))d Fa(.)f(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1553 y -Fr(U)1012 1611 y Fd(undo)12 b(\(C-_)f(or)h(C-x)g(C-u\))c +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1605 y +Fr(U)1012 1663 y Fd(undo)12 b(\(C-_)f(or)h(C-x)g(C-u\))c Fa(.)t(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)21 b Fb(18)1012 1655 y Fd(universal-a)o(rg)o +(.)g(.)h(.)f(.)g(.)g(.)21 b Fb(18)1012 1707 y Fd(universal-a)o(rg)o (ume)o(nt)9 b(\(\))d Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(17)1012 -1698 y Fd(unix-line-d)o(is)o(car)o(d)10 b(\(C-u\))5 b -Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)18 b Fb(16)1012 1742 y Fd(unix-word-r)o(ub)o(out)9 -b(\(C-w\))d Fa(.)t(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fb(16)1012 1785 y Fd(upcase-word)9 -b(\(M-u\))e Fa(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fb(15)1012 -1911 y Fr(V)1012 1969 y Fd(vi-editing-)o(mo)o(de)9 b(\(M-C-j\))c -Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)h(.)f(.)18 b Fb(19)1012 2013 y(visible-stats)c Fa(.)6 -b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 -b Fb(7)1012 2129 y Fr(Y)1012 2187 y Fd(yank)12 b(\(C-y\))5 +1751 y Fd(unix-filena)o(me)o(-ru)o(bo)o(ut)9 b(\(\))c +Fa(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)18 b Fb(16)1012 1795 y Fd(unix-line-d)o(is)o(car)o(d)10 +b(\(C-u\))5 b Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)h(.)f(.)18 b Fb(16)1012 1839 y Fd(unix-word-r)o(ub)o +(out)9 b(\(C-w\))d Fa(.)t(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fb(16)1012 1882 +y Fd(upcase-word)9 b(\(M-u\))e Fa(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 +b Fb(15)1012 2009 y Fr(V)1012 2068 y Fd(vi-editing-)o(mo)o(de)9 +b(\(M-C-j\))c Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)h(.)f(.)18 b Fb(19)1012 2111 y(visible-stats)c +Fa(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 +b Fb(7)1012 2229 y Fr(Y)1012 2287 y Fd(yank)12 b(\(C-y\))5 b Fa(.)t(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 -b Fb(16)1012 2231 y Fd(yank-last-a)o(rg)9 b(\(M-.)i(or)h(M-_\))c +b Fb(17)1012 2331 y Fd(yank-last-a)o(rg)9 b(\(M-.)i(or)h(M-_\))c Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 -b Fb(14)1012 2274 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))d +b Fb(14)1012 2375 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))d Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(14)1012 2318 y Fd(yank-pop)10 +(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(14)1012 2419 y Fd(yank-pop)10 b(\(M-y\))g Fa(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25 b Fb(17)p eop -%%Page: 68 72 -68 71 bop 75 -58 a Ft(68)1299 b(GNU)15 b(Readline)h(Library)p +%%Page: 70 74 +70 73 bop 75 -58 a Ft(70)1299 b(GNU)15 b(Readline)h(Library)p eop %%Trailer end diff --git a/lib/readline/doc/rlman.aux b/lib/readline/doc/rlman.aux index b54c096c..b5c2d1cb 100644 --- a/lib/readline/doc/rlman.aux +++ b/lib/readline/doc/rlman.aux @@ -140,17 +140,17 @@ @xrdef{Completion Variables-pg}{43} @xrdef{Completion Variables-snt}{Section@tie 2.6.3} @xrdef{A Short Completion Example-title}{A Short Completion Example} -@xrdef{A Short Completion Example-pg}{46} +@xrdef{A Short Completion Example-pg}{47} @xrdef{A Short Completion Example-snt}{Section@tie 2.6.4} @xrdef{Copying This Manual-title}{Copying This Manual} -@xrdef{Copying This Manual-pg}{55} +@xrdef{Copying This Manual-pg}{57} @xrdef{Copying This Manual-snt}{Appendix@tie @char65{}} @xrdef{GNU Free Documentation License-title}{GNU Free Documentation License} -@xrdef{GNU Free Documentation License-pg}{55} +@xrdef{GNU Free Documentation License-pg}{57} @xrdef{GNU Free Documentation License-snt}{Section@tie @char65.1} @xrdef{Concept Index-title}{Concept Index} -@xrdef{Concept Index-pg}{63} +@xrdef{Concept Index-pg}{65} @xrdef{Concept Index-snt}{} @xrdef{Function and Variable Index-title}{Function and Variable Index} -@xrdef{Function and Variable Index-pg}{65} +@xrdef{Function and Variable Index-pg}{67} @xrdef{Function and Variable Index-snt}{} diff --git a/lib/readline/doc/rlman.cp b/lib/readline/doc/rlman.cp index 8b165829..30f7d906 100644 --- a/lib/readline/doc/rlman.cp +++ b/lib/readline/doc/rlman.cp @@ -9,4 +9,4 @@ \entry{variables, readline}{5}{variables, readline} \entry{readline, function}{21}{readline, function} \entry{application-specific completion functions}{41}{application-specific completion functions} -\entry{FDL, GNU Free Documentation License}{55}{FDL, GNU Free Documentation License} +\entry{FDL, GNU Free Documentation License}{57}{FDL, GNU Free Documentation License} diff --git a/lib/readline/doc/rlman.cps b/lib/readline/doc/rlman.cps index f4ec8c77..380e3345 100644 --- a/lib/readline/doc/rlman.cps +++ b/lib/readline/doc/rlman.cps @@ -5,7 +5,7 @@ \initial {E} \entry {editing command lines}{1} \initial {F} -\entry {FDL, GNU Free Documentation License}{55} +\entry {FDL, GNU Free Documentation License}{57} \initial {I} \entry {initialization file, readline}{4} \entry {interaction, readline}{1} diff --git a/lib/readline/doc/rlman.fn b/lib/readline/doc/rlman.fn index 114fdd07..15ab423d 100644 --- a/lib/readline/doc/rlman.fn +++ b/lib/readline/doc/rlman.fn @@ -60,12 +60,13 @@ \entry{kill-word (M-d)}{16}{\code {kill-word (M-d)}} \entry{backward-kill-word (M-DEL)}{16}{\code {backward-kill-word (M-\key {DEL})}} \entry{unix-word-rubout (C-w)}{16}{\code {unix-word-rubout (C-w)}} +\entry{unix-filename-rubout ()}{16}{\code {unix-filename-rubout ()}} \entry{delete-horizontal-space ()}{16}{\code {delete-horizontal-space ()}} \entry{kill-region ()}{16}{\code {kill-region ()}} \entry{copy-region-as-kill ()}{16}{\code {copy-region-as-kill ()}} \entry{copy-backward-word ()}{16}{\code {copy-backward-word ()}} \entry{copy-forward-word ()}{16}{\code {copy-forward-word ()}} -\entry{yank (C-y)}{16}{\code {yank (C-y)}} +\entry{yank (C-y)}{17}{\code {yank (C-y)}} \entry{yank-pop (M-y)}{17}{\code {yank-pop (M-y)}} \entry{digit-argument (M-0, M-1, ...{} M--)}{17}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}} \entry{universal-argument ()}{17}{\code {universal-argument ()}} @@ -188,7 +189,7 @@ \entry{rl_read_key}{34}{\code {rl_read_key}} \entry{rl_getc}{34}{\code {rl_getc}} \entry{rl_stuff_char}{34}{\code {rl_stuff_char}} -\entry{rl_execute_next}{34}{\code {rl_execute_next}} +\entry{rl_execute_next}{35}{\code {rl_execute_next}} \entry{rl_clear_pending_input}{35}{\code {rl_clear_pending_input}} \entry{rl_set_keyboard_input_timeout}{35}{\code {rl_set_keyboard_input_timeout}} \entry{rl_prep_terminal}{35}{\code {rl_prep_terminal}} @@ -198,7 +199,7 @@ \entry{rl_reset_terminal}{35}{\code {rl_reset_terminal}} \entry{rl_replace_line}{35}{\code {rl_replace_line}} \entry{rl_extend_line_buffer}{35}{\code {rl_extend_line_buffer}} -\entry{rl_initialize}{35}{\code {rl_initialize}} +\entry{rl_initialize}{36}{\code {rl_initialize}} \entry{rl_ding}{36}{\code {rl_ding}} \entry{rl_alphabetic}{36}{\code {rl_alphabetic}} \entry{rl_display_match_list}{36}{\code {rl_display_match_list}} @@ -248,16 +249,20 @@ \entry{rl_basic_word_break_characters}{44}{\code {rl_basic_word_break_characters}} \entry{rl_basic_quote_characters}{44}{\code {rl_basic_quote_characters}} \entry{rl_completer_word_break_characters}{45}{\code {rl_completer_word_break_characters}} +\entry{rl_completion_word_break_hook}{45}{\code {rl_completion_word_break_hook}} \entry{rl_completer_quote_characters}{45}{\code {rl_completer_quote_characters}} \entry{rl_filename_quote_characters}{45}{\code {rl_filename_quote_characters}} \entry{rl_special_prefixes}{45}{\code {rl_special_prefixes}} \entry{rl_completion_query_items}{45}{\code {rl_completion_query_items}} \entry{rl_completion_append_character}{45}{\code {rl_completion_append_character}} \entry{rl_completion_suppress_append}{45}{\code {rl_completion_suppress_append}} -\entry{rl_completion_mark_symlink_dirs}{45}{\code {rl_completion_mark_symlink_dirs}} -\entry{rl_ignore_completion_duplicates}{45}{\code {rl_ignore_completion_duplicates}} +\entry{rl_completion_quote_character}{45}{\code {rl_completion_quote_character}} +\entry{rl_completion_suppress_quote}{46}{\code {rl_completion_suppress_quote}} +\entry{rl_completion_found_quote}{46}{\code {rl_completion_found_quote}} +\entry{rl_completion_mark_symlink_dirs}{46}{\code {rl_completion_mark_symlink_dirs}} +\entry{rl_ignore_completion_duplicates}{46}{\code {rl_ignore_completion_duplicates}} \entry{rl_filename_completion_desired}{46}{\code {rl_filename_completion_desired}} \entry{rl_filename_quoting_desired}{46}{\code {rl_filename_quoting_desired}} \entry{rl_attempted_completion_over}{46}{\code {rl_attempted_completion_over}} \entry{rl_completion_type}{46}{\code {rl_completion_type}} -\entry{rl_inhibit_completion}{46}{\code {rl_inhibit_completion}} +\entry{rl_inhibit_completion}{47}{\code {rl_inhibit_completion}} diff --git a/lib/readline/doc/rlman.fns b/lib/readline/doc/rlman.fns index b1dfd486..b8e0863e 100644 --- a/lib/readline/doc/rlman.fns +++ b/lib/readline/doc/rlman.fns @@ -133,12 +133,16 @@ \entry {\code {rl_completion_append_character}}{45} \entry {\code {rl_completion_display_matches_hook}}{44} \entry {\code {rl_completion_entry_function}}{42, 43} -\entry {\code {rl_completion_mark_symlink_dirs}}{45} +\entry {\code {rl_completion_found_quote}}{46} +\entry {\code {rl_completion_mark_symlink_dirs}}{46} \entry {\code {rl_completion_matches}}{42} \entry {\code {rl_completion_mode}}{42} \entry {\code {rl_completion_query_items}}{45} +\entry {\code {rl_completion_quote_character}}{45} \entry {\code {rl_completion_suppress_append}}{45} +\entry {\code {rl_completion_suppress_quote}}{46} \entry {\code {rl_completion_type}}{46} +\entry {\code {rl_completion_word_break_hook}}{45} \entry {\code {rl_copy_keymap}}{28} \entry {\code {rl_copy_text}}{34} \entry {\code {rl_crlf}}{33} @@ -157,7 +161,7 @@ \entry {\code {rl_end_undo_group}}{32} \entry {\code {rl_erase_empty_line}}{24} \entry {\code {rl_event_hook}}{26} -\entry {\code {rl_execute_next}}{34} +\entry {\code {rl_execute_next}}{35} \entry {\code {rl_executing_keymap}}{26} \entry {\code {rl_executing_macro}}{26} \entry {\code {rl_expand_prompt}}{33} @@ -184,10 +188,10 @@ \entry {\code {rl_getc}}{34} \entry {\code {rl_getc_function}}{26} \entry {\code {rl_gnu_readline_p}}{25} -\entry {\code {rl_ignore_completion_duplicates}}{45} +\entry {\code {rl_ignore_completion_duplicates}}{46} \entry {\code {rl_ignore_some_completions_function}}{44} -\entry {\code {rl_inhibit_completion}}{46} -\entry {\code {rl_initialize}}{35} +\entry {\code {rl_inhibit_completion}}{47} +\entry {\code {rl_initialize}}{36} \entry {\code {rl_insert_completions}}{42} \entry {\code {rl_insert_text}}{34} \entry {\code {rl_instream}}{25} @@ -269,6 +273,7 @@ \initial {U} \entry {\code {undo (C-_ or C-x C-u)}}{18} \entry {\code {universal-argument ()}}{17} +\entry {\code {unix-filename-rubout ()}}{16} \entry {\code {unix-line-discard (C-u)}}{16} \entry {\code {unix-word-rubout (C-w)}}{16} \entry {\code {upcase-word (M-u)}}{15} @@ -276,7 +281,7 @@ \entry {\code {vi-editing-mode (M-C-j)}}{19} \entry {visible-stats}{7} \initial {Y} -\entry {\code {yank (C-y)}}{16} +\entry {\code {yank (C-y)}}{17} \entry {\code {yank-last-arg (M-. or M-_)}}{14} \entry {\code {yank-nth-arg (M-C-y)}}{14} \entry {\code {yank-pop (M-y)}}{17} diff --git a/lib/readline/doc/rlman.log b/lib/readline/doc/rlman.log index 08f7ef0e..4fa21f57 100644 --- a/lib/readline/doc/rlman.log +++ b/lib/readline/doc/rlman.log @@ -1,9 +1,9 @@ -This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12) 22 SEP 2003 09:04 -**/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlman.te -xi +This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12) 27 JUL 2004 09:31 +**/net/celerra-dm1/fs04/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlm +an.texi -(/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlman.tex -i (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics, +(/net/celerra-dm1/fs04/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlma +n.texi (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics, \bindingoffset=\dimen16 \normaloffset=\dimen17 \pagewidth=\dimen18 @@ -34,13 +34,13 @@ i (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics, \toksD=\toks18 \boxA=\box19 \countA=\count30 - fonts, + +fonts, \sffam=\fam8 \textleading=\dimen26 \mainmagstep=\count31 \fontdepth=\count32 - -page headings, + page headings, \titlepagetopglue=\skip20 \titlepagebottomglue=\skip21 \evenheadline=\toks19 @@ -81,7 +81,8 @@ page headings, \lastnegativepageno=\count43 \shortappendixwidth=\dimen33 \tocindent=\dimen34 - environments, + +environments, \errorbox=\box22 \lispnarrowing=\skip30 \envskipamount=\skip31 @@ -94,8 +95,7 @@ page headings, \lskip=\skip35 \rskip=\skip36 \tabw=\dimen38 - -defuns, + defuns, \defbodyindent=\skip37 \defargsindent=\skip38 \deflastargmargin=\skip39 @@ -186,7 +186,7 @@ gnored[] | [11] [12] [13] [14] [15] [16] [17] [18]) (rltech.texi Chapter 2 [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] -Underfull \hbox (badness 7379) in paragraph at lines 1757--1762 +Underfull \hbox (badness 7379) in paragraph at lines 1792--1797 []@textrm If an application-specific com-ple-tion func-tion as-signed to @text tt rl_attempted_ @@ -198,16 +198,16 @@ tt rl_attempted_ .@glue 3.65 plus 1.825 minus 1.21666 .etc. -[46] [47] [48] [49] [50] [51] [52] [53]) Appendix A [54] (fdl.texi [55] -[56] [57] [58] [59] [60]) (Concept Index) [61] [62] (rlman.cps) -(Function and Variable Index) [63] [64] (rlman.fns [65] [66]) [67] [68] ) +[46] [47] [48] [49] [50] [51] [52] [53] [54]) Appendix A [55] [56] (fdl.texi +[57] [58] [59] [60] [61] [62]) (Concept Index) [63] [64] (rlman.cps) +(Function and Variable Index) [65] [66] (rlman.fns [67] [68]) [69] [70] ) Here is how much of TeX's memory you used: 1489 strings out of 13013 - 18350 string characters out of 97233 - 56934 words of memory out of 263001 + 18360 string characters out of 97233 + 58248 words of memory out of 263001 2361 multiletter control sequences out of 10000+0 31953 words of font info for 111 fonts, out of 400000 for 1000 19 hyphenation exceptions out of 1000 - 15i,8n,17p,304b,695s stack positions out of 300i,100n,500p,50000b,4000s + 15i,8n,17p,309b,695s stack positions out of 300i,100n,500p,50000b,4000s -Output written on rlman.dvi (72 pages, 270424 bytes). +Output written on rlman.dvi (74 pages, 274068 bytes). diff --git a/lib/readline/doc/rlman.toc b/lib/readline/doc/rlman.toc index 9d08ef50..0dc63018 100644 --- a/lib/readline/doc/rlman.toc +++ b/lib/readline/doc/rlman.toc @@ -45,9 +45,9 @@ \subsecentry{How Completing Works}{2}{6}{1}{41} \subsecentry{Completion Functions}{2}{6}{2}{42} \subsecentry{Completion Variables}{2}{6}{3}{43} -\subsecentry{A Short Completion Example}{2}{6}{4}{46} -\appendixentry{Copying This Manual}{A}{55} -\secentry{GNU Free Documentation License}{A}{1}{55} -\subsecentry{ADDENDUM: How to use this License for your documents}{A}{1}{1}{61} -\unnumbchapentry{Concept Index}{2}{63} -\unnumbchapentry{Function and Variable Index}{2}{65} +\subsecentry{A Short Completion Example}{2}{6}{4}{47} +\appendixentry{Copying This Manual}{A}{57} +\secentry{GNU Free Documentation License}{A}{1}{57} +\subsecentry{ADDENDUM: How to use this License for your documents}{A}{1}{1}{63} +\unnumbchapentry{Concept Index}{2}{65} +\unnumbchapentry{Function and Variable Index}{2}{67} diff --git a/lib/readline/doc/rluserman.dvi b/lib/readline/doc/rluserman.dvi index f77eb4e6a6957f6203287b6329c81be28db5de07..55667c310cc82fe7fe056d868e921d5b67c780c2 100644 GIT binary patch delta 715 zcmXYuZ%9*77{-0?-BR29v!&sjD>Nmowl+7MPG}!Yg=Q2a6q&-EySCxHoBNYa(nW<( zqHP?QRzyiESQgPKh9A<32(gWnmBMz$^T)`b!ctb7aE!TmWb8cQ8UYioI>K z0w~9)JC}BXjFWBt%R<7ph1c(>2pC0+<63;~UN;}U;je=&JKzaNZjS6rfPDPoS+)SK z;Kgx?00vQXa)V5HoQ8kBGXN>E4E7F-e9rP z4An%-9d4t|?TWRNU(nOv?Kdpz77P}vHNdN#M-Qf?=*096FRyFV?X)oGQH$B)qLI^1 z)zgS#Ovq(sCoAPNqxwEG<)G?av;$Gj82=yE!WLbgK(loXAP_UFc(H8^eXiR5>1-ZY0t5hyuoA1)!f1Niz51GP$RK`#YqM z78d4mc0nA&b);ojAy;%HdoK-V;sBZWWWl6`8Ryn zz%|Ri6X6e6^0l?wLimC5qIE>{b?@O?D8(0veK4~Mc8Q3pV31AN9S@=23KM8yCD>ttc8I6Th(-4N1E@YDnE(I) delta 553 zcmX?embK*!>jXJLV?6^)JtHG414{#wZUzPh#>tFIDiebrOQrVM2d5U4q~=c8q?k0p z_g-qzMCN5_Mg|7Plf4<=Ff(@?oovNq1*G>)E@zV0oygp`$a2{PHy`0hl4M*mSzRfPNr`>(I~TLfdzF$z z8Phi_Se)TuvS8T!&SgD6MOH=+>XspPJ1&lOC9Q;Y;;zSSvK(X%o7ebQK!G#)#kD?` zm9mSJCRbgzWR~N5H+kFjV=VJUTAVl6-l%70TsG;BJxF-7(;ZnxmX#p!gu6#r8GAOX zKK{nZs0VhW-`fQ|jH;90|BPe$@nf_9ub+HOKO?q#aWYB^F>wS>_WxzQeUUU{iU5;T z!FCQE#?SnWf?z>&8^$#PjI7(A_%I3!GI_rR3!20+-ezNDnl6yaXwE3P-6NH;mXR~1 JlIcDe007R;+Gqd( diff --git a/lib/readline/doc/rluserman.fn b/lib/readline/doc/rluserman.fn index e073421a..14643e56 100644 --- a/lib/readline/doc/rluserman.fn +++ b/lib/readline/doc/rluserman.fn @@ -38,12 +38,13 @@ \entry{kill-word (M-d)}{16}{\code {kill-word (M-d)}} \entry{backward-kill-word (M-DEL)}{16}{\code {backward-kill-word (M-\key {DEL})}} \entry{unix-word-rubout (C-w)}{16}{\code {unix-word-rubout (C-w)}} +\entry{unix-filename-rubout ()}{16}{\code {unix-filename-rubout ()}} \entry{delete-horizontal-space ()}{16}{\code {delete-horizontal-space ()}} \entry{kill-region ()}{16}{\code {kill-region ()}} \entry{copy-region-as-kill ()}{16}{\code {copy-region-as-kill ()}} \entry{copy-backward-word ()}{16}{\code {copy-backward-word ()}} \entry{copy-forward-word ()}{16}{\code {copy-forward-word ()}} -\entry{yank (C-y)}{16}{\code {yank (C-y)}} +\entry{yank (C-y)}{17}{\code {yank (C-y)}} \entry{yank-pop (M-y)}{17}{\code {yank-pop (M-y)}} \entry{digit-argument (M-0, M-1, ...{} M--)}{17}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}} \entry{universal-argument ()}{17}{\code {universal-argument ()}} diff --git a/lib/readline/doc/rluserman.fns b/lib/readline/doc/rluserman.fns index 95140153..0ead5878 100644 --- a/lib/readline/doc/rluserman.fns +++ b/lib/readline/doc/rluserman.fns @@ -82,13 +82,14 @@ \initial {U} \entry {\code {undo (C-_ or C-x C-u)}}{18} \entry {\code {universal-argument ()}}{17} +\entry {\code {unix-filename-rubout ()}}{16} \entry {\code {unix-line-discard (C-u)}}{16} \entry {\code {unix-word-rubout (C-w)}}{16} \entry {\code {upcase-word (M-u)}}{15} \initial {V} \entry {\code {vi-editing-mode (M-C-j)}}{19} \initial {Y} -\entry {\code {yank (C-y)}}{16} +\entry {\code {yank (C-y)}}{17} \entry {\code {yank-last-arg (M-. or M-_)}}{14} \entry {\code {yank-nth-arg (M-C-y)}}{14} \entry {\code {yank-pop (M-y)}}{17} diff --git a/lib/readline/doc/rluserman.html b/lib/readline/doc/rluserman.html index 1aa77787..6055fbe7 100644 --- a/lib/readline/doc/rluserman.html +++ b/lib/readline/doc/rluserman.html @@ -1,6 +1,6 @@ - +
- +
digit-argument (M-0, M-1, ... M--) -
+
Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument.

- +

universal-argument () -
+
This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. @@ -1658,30 +1666,30 @@ By default, this is not bound to a key.

- +
complete (TAB) -
+
Attempt to perform completion on the text before point. The actual completion performed is application-specific. The default is filename completion.

- +

possible-completions (M-?) -
+
List the possible completions of the text before point.

- +

insert-completions (M-*) -
+
Insert all completions of the text before point that would have been generated by possible-completions.

- +

menu-complete () -
+
Similar to complete, but replaces the word to be completed with a single match from the list of possible completions. Repeated execution of menu-complete steps through the list @@ -1696,9 +1704,9 @@ This command is intended to be bound to TAB, but is unbound by default.

- +

delete-char-or-list () -
+
Deletes the character under the cursor if not at the beginning or end of the line (like delete-char). If at the end of the line, behaves identically to @@ -1727,22 +1735,22 @@ This command is unbound by default.
- +
start-kbd-macro (C-x () -
+
Begin saving the characters typed into the current keyboard macro.

- +

end-kbd-macro (C-x )) -
+
Stop saving the characters typed into the current keyboard macro and save the definition.

- +

call-last-kbd-macro (C-x e) -
+
Re-execute the last keyboard macro defined, by making the characters in the macro appear as if typed at the keyboard.

@@ -1768,87 +1776,87 @@ in the macro appear as if typed at the keyboard.

- +
re-read-init-file (C-x C-r) -
+
Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there.

- +

abort (C-g) -
+
Abort the current editing command and ring the terminal's bell (subject to the setting of bell-style).

- +

do-uppercase-version (M-a, M-b, M-x, ...) -
+
If the metafied character x is lowercase, run the command that is bound to the corresponding uppercase character.

- +

prefix-meta (ESC) -
+
Metafy the next character typed. This is for keyboards without a meta key. Typing `ESC f' is equivalent to typing M-f.

- +

undo (C-_ or C-x C-u) -
+
Incremental undo, separately remembered for each line.

- +

revert-line (M-r) -
+
Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning.

- +

tilde-expand (M-~) -
+
Perform tilde expansion on the current word.

- +

set-mark (C-@) -
+
Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.

- +

exchange-point-and-mark (C-x C-x) -
+
Swap the point with the mark. The current cursor position is set to the saved position, and the old cursor position is saved as the mark.

- +

character-search (C-]) -
+
A character is read and point is moved to the next occurrence of that character. A negative count searches for previous occurrences.

- +

character-search-backward (M-C-]) -
+
A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences.

- +

insert-comment (M-#) -
+
Without a numeric argument, the value of the comment-begin variable is inserted at the beginning of the current line. If a numeric argument is supplied, this command acts as a toggle: if @@ -1859,43 +1867,43 @@ the line. In either case, the line is accepted as if a newline had been typed.

- +

dump-functions () -
+
Print all of the functions and their key bindings to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-variables () -
+
Print all of the settable variables and their values to the Readline output stream. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

dump-macros () -
+
Print all of the Readline key sequences bound to macros and the strings they output. If a numeric argument is supplied, the output is formatted in such a way that it can be made part of an inputrc file. This command is unbound by default.

- +

emacs-editing-mode (C-e) -
+
When in vi command mode, this causes a switch to emacs editing mode.

- +

vi-editing-mode (M-C-j) -
+
When in emacs editing mode, this causes a switch to vi editing mode.

@@ -1982,7 +1990,7 @@ so forth.

- +

Version 1.2, November 2002
@@ -2600,7 +2608,7 @@ to permit their use in free software. [ ? ]

About this document

-This document was generated by Chet Ramey on September, 22 2003 +This document was generated by Chet Ramey on July, 27 2004 using texi2html

@@ -2762,7 +2770,7 @@ the following structure:
This document was generated -by Chet Ramey on September, 22 2003 +by Chet Ramey on July, 27 2004 using texi2html diff --git a/lib/readline/doc/rluserman.info b/lib/readline/doc/rluserman.info index 50c6b174..80958ec6 100644 --- a/lib/readline/doc/rluserman.info +++ b/lib/readline/doc/rluserman.info @@ -2,11 +2,11 @@ This is rluserman.info, produced by makeinfo version 4.5 from ./rluserman.texi. This manual describes the end user interface of the GNU Readline Library -(version 5.0, 19 September 2003), a library which aids in the -consistency of user interface across discrete programs which provide a -command line interface. +(version 5.0, 28 January 2004), a library which aids in the consistency +of user interface across discrete programs which provide a command line +interface. - Copyright (C) 1988-2003 Free Software Foundation, Inc. + Copyright (C) 1988-2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -1036,6 +1036,11 @@ Killing And Yanking Kill the word behind point, using white space as a word boundary. The killed text is saved on the kill-ring. +`unix-filename-rubout ()' + Kill the word behind point, using white space and the slash + character as the word boundaries. The killed text is saved on the + kill-ring. + `delete-horizontal-space ()' Delete all spaces and tabs around point. By default, this is unbound. @@ -1697,30 +1702,30 @@ permit their use in free software.  Tag Table: -Node: Top1341 -Node: Command Line Editing1776 -Node: Introduction and Notation2418 -Node: Readline Interaction4037 -Node: Readline Bare Essentials5225 -Node: Readline Movement Commands7007 -Node: Readline Killing Commands7965 -Node: Readline Arguments9876 -Node: Searching10913 -Node: Readline Init File13057 -Node: Readline Init File Syntax14119 -Node: Conditional Init Constructs25483 -Node: Sample Init File28009 -Node: Bindable Readline Commands31194 -Node: Commands For Moving32245 -Node: Commands For History33096 -Node: Commands For Text35956 -Node: Commands For Killing38672 -Node: Numeric Arguments40624 -Node: Commands For Completion41753 -Node: Keyboard Macros43287 -Node: Miscellaneous Commands43848 -Node: Readline vi Mode47199 -Node: Copying This Manual48115 -Node: GNU Free Documentation License48325 +Node: Top1339 +Node: Command Line Editing1774 +Node: Introduction and Notation2416 +Node: Readline Interaction4035 +Node: Readline Bare Essentials5223 +Node: Readline Movement Commands7005 +Node: Readline Killing Commands7963 +Node: Readline Arguments9874 +Node: Searching10911 +Node: Readline Init File13055 +Node: Readline Init File Syntax14117 +Node: Conditional Init Constructs25481 +Node: Sample Init File28007 +Node: Bindable Readline Commands31192 +Node: Commands For Moving32243 +Node: Commands For History33094 +Node: Commands For Text35954 +Node: Commands For Killing38670 +Node: Numeric Arguments40802 +Node: Commands For Completion41931 +Node: Keyboard Macros43465 +Node: Miscellaneous Commands44026 +Node: Readline vi Mode47377 +Node: Copying This Manual48293 +Node: GNU Free Documentation License48503  End Tag Table diff --git a/lib/readline/doc/rluserman.log b/lib/readline/doc/rluserman.log index 01f9a4dc..a5870c90 100644 --- a/lib/readline/doc/rluserman.log +++ b/lib/readline/doc/rluserman.log @@ -1,9 +1,9 @@ -This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12) 22 SEP 2003 09:04 -**/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rluserma -n.texi +This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12) 27 JUL 2004 09:31 +**/net/celerra-dm1/fs04/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlu +serman.texi -(/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rluserman -.texi (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics, +(/net/celerra-dm1/fs04/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlus +erman.texi (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics, \bindingoffset=\dimen16 \normaloffset=\dimen17 \pagewidth=\dimen18 @@ -187,11 +187,11 @@ gnored[] | [21] [22] [23] [24] [25] [26]) [27] [28] ) Here is how much of TeX's memory you used: 1398 strings out of 13013 - 16279 string characters out of 97233 - 44937 words of memory out of 263001 + 16289 string characters out of 97233 + 44933 words of memory out of 263001 2276 multiletter control sequences out of 10000+0 31953 words of font info for 111 fonts, out of 400000 for 1000 19 hyphenation exceptions out of 1000 - 13i,8n,10p,308b,695s stack positions out of 300i,100n,500p,50000b,4000s + 13i,8n,10p,313b,695s stack positions out of 300i,100n,500p,50000b,4000s -Output written on rluserman.dvi (32 pages, 91652 bytes). +Output written on rluserman.dvi (32 pages, 91852 bytes). diff --git a/lib/readline/doc/rluserman.ps b/lib/readline/doc/rluserman.ps index eb65adcf..dd3249da 100644 --- a/lib/readline/doc/rluserman.ps +++ b/lib/readline/doc/rluserman.ps @@ -8,7 +8,7 @@ %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -D 300 -o rluserman.ps rluserman.dvi %DVIPSParameters: dpi=300, compressed -%DVIPSSource: TeX output 2003.09.22:0904 +%DVIPSSource: TeX output 2004.07.27:0931 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -908,23 +908,23 @@ TeXDict begin %%Page: 1 1 1 0 bop 75 659 a Fp(GNU)33 b(Readline)h(Library)e(User)h(In)m(terface)p 75 709 1800 17 v 936 757 a Fo(Edition)17 b(5.0,)c(for)i -Fn(Readline)f(Library)g Fo(V)l(ersion)i(5.0.)1559 811 -y(Septem)o(b)q(er)g(2003)75 2467 y Fm(Chet)22 b(Ramey)-6 -b(,)23 b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)75 +Fn(Readline)f(Library)g Fo(V)l(ersion)i(5.0.)1609 811 +y(Jan)o(uary)f(2004)75 2467 y Fm(Chet)22 b(Ramey)-6 b(,)23 +b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)75 2534 y(Brian)h(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6 b(oundation)p 75 2570 1800 9 v eop %%Page: 2 2 -2 1 bop 75 1512 a Fo(This)15 b(man)o(ual)g(describ)q(es)i(the)d(end)i -(user)f(in)o(terface)g(of)f(the)h(GNU)f(Readline)i(Library)f(\(v)o -(ersion)g(5.0,)f(19)75 1567 y(Septem)o(b)q(er)19 b(2003\),)e(a)h -(library)h(whic)o(h)g(aids)g(in)g(the)f(consistency)h(of)f(user)g(in)o -(terface)h(across)e(discrete)75 1621 y(programs)d(whic)o(h)i(pro)o -(vide)g(a)f(command)g(line)i(in)o(terface.)75 1689 y(Cop)o(yrigh)o(t) -301 1688 y(c)289 1689 y Fl(\015)d Fo(1988-2003)f(F)l(ree)i(Soft)o(w)o -(are)f(F)l(oundation,)h(Inc.)75 1756 y(P)o(ermission)i(is)f(gran)o(ted) -g(to)f(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h -(man)o(ual)f(pro)o(vided)h(the)75 1811 y(cop)o(yrigh)o(t)e(notice)h -(and)f(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h +2 1 bop 75 1512 a Fo(This)20 b(man)o(ual)f(describ)q(es)i(the)f(end)g +(user)f(in)o(terface)h(of)f(the)g(GNU)g(Readline)i(Library)f(\(v)o +(ersion)f(5.0,)75 1567 y(28)e(Jan)o(uary)g(2004\),)f(a)h(library)h +(whic)o(h)g(aids)f(in)h(the)g(consistency)g(of)f(user)g(in)o(terface)h +(across)e(discrete)75 1621 y(programs)e(whic)o(h)i(pro)o(vide)g(a)f +(command)g(line)i(in)o(terface.)75 1689 y(Cop)o(yrigh)o(t)301 +1688 y(c)289 1689 y Fl(\015)d Fo(1988-2004)f(F)l(ree)i(Soft)o(w)o(are)f +(F)l(oundation,)h(Inc.)75 1756 y(P)o(ermission)i(is)f(gran)o(ted)g(to)f +(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h(man)o +(ual)f(pro)o(vided)h(the)75 1811 y(cop)o(yrigh)o(t)e(notice)h(and)f +(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h (copies.)195 1878 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)l(,) h(distribute)h(and/or)e(mo)q(dify)h(this)g(do)q(cumen)o(t)g(under)195 1933 y(the)h(terms)f(of)h(the)g(GNU)g(F)l(ree)g(Do)q(cumen)o(tation)g @@ -1922,114 +1922,119 @@ b(With)11 b(an)g(explicit)i(non-p)q(ositiv)o(e)f(n)o(umeric)g(argumen)o Fn(emacs)e Fo(mo)q(de;)h Fn(vi)g Fo(mo)q(de)h(do)q(es)g(o)o(v)o (erwrite)315 204 y(di\013eren)o(tly)l(.)21 b(Eac)o(h)15 b(call)h(to)f Fn(readline\(\))f Fo(starts)f(in)k(insert)e(mo)q(de.)315 -271 y(In)g(o)o(v)o(erwrite)f(mo)q(de,)h(c)o(haracters)f(b)q(ound)h(to)f +269 y(In)g(o)o(v)o(erwrite)f(mo)q(de,)h(c)o(haracters)f(b)q(ound)h(to)f Fn(self-insert)f Fo(replace)j(the)e(text)h(at)e(p)q(oin)o(t)315 -326 y(rather)20 b(than)h(pushing)h(the)f(text)f(to)g(the)h(righ)o(t.)36 -b(Characters)20 b(b)q(ound)i(to)e Fn(backward-)315 381 +324 y(rather)20 b(than)h(pushing)h(the)f(text)f(to)g(the)h(righ)o(t.)36 +b(Characters)20 b(b)q(ound)i(to)e Fn(backward-)315 379 y(delete-char)14 b Fo(replace)i(the)f(c)o(haracter)g(b)q(efore)g(p)q -(oin)o(t)h(with)f(a)g(space.)315 448 y(By)g(default,)h(this)f(command)g -(is)h(un)o(b)q(ound.)75 559 y Fc(1.4.4)30 b(Killing)20 -b(And)h(Y)-5 b(anking)75 680 y Fn(kill-line)14 b(\(C-k\))315 -735 y Fo(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f -(the)g(line.)75 814 y Fn(backward-kill-line)e(\(C-x)h(Rubout\))315 -869 y Fo(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g -(line.)75 948 y Fn(unix-line-discard)e(\(C-u\))315 1003 +(oin)o(t)h(with)f(a)g(space.)315 444 y(By)g(default,)h(this)f(command)g +(is)h(un)o(b)q(ound.)75 550 y Fc(1.4.4)30 b(Killing)20 +b(And)h(Y)-5 b(anking)75 669 y Fn(kill-line)14 b(\(C-k\))315 +724 y Fo(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f +(the)g(line.)75 800 y Fn(backward-kill-line)e(\(C-x)h(Rubout\))315 +854 y Fo(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g +(line.)75 930 y Fn(unix-line-discard)e(\(C-u\))315 985 y Fo(Kill)k(bac)o(kw)o(ard)e(from)f(the)i(cursor)e(to)h(the)g(b)q -(eginning)j(of)c(the)i(curren)o(t)f(line.)75 1082 y Fn(kill-whole-line) -e(\(\))315 1137 y Fo(Kill)20 b(all)g(c)o(haracters)d(on)h(the)h(curren) +(eginning)j(of)c(the)i(curren)o(t)f(line.)75 1060 y Fn(kill-whole-line) +e(\(\))315 1115 y Fo(Kill)20 b(all)g(c)o(haracters)d(on)h(the)h(curren) o(t)f(line,)i(no)e(matter)g(where)g(p)q(oin)o(t)h(is.)29 -b(By)19 b(default,)315 1192 y(this)d(is)f(un)o(b)q(ound.)75 -1271 y Fn(kill-word)f(\(M-d\))315 1325 y Fo(Kill)j(from)d(p)q(oin)o(t)h +b(By)19 b(default,)315 1170 y(this)d(is)f(un)o(b)q(ound.)75 +1245 y Fn(kill-word)f(\(M-d\))315 1300 y Fo(Kill)j(from)d(p)q(oin)o(t)h (to)f(the)h(end)g(of)f(the)h(curren)o(t)g(w)o(ord,)e(or)i(if)g(b)q(et)o -(w)o(een)g(w)o(ords,)e(to)i(the)f(end)315 1380 y(of)h(the)g(next)g(w)o +(w)o(een)g(w)o(ords,)e(to)i(the)f(end)315 1355 y(of)h(the)g(next)g(w)o (ord.)20 b(W)l(ord)14 b(b)q(oundaries)j(are)e(the)g(same)g(as)g -Fn(forward-word)p Fo(.)75 1459 y Fn(backward-kill-word)e(\(M-)592 -1457 y Ff(h)p 603 1431 73 2 v 603 1459 a Fe(DEL)p 603 -1467 V 674 1457 a Ff(i)689 1459 y Fn(\))315 1514 y Fo(Kill)k(the)d(w)o +Fn(forward-word)p Fo(.)75 1430 y Fn(backward-kill-word)e(\(M-)592 +1428 y Ff(h)p 603 1402 73 2 v 603 1430 a Fe(DEL)p 603 +1438 V 674 1428 a Ff(i)689 1430 y Fn(\))315 1485 y Fo(Kill)k(the)d(w)o (ord)g(b)q(ehind)i(p)q(oin)o(t.)21 b(W)l(ord)14 b(b)q(oundaries)h(are)f -(the)h(same)f(as)g Fn(backward-word)p Fo(.)75 1593 y -Fn(unix-word-rubout)f(\(C-w\))315 1648 y Fo(Kill)18 b(the)e(w)o(ord)f +(the)h(same)f(as)g Fn(backward-word)p Fo(.)75 1560 y +Fn(unix-word-rubout)f(\(C-w\))315 1615 y Fo(Kill)18 b(the)e(w)o(ord)f (b)q(ehind)j(p)q(oin)o(t,)e(using)h(white)f(space)g(as)g(a)f(w)o(ord)g -(b)q(oundary)l(.)23 b(The)16 b(killed)315 1703 y(text)f(is)g(sa)o(v)o -(ed)g(on)g(the)h(kill-ring.)75 1782 y Fn(delete-horizontal-space)c -(\(\))315 1836 y Fo(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q -(oin)o(t.)k(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75 -1915 y Fn(kill-region)e(\(\))315 1970 y Fo(Kill)j(the)f(text)e(in)i -(the)g(curren)o(t)f(region.)20 b(By)15 b(default,)h(this)f(command)g -(is)h(un)o(b)q(ound.)75 2049 y Fn(copy-region-as-kill)d(\(\))315 -2104 y Fo(Cop)o(y)j(the)i(text)e(in)i(the)f(region)g(to)g(the)g(kill)h -(bu\013er,)f(so)g(it)g(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o -(a)o(y)l(.)315 2159 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q -(ound.)75 2238 y Fn(copy-backward-word)d(\(\))315 2293 -y Fo(Cop)o(y)19 b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i -(kill)h(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315 -2348 y(same)c(as)g Fn(backward-word)p Fo(.)j(By)d(default,)g(this)h -(command)f(is)h(un)o(b)q(ound.)75 2427 y Fn(copy-forward-word)d(\(\)) -315 2481 y Fo(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f +(b)q(oundary)l(.)23 b(The)16 b(killed)315 1670 y(text)f(is)g(sa)o(v)o +(ed)g(on)g(the)h(kill-ring.)75 1745 y Fn(unix-filename-rubout)c(\(\)) +315 1800 y Fo(Kill)20 b(the)f(w)o(ord)e(b)q(ehind)j(p)q(oin)o(t,)f +(using)g(white)g(space)f(and)h(the)f(slash)h(c)o(haracter)e(as)h(the) +315 1855 y(w)o(ord)d(b)q(oundaries.)21 b(The)15 b(killed)j(text)c(is)i +(sa)o(v)o(ed)f(on)g(the)g(kill-ring.)75 1930 y Fn +(delete-horizontal-space)d(\(\))315 1985 y Fo(Delete)k(all)g(spaces)f +(and)h(tabs)e(around)i(p)q(oin)o(t.)k(By)15 b(default,)h(this)f(is)h +(un)o(b)q(ound.)75 2060 y Fn(kill-region)e(\(\))315 2115 +y Fo(Kill)j(the)f(text)e(in)i(the)g(curren)o(t)f(region.)20 +b(By)15 b(default,)h(this)f(command)g(is)h(un)o(b)q(ound.)75 +2190 y Fn(copy-region-as-kill)d(\(\))315 2245 y Fo(Cop)o(y)j(the)i +(text)e(in)i(the)f(region)g(to)g(the)g(kill)h(bu\013er,)f(so)g(it)g +(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o(a)o(y)l(.)315 +2300 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q(ound.)75 +2375 y Fn(copy-backward-word)d(\(\))315 2430 y Fo(Cop)o(y)19 +b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i(kill)h +(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315 +2485 y(same)c(as)g Fn(backward-word)p Fo(.)j(By)d(default,)g(this)h +(command)f(is)h(un)o(b)q(ound.)75 2560 y Fn(copy-forward-word)d(\(\)) +315 2615 y Fo(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f (to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e -(the)315 2536 y(same)g(as)g Fn(forward-word)p Fo(.)j(By)d(default,)h -(this)f(command)g(is)h(un)o(b)q(ound.)75 2615 y Fn(yank)f(\(C-y\))315 -2670 y Fo(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the) -h(bu\013er)f(at)f(p)q(oin)o(t.)p eop +(the)315 2670 y(same)g(as)g Fn(forward-word)p Fo(.)j(By)d(default,)h +(this)f(command)g(is)h(un)o(b)q(ound.)p eop %%Page: 17 21 17 20 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055 -b(17)75 149 y Fn(yank-pop)14 b(\(M-y\))315 204 y Fo(Rotate)i(the)h -(kill-ring,)j(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 -b(can)h(only)g(do)f(this)h(if)f(the)h(prior)315 259 y(command)d(is)h -Fn(yank)e Fo(or)h Fn(yank-pop)p Fo(.)75 382 y Fc(1.4.5)30 -b(Sp)r(ecifying)20 b(Numeric)h(Argumen)n(ts)75 507 y -Fn(digit-argument)13 b(\()p Fg(M-0)p Fn(,)i Fg(M-1)p -Fn(,)f(...)h Fg(M--)p Fn(\))315 562 y Fo(Add)f(this)g(digit)g(to)f(the) -h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)h -(argumen)o(t.)315 616 y Fg(M--)h Fo(starts)f(a)h(negativ)o(e)g(argumen) -o(t.)75 702 y Fn(universal-argument)e(\(\))315 756 y -Fo(This)g(is)h(another)e(w)o(a)o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o -(t.)18 b(If)13 b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315 -811 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o(us) -f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315 866 +b(17)75 149 y Fn(yank)15 b(\(C-y\))315 204 y Fo(Y)l(ank)g(the)h(top)f +(of)f(the)i(kill)h(ring)e(in)o(to)g(the)h(bu\013er)f(at)f(p)q(oin)o(t.) +75 276 y Fn(yank-pop)g(\(M-y\))315 331 y Fo(Rotate)i(the)h(kill-ring,)j +(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f +(this)h(if)f(the)h(prior)315 386 y(command)d(is)h Fn(yank)e +Fo(or)h Fn(yank-pop)p Fo(.)75 486 y Fc(1.4.5)30 b(Sp)r(ecifying)20 +b(Numeric)h(Argumen)n(ts)75 604 y Fn(digit-argument)13 +b(\()p Fg(M-0)p Fn(,)i Fg(M-1)p Fn(,)f(...)h Fg(M--)p +Fn(\))315 658 y Fo(Add)f(this)g(digit)g(to)f(the)h(argumen)o(t)e +(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)h(argumen)o(t.)315 +713 y Fg(M--)h Fo(starts)f(a)h(negativ)o(e)g(argumen)o(t.)75 +785 y Fn(universal-argument)e(\(\))315 840 y Fo(This)g(is)h(another)e +(w)o(a)o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o(t.)18 b(If)13 +b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315 +895 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o(us) +f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315 949 y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g -(digits,)g(executing)g Fn(universal-argument)315 921 +(digits,)g(executing)g Fn(universal-argument)315 1004 y Fo(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h (otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315 -976 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y)f -(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)315 -1030 y(or)d(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h +1059 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y) +f(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)315 +1114 y(or)d(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h (the)g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315 -1085 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f +1169 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f (executing)i(this)f(function)h(the)e(\014rst)h(time)315 -1140 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g +1223 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g (time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315 -1195 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f -(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 1318 y Fc(1.4.6)30 +1278 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f +(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 1378 y Fc(1.4.6)30 b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5 -b(ou)75 1443 y Fn(complete)14 b(\()305 1441 y Ff(h)p -317 1414 74 2 v 317 1443 a Fe(T)m(AB)p 317 1450 V 389 -1441 a Ff(i)404 1443 y Fn(\))315 1497 y Fo(A)o(ttempt)c(to)h(p)q +b(ou)75 1496 y Fn(complete)14 b(\()305 1494 y Ff(h)p +317 1468 74 2 v 317 1496 a Fe(T)m(AB)p 317 1504 V 389 +1494 a Ff(i)404 1496 y Fn(\))315 1551 y Fo(A)o(ttempt)c(to)h(p)q (erform)g(completion)i(on)e(the)g(text)g(b)q(efore)h(p)q(oin)o(t.)19 -b(The)11 b(actual)h(completion)315 1552 y(p)q(erformed)j(is)h +b(The)11 b(actual)h(completion)315 1606 y(p)q(erformed)j(is)h (application-sp)q(eci\014)q(c.)23 b(The)15 b(default)h(is)g(\014lename) -g(completion.)75 1637 y Fn(possible-completions)c(\(M-?\))315 -1692 y Fo(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b) -q(efore)h(p)q(oin)o(t.)75 1777 y Fn(insert-completions)d(\(M-*\))315 -1832 y Fo(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p) +g(completion.)75 1678 y Fn(possible-completions)c(\(M-?\))315 +1732 y Fo(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b) +q(efore)h(p)q(oin)o(t.)75 1804 y Fn(insert-completions)d(\(M-*\))315 +1859 y Fo(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p) q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315 -1887 y(b)o(y)f Fn(possible-completions)p Fo(.)75 1972 -y Fn(menu-complete)e(\(\))315 2027 y Fo(Similar)g(to)f +1914 y(b)o(y)f Fn(possible-completions)p Fo(.)75 1985 +y Fn(menu-complete)e(\(\))315 2040 y Fo(Similar)g(to)f Fn(complete)p Fo(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i -(completed)f(with)h(a)e(single)j(matc)o(h)315 2082 y(from)k(the)h(list) +(completed)f(with)h(a)e(single)j(matc)o(h)315 2095 y(from)k(the)h(list) h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)19 -b(execution)h(of)f Fn(menu-complete)315 2136 y Fo(steps)h(through)g +b(execution)h(of)f Fn(menu-complete)315 2150 y Fo(steps)h(through)g (the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f -(matc)o(h)f(in)i(turn.)315 2191 y(A)o(t)d(the)g(end)h(of)f(the)h(list)g +(matc)o(h)f(in)i(turn.)315 2205 y(A)o(t)d(the)g(end)h(of)f(the)h(list)g (of)f(completions,)i(the)e(b)q(ell)j(is)d(rung)h(\(sub)s(ject)f(to)f -(the)i(setting)315 2246 y(of)f Fn(bell-style)p Fo(\))e(and)i(the)g +(the)i(setting)315 2259 y(of)f Fn(bell-style)p Fo(\))e(and)i(the)g (original)h(text)f(is)g(restored.)28 b(An)19 b(argumen)o(t)e(of)g -Fd(n)i Fo(mo)o(v)o(es)e Fd(n)315 2301 y Fo(p)q(ositions)h(forw)o(ard)e +Fd(n)i Fo(mo)o(v)o(es)e Fd(n)315 2314 y Fo(p)q(ositions)h(forw)o(ard)e (in)j(the)e(list)h(of)f(matc)o(hes;)h(a)f(negativ)o(e)g(argumen)o(t)g -(ma)o(y)g(b)q(e)h(used)g(to)315 2356 y(mo)o(v)o(e)g(bac)o(kw)o(ard)h +(ma)o(y)g(b)q(e)h(used)g(to)315 2369 y(mo)o(v)o(e)g(bac)o(kw)o(ard)h (through)g(the)g(list.)32 b(This)20 b(command)f(is)h(in)o(tended)g(to)f -(b)q(e)h(b)q(ound)g(to)315 2408 y Ff(h)p 327 2382 V 327 -2410 a Fe(T)m(AB)p 327 2418 V 399 2408 a Ff(i)414 2410 +(b)q(e)h(b)q(ound)g(to)315 2422 y Ff(h)p 327 2396 V 327 +2424 a Fe(T)m(AB)p 327 2431 V 399 2422 a Ff(i)414 2424 y Fo(,)15 b(but)g(is)h(un)o(b)q(ound)g(b)o(y)f(default.)75 2496 y Fn(delete-char-or-list)e(\(\))315 2550 y Fo(Deletes)h(the)f(c)o (haracter)g(under)h(the)g(cursor)f(if)h(not)f(at)g(the)g(b)q(eginning)j diff --git a/lib/readline/posixdir.h b/lib/readline/posixdir.h deleted file mode 100644 index 91f6d961..00000000 --- a/lib/readline/posixdir.h +++ /dev/null @@ -1,61 +0,0 @@ -/* posixdir.h -- Posix directory reading includes and defines. */ - -/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* This file should be included instead of or . */ - -#if !defined (_POSIXDIR_H_) -#define _POSIXDIR_H_ - -#if defined (HAVE_DIRENT_H) -# include -# if defined (HAVE_STRUCT_DIRENT_D_NAMLEN) -# define D_NAMLEN(d) ((d)->d_namlen) -# else -# define D_NAMLEN(d) (strlen ((d)->d_name)) -# endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */ -#else -# if defined (HAVE_SYS_NDIR_H) -# include -# endif -# if defined (HAVE_SYS_DIR_H) -# include -# endif -# if defined (HAVE_NDIR_H) -# include -# endif -# if !defined (dirent) -# define dirent direct -# endif /* !dirent */ -# define D_NAMLEN(d) ((d)->d_namlen) -#endif /* !HAVE_DIRENT_H */ - -#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO) -# define d_fileno d_ino -#endif - -#if defined (_POSIX_SOURCE) && (!defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO)) -/* Posix does not require that the d_ino field be present, and some - systems do not provide it. */ -# define REAL_DIR_ENTRY(dp) 1 -#else -# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) -#endif /* _POSIX_SOURCE */ - -#endif /* !_POSIXDIR_H_ */ diff --git a/lib/readline/posixdir.h b/lib/readline/posixdir.h new file mode 120000 index 00000000..8b163845 --- /dev/null +++ b/lib/readline/posixdir.h @@ -0,0 +1 @@ +../../include/posixdir.h \ No newline at end of file diff --git a/lib/readline/posixjmp.h b/lib/readline/posixjmp.h deleted file mode 100644 index b52aa003..00000000 --- a/lib/readline/posixjmp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */ - -/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#ifndef _POSIXJMP_H_ -#define _POSIXJMP_H_ - -#include - -/* This *must* be included *after* config.h */ - -#if defined (HAVE_POSIX_SIGSETJMP) -# define procenv_t sigjmp_buf -# if !defined (__OPENNT) -# undef setjmp -# define setjmp(x) sigsetjmp((x), 1) -# undef longjmp -# define longjmp(x, n) siglongjmp((x), (n)) -# endif /* !__OPENNT */ -#else -# define procenv_t jmp_buf -#endif - -#endif /* _POSIXJMP_H_ */ diff --git a/lib/readline/posixjmp.h b/lib/readline/posixjmp.h new file mode 120000 index 00000000..b4d3ee74 --- /dev/null +++ b/lib/readline/posixjmp.h @@ -0,0 +1 @@ +../../include/posixjmp.h \ No newline at end of file diff --git a/lib/readline/posixstat.h b/lib/readline/posixstat.h deleted file mode 100644 index c93b5288..00000000 --- a/lib/readline/posixstat.h +++ /dev/null @@ -1,142 +0,0 @@ -/* posixstat.h -- Posix stat(2) definitions for systems that - don't have them. */ - -/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -/* This file should be included instead of . - It relies on the local sys/stat.h to work though. */ -#if !defined (_POSIXSTAT_H_) -#define _POSIXSTAT_H_ - -#include - -#if defined (STAT_MACROS_BROKEN) -# undef S_ISBLK -# undef S_ISCHR -# undef S_ISDIR -# undef S_ISFIFO -# undef S_ISREG -# undef S_ISLNK -#endif /* STAT_MACROS_BROKEN */ - -/* These are guaranteed to work only on isc386 */ -#if !defined (S_IFDIR) && !defined (S_ISDIR) -# define S_IFDIR 0040000 -#endif /* !S_IFDIR && !S_ISDIR */ -#if !defined (S_IFMT) -# define S_IFMT 0170000 -#endif /* !S_IFMT */ - -/* Posix 1003.1 5.6.1.1 file types */ - -/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but - do not provide the S_IS* macros that Posix requires. */ - -#if defined (_S_IFMT) && !defined (S_IFMT) -#define S_IFMT _S_IFMT -#endif -#if defined (_S_IFIFO) && !defined (S_IFIFO) -#define S_IFIFO _S_IFIFO -#endif -#if defined (_S_IFCHR) && !defined (S_IFCHR) -#define S_IFCHR _S_IFCHR -#endif -#if defined (_S_IFDIR) && !defined (S_IFDIR) -#define S_IFDIR _S_IFDIR -#endif -#if defined (_S_IFBLK) && !defined (S_IFBLK) -#define S_IFBLK _S_IFBLK -#endif -#if defined (_S_IFREG) && !defined (S_IFREG) -#define S_IFREG _S_IFREG -#endif -#if defined (_S_IFLNK) && !defined (S_IFLNK) -#define S_IFLNK _S_IFLNK -#endif -#if defined (_S_IFSOCK) && !defined (S_IFSOCK) -#define S_IFSOCK _S_IFSOCK -#endif - -/* Test for each symbol individually and define the ones necessary (some - systems claiming Posix compatibility define some but not all). */ - -#if defined (S_IFBLK) && !defined (S_ISBLK) -#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) /* block device */ -#endif - -#if defined (S_IFCHR) && !defined (S_ISCHR) -#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) /* character device */ -#endif - -#if defined (S_IFDIR) && !defined (S_ISDIR) -#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) /* directory */ -#endif - -#if defined (S_IFREG) && !defined (S_ISREG) -#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) /* file */ -#endif - -#if defined (S_IFIFO) && !defined (S_ISFIFO) -#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) /* fifo - named pipe */ -#endif - -#if defined (S_IFLNK) && !defined (S_ISLNK) -#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK) /* symbolic link */ -#endif - -#if defined (S_IFSOCK) && !defined (S_ISSOCK) -#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) /* socket */ -#endif - -/* - * POSIX 1003.1 5.6.1.2 File Modes - */ - -#if !defined (S_IRWXU) -# if !defined (S_IREAD) -# define S_IREAD 00400 -# define S_IWRITE 00200 -# define S_IEXEC 00100 -# endif /* S_IREAD */ - -# if !defined (S_IRUSR) -# define S_IRUSR S_IREAD /* read, owner */ -# define S_IWUSR S_IWRITE /* write, owner */ -# define S_IXUSR S_IEXEC /* execute, owner */ - -# define S_IRGRP (S_IREAD >> 3) /* read, group */ -# define S_IWGRP (S_IWRITE >> 3) /* write, group */ -# define S_IXGRP (S_IEXEC >> 3) /* execute, group */ - -# define S_IROTH (S_IREAD >> 6) /* read, other */ -# define S_IWOTH (S_IWRITE >> 6) /* write, other */ -# define S_IXOTH (S_IEXEC >> 6) /* execute, other */ -# endif /* !S_IRUSR */ - -# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) -# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) -# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) -#endif /* !S_IRWXU */ - -/* These are non-standard, but are used in builtins.c$symbolic_umask() */ -#define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) -#define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) -#define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) - -#endif /* _POSIXSTAT_H_ */ diff --git a/lib/readline/posixstat.h b/lib/readline/posixstat.h new file mode 120000 index 00000000..c6164b79 --- /dev/null +++ b/lib/readline/posixstat.h @@ -0,0 +1 @@ +../../include/posixstat.h \ No newline at end of file diff --git a/lib/readline/tilde.c b/lib/readline/tilde.c deleted file mode 100644 index 154f7f81..00000000 --- a/lib/readline/tilde.c +++ /dev/null @@ -1,458 +0,0 @@ -/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ - -/* Copyright (C) 1988,1989 Free Software Foundation, Inc. - - This file is part of GNU Readline, a library for reading lines - of text with interactive input and history editing. - - Readline 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. - - Readline 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 Readline; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if defined (HAVE_CONFIG_H) -# include -#endif - -#if defined (HAVE_UNISTD_H) -# ifdef _MINIX -# include -# endif -# include -#endif - -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ - -#if defined (HAVE_STDLIB_H) -# include -#else -# include "ansi_stdlib.h" -#endif /* HAVE_STDLIB_H */ - -#include -#include - -#include "tilde.h" - -#if defined (TEST) || defined (STATIC_MALLOC) -static void *xmalloc (), *xrealloc (); -#else -# include "xmalloc.h" -#endif /* TEST || STATIC_MALLOC */ - -#if !defined (HAVE_GETPW_DECLS) -extern struct passwd *getpwuid PARAMS((uid_t)); -extern struct passwd *getpwnam PARAMS((const char *)); -#endif /* !HAVE_GETPW_DECLS */ - -#if !defined (savestring) -#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) -#endif /* !savestring */ - -#if !defined (NULL) -# if defined (__STDC__) -# define NULL ((void *) 0) -# else -# define NULL 0x0 -# endif /* !__STDC__ */ -#endif /* !NULL */ - -/* If being compiled as part of bash, these will be satisfied from - variables.o. If being compiled as part of readline, they will - be satisfied from shell.o. */ -extern char *sh_get_home_dir PARAMS((void)); -extern char *sh_get_env_value PARAMS((const char *)); - -/* The default value of tilde_additional_prefixes. This is set to - whitespace preceding a tilde so that simple programs which do not - perform any word separation get desired behaviour. */ -static const char *default_prefixes[] = - { " ~", "\t~", (const char *)NULL }; - -/* The default value of tilde_additional_suffixes. This is set to - whitespace or newline so that simple programs which do not - perform any word separation get desired behaviour. */ -static const char *default_suffixes[] = - { " ", "\n", (const char *)NULL }; - -/* If non-null, this contains the address of a function that the application - wants called before trying the standard tilde expansions. The function - is called with the text sans tilde, and returns a malloc()'ed string - which is the expansion, or a NULL pointer if the expansion fails. */ -tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL; - -/* If non-null, this contains the address of a function to call if the - standard meaning for expanding a tilde fails. The function is called - with the text (sans tilde, as in "foo"), and returns a malloc()'ed string - which is the expansion, or a NULL pointer if there is no expansion. */ -tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL; - -/* When non-null, this is a NULL terminated array of strings which - are duplicates for a tilde prefix. Bash uses this to expand - `=~' and `:~'. */ -char **tilde_additional_prefixes = (char **)default_prefixes; - -/* When non-null, this is a NULL terminated array of strings which match - the end of a username, instead of just "/". Bash sets this to - `:' and `=~'. */ -char **tilde_additional_suffixes = (char **)default_suffixes; - -static int tilde_find_prefix PARAMS((const char *, int *)); -static int tilde_find_suffix PARAMS((const char *)); -static char *isolate_tilde_prefix PARAMS((const char *, int *)); -static char *glue_prefix_and_suffix PARAMS((char *, const char *, int)); - -/* Find the start of a tilde expansion in STRING, and return the index of - the tilde which starts the expansion. Place the length of the text - which identified this tilde starter in LEN, excluding the tilde itself. */ -static int -tilde_find_prefix (string, len) - const char *string; - int *len; -{ - register int i, j, string_len; - register char **prefixes; - - prefixes = tilde_additional_prefixes; - - string_len = strlen (string); - *len = 0; - - if (*string == '\0' || *string == '~') - return (0); - - if (prefixes) - { - for (i = 0; i < string_len; i++) - { - for (j = 0; prefixes[j]; j++) - { - if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0) - { - *len = strlen (prefixes[j]) - 1; - return (i + *len); - } - } - } - } - return (string_len); -} - -/* Find the end of a tilde expansion in STRING, and return the index of - the character which ends the tilde definition. */ -static int -tilde_find_suffix (string) - const char *string; -{ - register int i, j, string_len; - register char **suffixes; - - suffixes = tilde_additional_suffixes; - string_len = strlen (string); - - for (i = 0; i < string_len; i++) - { -#if defined (__MSDOS__) - if (string[i] == '/' || string[i] == '\\' /* || !string[i] */) -#else - if (string[i] == '/' /* || !string[i] */) -#endif - break; - - for (j = 0; suffixes && suffixes[j]; j++) - { - if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0) - return (i); - } - } - return (i); -} - -/* Return a new string which is the result of tilde expanding STRING. */ -char * -tilde_expand (string) - const char *string; -{ - char *result; - int result_size, result_index; - - result_index = result_size = 0; - if (result = strchr (string, '~')) - result = (char *)xmalloc (result_size = (strlen (string) + 16)); - else - result = (char *)xmalloc (result_size = (strlen (string) + 1)); - - /* Scan through STRING expanding tildes as we come to them. */ - while (1) - { - register int start, end; - char *tilde_word, *expansion; - int len; - - /* Make START point to the tilde which starts the expansion. */ - start = tilde_find_prefix (string, &len); - - /* Copy the skipped text into the result. */ - if ((result_index + start + 1) > result_size) - result = (char *)xrealloc (result, 1 + (result_size += (start + 20))); - - strncpy (result + result_index, string, start); - result_index += start; - - /* Advance STRING to the starting tilde. */ - string += start; - - /* Make END be the index of one after the last character of the - username. */ - end = tilde_find_suffix (string); - - /* If both START and END are zero, we are all done. */ - if (!start && !end) - break; - - /* Expand the entire tilde word, and copy it into RESULT. */ - tilde_word = (char *)xmalloc (1 + end); - strncpy (tilde_word, string, end); - tilde_word[end] = '\0'; - string += end; - - expansion = tilde_expand_word (tilde_word); - free (tilde_word); - - len = strlen (expansion); -#ifdef __CYGWIN__ - /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when - $HOME for `user' is /. On cygwin, // denotes a network drive. */ - if (len > 1 || *expansion != '/' || *string != '/') -#endif - { - if ((result_index + len + 1) > result_size) - result = (char *)xrealloc (result, 1 + (result_size += (len + 20))); - - strcpy (result + result_index, expansion); - result_index += len; - } - free (expansion); - } - - result[result_index] = '\0'; - - return (result); -} - -/* Take FNAME and return the tilde prefix we want expanded. If LENP is - non-null, the index of the end of the prefix into FNAME is returned in - the location it points to. */ -static char * -isolate_tilde_prefix (fname, lenp) - const char *fname; - int *lenp; -{ - char *ret; - int i; - - ret = (char *)xmalloc (strlen (fname)); -#if defined (__MSDOS__) - for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++) -#else - for (i = 1; fname[i] && fname[i] != '/'; i++) -#endif - ret[i - 1] = fname[i]; - ret[i - 1] = '\0'; - if (lenp) - *lenp = i; - return ret; -} - -/* Return a string that is PREFIX concatenated with SUFFIX starting at - SUFFIND. */ -static char * -glue_prefix_and_suffix (prefix, suffix, suffind) - char *prefix; - const char *suffix; - int suffind; -{ - char *ret; - int plen, slen; - - plen = (prefix && *prefix) ? strlen (prefix) : 0; - slen = strlen (suffix + suffind); - ret = (char *)xmalloc (plen + slen + 1); - if (plen) - strcpy (ret, prefix); - strcpy (ret + plen, suffix + suffind); - return ret; -} - -/* Do the work of tilde expansion on FILENAME. FILENAME starts with a - tilde. If there is no expansion, call tilde_expansion_failure_hook. - This always returns a newly-allocated string, never static storage. */ -char * -tilde_expand_word (filename) - const char *filename; -{ - char *dirname, *expansion, *username; - int user_len; - struct passwd *user_entry; - - if (filename == 0) - return ((char *)NULL); - - if (*filename != '~') - return (savestring (filename)); - - /* A leading `~/' or a bare `~' is *always* translated to the value of - $HOME or the home directory of the current user, regardless of any - preexpansion hook. */ - if (filename[1] == '\0' || filename[1] == '/') - { - /* Prefix $HOME to the rest of the string. */ - expansion = sh_get_env_value ("HOME"); - - /* If there is no HOME variable, look up the directory in - the password database. */ - if (expansion == 0) - expansion = sh_get_home_dir (); - - return (glue_prefix_and_suffix (expansion, filename, 1)); - } - - username = isolate_tilde_prefix (filename, &user_len); - - if (tilde_expansion_preexpansion_hook) - { - expansion = (*tilde_expansion_preexpansion_hook) (username); - if (expansion) - { - dirname = glue_prefix_and_suffix (expansion, filename, user_len); - free (username); - free (expansion); - return (dirname); - } - } - - /* No preexpansion hook, or the preexpansion hook failed. Look in the - password database. */ - dirname = (char *)NULL; - user_entry = getpwnam (username); - if (user_entry == 0) - { - /* If the calling program has a special syntax for expanding tildes, - and we couldn't find a standard expansion, then let them try. */ - if (tilde_expansion_failure_hook) - { - expansion = (*tilde_expansion_failure_hook) (username); - if (expansion) - { - dirname = glue_prefix_and_suffix (expansion, filename, user_len); - free (expansion); - } - } - free (username); - /* If we don't have a failure hook, or if the failure hook did not - expand the tilde, return a copy of what we were passed. */ - if (dirname == 0) - dirname = savestring (filename); - } - else - { - free (username); - dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); - } - - endpwent (); - return (dirname); -} - - -#if defined (TEST) -#undef NULL -#include - -main (argc, argv) - int argc; - char **argv; -{ - char *result, line[512]; - int done = 0; - - while (!done) - { - printf ("~expand: "); - fflush (stdout); - - if (!gets (line)) - strcpy (line, "done"); - - if ((strcmp (line, "done") == 0) || - (strcmp (line, "quit") == 0) || - (strcmp (line, "exit") == 0)) - { - done = 1; - break; - } - - result = tilde_expand (line); - printf (" --> %s\n", result); - free (result); - } - exit (0); -} - -static void memory_error_and_abort (); - -static void * -xmalloc (bytes) - size_t bytes; -{ - void *temp = (char *)malloc (bytes); - - if (!temp) - memory_error_and_abort (); - return (temp); -} - -static void * -xrealloc (pointer, bytes) - void *pointer; - int bytes; -{ - void *temp; - - if (!pointer) - temp = malloc (bytes); - else - temp = realloc (pointer, bytes); - - if (!temp) - memory_error_and_abort (); - - return (temp); -} - -static void -memory_error_and_abort () -{ - fprintf (stderr, "readline: out of virtual memory\n"); - abort (); -} - -/* - * Local variables: - * compile-command: "gcc -g -DTEST -o tilde tilde.c" - * end: - */ -#endif /* TEST */ diff --git a/lib/readline/tilde.c b/lib/readline/tilde.c new file mode 120000 index 00000000..439ceede --- /dev/null +++ b/lib/readline/tilde.c @@ -0,0 +1 @@ +../tilde/tilde.c \ No newline at end of file diff --git a/lib/readline/tilde.h b/lib/readline/tilde.h deleted file mode 100644 index f8182c99..00000000 --- a/lib/readline/tilde.h +++ /dev/null @@ -1,78 +0,0 @@ -/* tilde.h: Externally available variables and function in libtilde.a. */ - -/* Copyright (C) 1992 Free Software Foundation, Inc. - - This file contains the Readline Library (the Library), a set of - routines for providing Emacs style line input to programs that ask - for it. - - The Library 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. - - The Library 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. - - The GNU General Public License is often shipped with GNU software, and - is generally kept in a file called COPYING or LICENSE. If you do not - have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_TILDE_H_) -# define _TILDE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* A function can be defined using prototypes and compile on both ANSI C - and traditional C compilers with something like this: - extern char *func PARAMS((char *, char *, int)); */ - -#if !defined (PARAMS) -# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) -# define PARAMS(protos) protos -# else -# define PARAMS(protos) () -# endif -#endif - -typedef char *tilde_hook_func_t PARAMS((char *)); - -/* If non-null, this contains the address of a function that the application - wants called before trying the standard tilde expansions. The function - is called with the text sans tilde, and returns a malloc()'ed string - which is the expansion, or a NULL pointer if the expansion fails. */ -extern tilde_hook_func_t *tilde_expansion_preexpansion_hook; - -/* If non-null, this contains the address of a function to call if the - standard meaning for expanding a tilde fails. The function is called - with the text (sans tilde, as in "foo"), and returns a malloc()'ed string - which is the expansion, or a NULL pointer if there is no expansion. */ -extern tilde_hook_func_t *tilde_expansion_failure_hook; - -/* When non-null, this is a NULL terminated array of strings which - are duplicates for a tilde prefix. Bash uses this to expand - `=~' and `:~'. */ -extern char **tilde_additional_prefixes; - -/* When non-null, this is a NULL terminated array of strings which match - the end of a username, instead of just "/". Bash sets this to - `:' and `=~'. */ -extern char **tilde_additional_suffixes; - -/* Return a new string which is the result of tilde expanding STRING. */ -extern char *tilde_expand PARAMS((const char *)); - -/* Do the work of tilde expansion on FILENAME. FILENAME starts with a - tilde. If there is no expansion, call tilde_expansion_failure_hook. */ -extern char *tilde_expand_word PARAMS((const char *)); - -#ifdef __cplusplus -} -#endif - -#endif /* _TILDE_H_ */ diff --git a/lib/readline/tilde.h b/lib/readline/tilde.h new file mode 120000 index 00000000..6fea2aea --- /dev/null +++ b/lib/readline/tilde.h @@ -0,0 +1 @@ +../tilde/tilde.h \ No newline at end of file diff --git a/make_cmd.c b/make_cmd.c index 479d9c3e..4ccbf669 100644 --- a/make_cmd.c +++ b/make_cmd.c @@ -355,6 +355,7 @@ COMMAND * make_case_command (word, clauses, lineno) WORD_DESC *word; PATTERN_LIST *clauses; + int lineno; { CASE_COM *temp; diff --git a/pathnames.h b/pathnames.h deleted file mode 100644 index 27817afa..00000000 --- a/pathnames.h +++ /dev/null @@ -1,30 +0,0 @@ -/* pathnames.h -- absolute filenames that bash wants for various defaults. */ - -/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ - -#if !defined (_PATHNAMES_H_) -#define _PATHNAMES_H_ - -/* The default file for hostname completion. */ -#define DEFAULT_HOSTS_FILE "/etc/hosts" - -/* The default login shell startup file. */ -#define SYS_PROFILE "/etc/profile" - -#endif /* _PATHNAMES_H */ diff --git a/po/bash.po.orig b/po/bash.po.orig new file mode 100644 index 00000000..023388d9 --- /dev/null +++ b/po/bash.po.orig @@ -0,0 +1,5623 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#: array.c:695 array.c:755 array.c:879 bashhist.c:661 bashline.c:801 +#: bashline.c:1416 error.c:88 error.c:318 error.c:320 error.c:322 +#: execute_cmd.c:2005 execute_cmd.c:2007 execute_cmd.c:2195 execute_cmd.c:2441 +#: execute_cmd.c:2580 execute_cmd.c:3186 execute_cmd.c:3838 expr.c:1092 +#: expr.c:1093 general.c:132 jobs.c:1128 jobs.c:1143 jobs.c:2318 jobs.c:2319 +#: locale.c:64 locale.c:422 parse.y:1209 pcomplete.c:937 pcomplete.c:947 +#: pcomplete.c:1076 print_cmd.c:142 print_cmd.c:305 print_cmd.c:364 +#: print_cmd.c:368 print_cmd.c:374 print_cmd.c:378 print_cmd.c:548 +#: print_cmd.c:733 print_cmd.c:847 print_cmd.c:851 subst.c:1483 subst.c:1510 +#: subst.c:1734 subst.c:1754 subst.c:4238 subst.c:4274 subst.c:6391 +#: syntax.h:43 unwind_prot.c:173 variables.c:1631 variables.c:2381 +#: /usr/homes/chet/src/bash/src/parse.y:1209 builtins/common.c:144 +#: builtins/common.c:640 builtins/getopt.c:204 builtins/mkbuiltins.c:1067 +#: builtins/mkbuiltins.c:1070 builtins/mkbuiltins.c:1072 +#: builtins/mkbuiltins.c:1074 builtins/mkbuiltins.c:1079 +#: builtins/mkbuiltins.c:1084 builtins/mkbuiltins.c:1088 +#: builtins/mkbuiltins.c:1094 builtins/mkbuiltins.c:1100 +#: builtins/mkbuiltins.c:1108 builtins/mkbuiltins.c:1111 +#: builtins/mkbuiltins.c:1207 builtins/mkbuiltins.c:1208 +#: builtins/caller.def:127 builtins/caller.def:131 builtins/command.def:134 +#: builtins/complete.def:567 builtins/declare.def:238 builtins/declare.def:355 +#: builtins/declare.def:438 builtins/fc.def:338 builtins/getopts.def:310 +#: builtins/help.def:105 builtins/help.def:110 builtins/history.def:291 +#: builtins/printf.def:123 builtins/printf.def:726 builtins/pushd.def:330 +#: builtins/pushd.def:371 builtins/pushd.def:654 builtins/pushd.def:662 +#: builtins/pushd.def:665 builtins/pushd.def:675 builtins/pushd.def:679 +#: builtins/pushd.def:683 builtins/pushd.def:686 builtins/pushd.def:689 +#: builtins/pushd.def:698 builtins/pushd.def:702 builtins/pushd.def:706 +#: builtins/pushd.def:709 builtins/read.def:258 builtins/read.def:386 +#: builtins/read.def:595 builtins/setattr.def:353 builtins/setattr.def:396 +#: builtins/ulimit.def:111 builtins/umask.def:131 lib/sh/snprintf.c:394 +#: lib/sh/snprintf.c:1691 lib/sh/stringlist.c:235 lib/sh/stringvec.c:223 +#: lib/malloc/stats.c:99 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2003-12-04 16:07-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: arrayfunc.c:43 +msgid "bad array subscript" +msgstr "" + +#: arrayfunc.c:304 +#, c-format +msgid "%s: cannot assign to non-numeric index" +msgstr "" + +#: bashhist.c:319 +#, c-format +msgid "%s: cannot create: %s" +msgstr "" + +#: bashline.c:2789 +msgid "bash_execute_unix_command: cannot find keymap for command" +msgstr "" + +#: bashline.c:2838 +#, c-format +msgid "%s: first non-whitespace character is not `\"'" +msgstr "" + +#: bashline.c:2867 braces.c:129 +#, c-format +msgid "no closing `%c' in %s" +msgstr "" + +#: bashline.c:2901 +#, c-format +msgid "%s: missing colon separator" +msgstr "" + +#: error.c:163 +#, c-format +msgid "last command: %s\n" +msgstr "" + +#: error.c:168 +#, c-format +msgid "Report this to %s\n" +msgstr "" + +#: error.c:171 +msgid "Stopping myself..." +msgstr "" + +#: error.c:258 +#, c-format +msgid "%s: warning: " +msgstr "" + +#: error.c:403 +msgid "unknown command error" +msgstr "" + +#: error.c:404 +msgid "bad command type" +msgstr "" + +#: error.c:405 +msgid "bad connector" +msgstr "" + +#: error.c:406 +msgid "bad jump" +msgstr "" + +#: error.c:444 +#, c-format +msgid "%s: unbound variable" +msgstr "" + +#: error.c:451 builtins/common.c:221 +#, c-format +msgid "%s: readonly variable" +msgstr "" + +#: eval.c:173 +msgid "timed out waiting for input: auto-logout\n" +msgstr "" + +#: execute_cmd.c:447 +msgid "close" +msgstr "" + +#: execute_cmd.c:447 +msgid "open" +msgstr "" + +#: execute_cmd.c:465 +#, c-format +msgid "cannot redirect standard input from /dev/null: %s" +msgstr "" + +#: execute_cmd.c:1035 +#, c-format +msgid "TIMEFORMAT: `%c': invalid format character" +msgstr "" + +#: execute_cmd.c:3520 +#, c-format +msgid "%s: restricted: cannot specify `/' in command names" +msgstr "" + +#: execute_cmd.c:3608 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: execute_cmd.c:3820 shell.c:1393 builtins/evalfile.c:127 +#: builtins/hash.def:158 +#, c-format +msgid "%s: is a directory" +msgstr "" + +#: execute_cmd.c:3838 +#, c-format +msgid "%s: %s: bad interpreter" +msgstr "" + +#: execute_cmd.c:3875 shell.c:1403 builtins/evalfile.c:172 +#, c-format +msgid "%s: cannot execute binary file" +msgstr "" + +#: execute_cmd.c:3948 builtins/declare.def:306 +#, c-format +msgid "%s: readonly function" +msgstr "" + +#: execute_cmd.c:3987 +#, c-format +msgid "cannot duplicate fd %d to fd %d" +msgstr "" + +#: expr.c:238 +msgid "expression recursion level exceeded" +msgstr "" + +#: expr.c:262 +msgid "recursion stack underflow" +msgstr "" + +#: expr.c:373 +msgid "syntax error in expression" +msgstr "" + +#: expr.c:413 +msgid "attempted assignment to non-variable" +msgstr "" + +#: expr.c:434 expr.c:439 expr.c:749 +msgid "division by 0" +msgstr "" + +#: expr.c:465 +msgid "bug: bad expassign token" +msgstr "" + +#: expr.c:495 expr.c:510 builtins/let.def:92 builtins/let.def:117 +msgid "expression expected" +msgstr "" + +#: expr.c:507 +msgid "`:' expected for conditional expression" +msgstr "" + +#: expr.c:774 +msgid "exponent less than 0" +msgstr "" + +#: expr.c:818 +msgid "identifier expected after pre-increment or pre-decrement" +msgstr "" + +#: expr.c:846 +msgid "missing `)'" +msgstr "" + +#: expr.c:870 +msgid "syntax error: operand expected" +msgstr "" + +#: expr.c:1091 +#, c-format +msgid "%s%s%s: %s (error token is \"%s\")" +msgstr "" + +#: expr.c:1145 +msgid "bad number" +msgstr "" + +#: expr.c:1149 +msgid "invalid arithmetic base" +msgstr "" + +#: expr.c:1169 +msgid "value too great for base" +msgstr "" + +#: expr.c:1217 +#, c-format +msgid "%s: expression error\n" +msgstr "" + +#: general.c:58 +msgid "getcwd: cannot access parent directories" +msgstr "" + +#: general.c:227 general.c:232 builtins/common.c:193 +#, c-format +msgid "`%s': not a valid identifier" +msgstr "" + +#: input.c:229 +#, c-format +msgid "cannot allocate new file descriptor for bash input from fd %d" +msgstr "" + +#: input.c:237 +#, c-format +msgid "save_bash_input: buffer already exists for new fd %d" +msgstr "" + +#: jobs.c:692 +#, c-format +msgid "deleting stopped job %d with process group %ld" +msgstr "" + +#: jobs.c:1631 nojobs.c:646 +#, c-format +msgid "wait: pid %ld is not a child of this shell" +msgstr "" + +#: jobs.c:1814 +#, c-format +msgid "wait_for: No record of process %ld" +msgstr "" + +#: jobs.c:1957 +#, c-format +msgid "wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)" +msgstr "" + +#: jobs.c:2061 +#, c-format +msgid "wait_for_job: job %d is stopped" +msgstr "" + +#: jobs.c:2283 +#, c-format +msgid "%s: job has terminated" +msgstr "" + +#: jobs.c:2292 +#, c-format +msgid "%s: job %d already in background" +msgstr "" + +#: jobs.c:3036 +msgid "no job control in this shell" +msgstr "" + +#: jobs.c:3250 +#, c-format +msgid "tcsetpgrp(%d) failed: pid %ld to pgrp %ld" +msgstr "" + +#: mailcheck.c:381 +msgid "You have mail in $_" +msgstr "" + +#: mailcheck.c:406 +msgid "You have new mail in $_" +msgstr "" + +#: mailcheck.c:422 +#, c-format +msgid "The mail in %s has been read\n" +msgstr "" + +#: make_cmd.c:316 +msgid "syntax error: arithmetic expression required" +msgstr "" + +#: make_cmd.c:318 +msgid "syntax error: `;' unexpected" +msgstr "" + +#: make_cmd.c:558 +#, c-format +msgid "make_here_document: bad instruction type %d" +msgstr "" + +#: make_cmd.c:728 +#, c-format +msgid "make_redirection: redirection instruction `%d' out of range" +msgstr "" + +#: mksyntax.c:334 +#, c-format +msgid "%s: %s: cannot open: %s\n" +msgstr "" + +#: parse.y:1663 /usr/homes/chet/src/bash/src/parse.y:1663 +msgid "read_a_line: ignored null byte in input" +msgstr "" + +#: parse.y:1928 /usr/homes/chet/src/bash/src/parse.y:1928 +msgid "shell_getc: ignored null byte in input" +msgstr "" + +#: parse.y:2724 /usr/homes/chet/src/bash/src/parse.y:2724 +#, c-format +msgid "unexpected EOF while looking for matching `%c'" +msgstr "" + +#: parse.y:3009 /usr/homes/chet/src/bash/src/parse.y:3009 +msgid "unexpected EOF while looking for `]]'" +msgstr "" + +#: parse.y:3014 /usr/homes/chet/src/bash/src/parse.y:3014 +#, c-format +msgid "syntax error in conditional expression: unexpected token `%s'" +msgstr "" + +#: parse.y:3018 /usr/homes/chet/src/bash/src/parse.y:3018 +msgid "syntax error in conditional expression" +msgstr "" + +#: parse.y:3096 /usr/homes/chet/src/bash/src/parse.y:3096 +#, c-format +msgid "unexpected token `%s', expected `)'" +msgstr "" + +#: parse.y:3100 /usr/homes/chet/src/bash/src/parse.y:3100 +msgid "expected `)'" +msgstr "" + +#: parse.y:3128 /usr/homes/chet/src/bash/src/parse.y:3128 +#, c-format +msgid "unexpected argument `%s' to conditional unary operator" +msgstr "" + +#: parse.y:3132 /usr/homes/chet/src/bash/src/parse.y:3132 +msgid "unexpected argument to conditional unary operator" +msgstr "" + +#: parse.y:3160 /usr/homes/chet/src/bash/src/parse.y:3160 +msgid "-n" +msgstr "" + +#: parse.y:3169 /usr/homes/chet/src/bash/src/parse.y:3169 +#, c-format +msgid "unexpected token `%s', conditional binary operator expected" +msgstr "" + +#: parse.y:3173 /usr/homes/chet/src/bash/src/parse.y:3173 +msgid "conditional binary operator expected" +msgstr "" + +#: parse.y:3189 /usr/homes/chet/src/bash/src/parse.y:3189 +#, c-format +msgid "unexpected argument `%s' to conditional binary operator" +msgstr "" + +#: parse.y:3193 /usr/homes/chet/src/bash/src/parse.y:3193 +msgid "unexpected argument to conditional binary operator" +msgstr "" + +#: parse.y:3204 /usr/homes/chet/src/bash/src/parse.y:3204 +#, c-format +msgid "unexpected token `%c' in conditional command" +msgstr "" + +#: parse.y:3207 /usr/homes/chet/src/bash/src/parse.y:3207 +#, c-format +msgid "unexpected token `%s' in conditional command" +msgstr "" + +#: parse.y:3211 /usr/homes/chet/src/bash/src/parse.y:3211 +#, c-format +msgid "unexpected token %d in conditional command" +msgstr "" + +#: parse.y:4398 /usr/homes/chet/src/bash/src/parse.y:4398 +#, c-format +msgid "syntax error near unexpected token `%s'" +msgstr "" + +#: parse.y:4416 /usr/homes/chet/src/bash/src/parse.y:4416 +#, c-format +msgid "syntax error near `%s'" +msgstr "" + +#: parse.y:4426 /usr/homes/chet/src/bash/src/parse.y:4426 +msgid "syntax error: unexpected end of file" +msgstr "" + +#: parse.y:4426 /usr/homes/chet/src/bash/src/parse.y:4426 +msgid "syntax error" +msgstr "" + +#: parse.y:4488 /usr/homes/chet/src/bash/src/parse.y:4488 +#, c-format +msgid "Use \"%s\" to leave the shell.\n" +msgstr "" + +#: parse.y:4647 /usr/homes/chet/src/bash/src/parse.y:4647 +msgid "unexpected EOF while looking for matching `)'" +msgstr "" + +#: pcomplete.c:987 +#, c-format +msgid "completion: function `%s' not found" +msgstr "" + +#: pcomplete.c:1222 +msgid "ERROR: command_line_to_word_list returns NULL" +msgstr "" + +#: pcomplib.c:177 +#, c-format +msgid "progcomp_insert: %s: NULL COMPSPEC" +msgstr "" + +#: print_cmd.c:259 +#, c-format +msgid "print_command: bad connector `%d'" +msgstr "" + +#: print_cmd.c:1171 +#, c-format +msgid "cprintf: `%c': invalid format character" +msgstr "" + +#: redir.c:98 redir.c:133 +msgid "file descriptor out of range" +msgstr "" + +#: redir.c:140 +#, c-format +msgid "%s: ambiguous redirect" +msgstr "" + +#: redir.c:144 +#, c-format +msgid "%s: cannot overwrite existing file" +msgstr "" + +#: redir.c:149 +#, c-format +msgid "%s: restricted: cannot redirect output" +msgstr "" + +#: redir.c:154 +#, c-format +msgid "cannot create temp file for here document: %s" +msgstr "" + +#: redir.c:508 +msgid "/dev/(tcp|udp)/host/port not supported without networking" +msgstr "" + +#: redir.c:948 +msgid "redirection error: cannot duplicate fd" +msgstr "" + +#: shell.c:300 +msgid "could not find /tmp, please create!" +msgstr "" + +#: shell.c:304 +msgid "/tmp must be a valid directory name" +msgstr "" + +#: shell.c:463 shell.c:735 builtins/common.c:156 +#, c-format +msgid "%s: option requires an argument" +msgstr "" + +#: shell.c:748 builtins/common.c:179 +#, c-format +msgid "%s: invalid option" +msgstr "" + +#: shell.c:837 +#, c-format +msgid "%c%c: invalid option" +msgstr "" + +#: shell.c:1588 +msgid "I have no name!" +msgstr "" + +#: shell.c:1721 +#, c-format +msgid "GNU bash, version %s-(%s)\n" +msgstr "" + +#: shell.c:1722 +#, c-format +msgid "" +"Usage:\t%s [GNU long option] [option] ...\n" +"\t%s [GNU long option] [option] script-file ...\n" +msgstr "" + +#: shell.c:1724 +msgid "GNU long options:\n" +msgstr "" + +#: shell.c:1726 +#, c-format +msgid "\t--%s\n" +msgstr "" + +#: shell.c:1728 +msgid "Shell options:\n" +msgstr "" + +#: shell.c:1729 +msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n" +msgstr "" + +#: shell.c:1732 builtins/mkbuiltins.c:131 builtins/set.def:2 +msgid "set" +msgstr "" + +#: shell.c:1744 +#, c-format +msgid "\t-%s or -o option\n" +msgstr "" + +#: shell.c:1750 +#, c-format +msgid "Type `%s -c \"help set\"' for more information about shell options.\n" +msgstr "" + +#: shell.c:1751 +#, c-format +msgid "Type `%s -c help' for more information about shell builtin commands.\n" +msgstr "" + +#: shell.c:1752 +msgid "Use the `bashbug' command to report bugs.\n" +msgstr "" + +#: sig.c:483 +msgid "Bad code in sig.c: sigprocmask" +msgstr "" + +#: siglist.c:47 +msgid "Bogus signal" +msgstr "" + +#: siglist.c:50 +msgid "Hangup" +msgstr "" + +#: siglist.c:54 +msgid "Interrupt" +msgstr "" + +#: siglist.c:58 +msgid "Quit" +msgstr "" + +#: siglist.c:62 +msgid "Illegal instruction" +msgstr "" + +#: siglist.c:66 +msgid "BPT trace/trap" +msgstr "" + +#: siglist.c:74 +msgid "ABORT instruction" +msgstr "" + +#: siglist.c:78 +msgid "EMT instruction" +msgstr "" + +#: siglist.c:82 +msgid "Floating point exception" +msgstr "" + +#: siglist.c:86 +msgid "Killed" +msgstr "" + +#: siglist.c:90 +msgid "Bus error" +msgstr "" + +#: siglist.c:94 +msgid "Segmentation fault" +msgstr "" + +#: siglist.c:98 +msgid "Bad system call" +msgstr "" + +#: siglist.c:102 +msgid "Broken pipe" +msgstr "" + +#: siglist.c:106 +msgid "Alarm clock" +msgstr "" + +#: siglist.c:110 +msgid "Terminated" +msgstr "" + +#: siglist.c:114 +msgid "Urgent IO condition" +msgstr "" + +#: siglist.c:118 +msgid "Stopped (signal)" +msgstr "" + +#: siglist.c:126 +msgid "Continue" +msgstr "" + +#: siglist.c:134 +msgid "Child death or stop" +msgstr "" + +#: siglist.c:138 +msgid "Stopped (tty input)" +msgstr "" + +#: siglist.c:142 +msgid "Stopped (tty output)" +msgstr "" + +#: siglist.c:146 +msgid "I/O ready" +msgstr "" + +#: siglist.c:150 +msgid "CPU limit" +msgstr "" + +#: siglist.c:154 +msgid "File limit" +msgstr "" + +#: siglist.c:158 +msgid "Alarm (virtual)" +msgstr "" + +#: siglist.c:162 +msgid "Alarm (profile)" +msgstr "" + +#: siglist.c:166 +msgid "Window changed" +msgstr "" + +#: siglist.c:170 +msgid "Record lock" +msgstr "" + +#: siglist.c:174 +msgid "User signal 1" +msgstr "" + +#: siglist.c:178 +msgid "User signal 2" +msgstr "" + +#: siglist.c:182 +msgid "HFT input data pending" +msgstr "" + +#: siglist.c:186 +msgid "power failure imminent" +msgstr "" + +#: siglist.c:190 +msgid "system crash imminent" +msgstr "" + +#: siglist.c:194 +msgid "migrate process to another CPU" +msgstr "" + +#: siglist.c:198 +msgid "programming error" +msgstr "" + +#: siglist.c:202 +msgid "HFT monitor mode granted" +msgstr "" + +#: siglist.c:206 +msgid "HFT monitor mode retracted" +msgstr "" + +#: siglist.c:210 +msgid "HFT sound sequence has completed" +msgstr "" + +#: siglist.c:214 +msgid "Information request" +msgstr "" + +#: siglist.c:222 +msgid "Unknown Signal #" +msgstr "" + +#: siglist.c:224 +#, c-format +msgid "Unknown Signal #%d" +msgstr "" + +#: subst.c:666 subst.c:752 subst.c:865 subst.c:1107 subst.c:1370 +msgid "$(" +msgstr "" + +#: subst.c:876 +msgid "$[" +msgstr "" + +#: subst.c:876 +msgid "[" +msgstr "" + +#: subst.c:876 +msgid "]" +msgstr "" + +#: subst.c:1010 subst.c:1131 +#, c-format +msgid "bad substitution: no closing `%s' in %s" +msgstr "" + +#: subst.c:2006 +#, c-format +msgid "%s%s=(%s)\n" +msgstr "" + +#: subst.c:2009 variables.c:2123 +#, c-format +msgid "%s%s=%s\n" +msgstr "" + +#: subst.c:2019 +#, c-format +msgid "%s: cannot assign list to array member" +msgstr "" + +#: subst.c:3381 +msgid "sh-np" +msgstr "" + +#: subst.c:3449 +#, c-format +msgid "pid %ld: dev_fd_list:" +msgstr "" + +#: subst.c:3455 /usr/local/share/bison/bison.simple:719 +#: /usr/local/share/bison/bison.simple:864 +#, c-format +msgid " %d" +msgstr "" + +#: subst.c:3515 subst.c:3531 +msgid "cannot make pipe for process substitution" +msgstr "" + +#: subst.c:3562 +msgid "cannot make child for process substitution" +msgstr "" + +#: subst.c:3605 +#, c-format +msgid "cannot open named pipe %s for %s" +msgstr "" + +#: subst.c:3606 +msgid "reading" +msgstr "" + +#: subst.c:3606 +msgid "writing" +msgstr "" + +#: subst.c:3613 +#, c-format +msgid "cannout reset nodelay mode for fd %d" +msgstr "" + +#: subst.c:3623 +#, c-format +msgid "cannot duplicate named pipe %s as fd %d" +msgstr "" + +#: subst.c:3647 +msgid "process substitution" +msgstr "" + +#: subst.c:3697 +msgid "read_comsub: ignored null byte in input" +msgstr "" + +#: subst.c:3798 +msgid "cannot make pipe for command substitution" +msgstr "" + +#: subst.c:3827 +msgid "cannot make child for command substitution" +msgstr "" + +#: subst.c:3844 +msgid "command_substitute: cannot duplicate pipe as fd 1" +msgstr "" + +#: subst.c:3901 +msgid "command substitution" +msgstr "" + +#: subst.c:4279 +#, c-format +msgid "%s: parameter null or not set" +msgstr "" + +#: subst.c:4524 +#, c-format +msgid "%s: substring expression < 0" +msgstr "" + +#: subst.c:4966 subst.c:4983 +msgid "#%:-=?+/}" +msgstr "" + +#: subst.c:5033 +msgid "%:=+/" +msgstr "" + +#: subst.c:5204 +#, c-format +msgid "%s: bad substitution" +msgstr "" + +#: subst.c:5204 builtins/history.def:247 +msgid "??" +msgstr "" + +#: subst.c:5278 +#, c-format +msgid "$%s: cannot assign in this way" +msgstr "" + +#: subst.c:5792 +msgid "<(" +msgstr "" + +#: subst.c:5792 +msgid ">(" +msgstr "" + +#: subst.c:6647 +#, c-format +msgid "no match: %s" +msgstr "" + +#: syntax.h:26 +msgid "\\`$\"\n" +msgstr "" + +#: syntax.h:27 +msgid "\\`$" +msgstr "" + +#: syntax.h:29 +msgid "()<>;&|" +msgstr "" + +#: syntax.h:32 +msgid "\"`'" +msgstr "" + +#: syntax.h:35 +msgid "$<>" +msgstr "" + +#: syntax.h:41 +msgid "@*+?!" +msgstr "" + +#: syntax.h:45 +msgid "*?[]^" +msgstr "" + +#: test.c:152 +msgid "argument expected" +msgstr "" + +#: test.c:161 +#, c-format +msgid "%s: integer expression expected" +msgstr "" + +#: test.c:176 +msgid "/dev/fd/" +msgstr "" + +#: test.c:202 +msgid "/dev/std" +msgstr "" + +#: test.c:206 +msgid "out" +msgstr "" + +#: test.c:208 +msgid "err" +msgstr "" + +#: test.c:359 +msgid "`)' expected" +msgstr "" + +#: test.c:361 +#, c-format +msgid "`)' expected, found %s" +msgstr "" + +#: test.c:376 test.c:785 test.c:788 +#, c-format +msgid "%s: unary operator expected" +msgstr "" + +#: test.c:541 test.c:828 +#, c-format +msgid "%s: binary operator expected" +msgstr "" + +#: test.c:903 builtins/test.def:134 +msgid "missing `]'" +msgstr "" + +#: test.c:919 builtins/common.c:132 +msgid "too many arguments" +msgstr "" + +#: trap.c:171 +msgid "DEFAULT_SIG" +msgstr "" + +#: trap.c:173 +msgid "IGNORE_SIG" +msgstr "" + +#: trap.c:175 +msgid "IMPOSSIBLE_TRAP_HANDLER" +msgstr "" + +#: trap.c:179 builtins/caller.def:94 +msgid "NULL" +msgstr "" + +#: trap.c:192 +msgid "invalid signal number" +msgstr "" + +#: trap.c:222 builtins/common.c:638 builtins/trap.def:218 +msgid "SIG" +msgstr "" + +#: trap.c:307 +#, c-format +msgid "run_pending_traps: bad value in trap_list[%d]: %p" +msgstr "" + +#: trap.c:311 +#, c-format +msgid "" +"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself" +msgstr "" + +#: trap.c:347 +#, c-format +msgid "trap_handler: bad signal %d" +msgstr "" + +#: trap.c:673 +msgid "exit trap" +msgstr "" + +#: trap.c:781 +msgid "debug trap" +msgstr "" + +#: trap.c:800 +msgid "error trap" +msgstr "" + +#: trap.c:811 +msgid "return trap" +msgstr "" + +#: trap.c:821 +msgid "interrupt trap" +msgstr "" + +#: variables.c:287 +msgid "() {" +msgstr "" + +#: variables.c:309 +#, c-format +msgid "error importing function definition for `%s'" +msgstr "" + +#: variables.c:370 +msgid "NODE" +msgstr "" + +#: variables.c:383 +msgid "# " +msgstr "" + +#: variables.c:387 +msgid "+ " +msgstr "" + +#: variables.c:390 variables.c:2867 variables.c:3464 variables.c:3500 +#: variables.c:3632 variables.c:3735 +msgid "IFS" +msgstr "" + +#: variables.c:401 +msgid "600" +msgstr "" + +#: variables.c:401 +msgid "60" +msgstr "" + +#: variables.c:409 variables.c:3647 variables.c:3955 builtins/getopts.def:231 +msgid "OPTIND" +msgstr "" + +#: variables.c:411 variables.c:3646 variables.c:3976 +msgid "OPTERR" +msgstr "" + +#: variables.c:420 +msgid "BASH" +msgstr "" + +#: variables.c:430 +msgid "BASH_VERSION" +msgstr "" + +#: variables.c:436 +msgid "BASH_EXECUTION_STRING" +msgstr "" + +#: variables.c:452 +msgid "~/.sh_history" +msgstr "" + +#: variables.c:452 +msgid "~/.bash_history" +msgstr "" + +#: variables.c:457 +msgid "500" +msgstr "" + +#: variables.c:469 variables.c:3633 builtins/set.def:313 builtins/set.def:315 +#: builtins/set.def:316 +msgid "IGNOREEOF" +msgstr "" + +#: variables.c:471 variables.c:3669 builtins/set.def:191 builtins/set.def:311 +msgid "ignoreeof" +msgstr "" + +#: variables.c:527 +msgid "HOSTTYPE" +msgstr "" + +#: variables.c:528 +msgid "OSTYPE" +msgstr "" + +#: variables.c:529 +msgid "MACHTYPE" +msgstr "" + +#: variables.c:531 +msgid "HOSTNAME" +msgstr "" + +#: variables.c:660 variables.c:694 +msgid "SHLVL" +msgstr "" + +#: variables.c:669 +#, c-format +msgid "shell level (%d) too high, resetting to 1" +msgstr "" + +#: variables.c:734 +msgid "shell-init" +msgstr "" + +#: variables.c:758 variables.c:761 +msgid "PPID" +msgstr "" + +#: variables.c:772 variables.c:775 +msgid "UID" +msgstr "" + +#: variables.c:782 variables.c:785 +msgid "EUID" +msgstr "" + +#: variables.c:798 variables.c:800 +msgid "BASH_VERSINFO" +msgstr "" + +#: variables.c:893 +#, c-format +msgid "%s=" +msgstr "" + +#: variables.c:1087 variables.c:1093 +msgid "SECONDS" +msgstr "" + +#: variables.c:1395 +msgid "BASH_COMMAND" +msgstr "" + +#: variables.c:1396 +msgid "BASH_SUBSHELL" +msgstr "" + +#: variables.c:1398 +msgid "RANDOM" +msgstr "" + +#: variables.c:1399 +msgid "LINENO" +msgstr "" + +#: variables.c:1402 +msgid "HISTCMD" +msgstr "" + +#: variables.c:1406 +msgid "COMP_WORDBREAKS" +msgstr "" + +#: variables.c:1410 +msgid "DIRSTACK" +msgstr "" + +#: variables.c:1414 +msgid "GROUPS" +msgstr "" + +#: variables.c:1417 variables.c:3554 variables.c:3578 builtins/evalfile.c:101 +msgid "BASH_ARGC" +msgstr "" + +#: variables.c:1418 variables.c:3553 variables.c:3577 builtins/evalfile.c:100 +msgid "BASH_ARGV" +msgstr "" + +#: variables.c:1609 +msgid "make_local_variable: no function context at current scope" +msgstr "" + +#: variables.c:2708 +msgid "all_local_variables: no function context at current scope" +msgstr "" + +#: variables.c:2922 variables.c:2931 +#, c-format +msgid "invalid character %d in exportstr for %s" +msgstr "" + +#: variables.c:2937 +#, c-format +msgid "no `=' in exportstr for %s" +msgstr "" + +#: variables.c:3071 +msgid ") {" +msgstr "" + +#: variables.c:3222 +msgid "_=" +msgstr "" + +#: variables.c:3242 +msgid "_GNU_nonoption_argv_flags_" +msgstr "" + +#: variables.c:3362 +msgid "pop_var_context: head of shell_variables not a function context" +msgstr "" + +#: variables.c:3375 +msgid "pop_var_context: no global_variables context" +msgstr "" + +#: variables.c:3441 +msgid "pop_scope: head of shell_variables not a temporary environment scope" +msgstr "" + +#: variables.c:3625 builtins/history.def:282 +msgid "HISTTIMEFORMAT" +msgstr "" + +#: variables.c:3635 +msgid "LANG" +msgstr "" + +#: variables.c:3636 +msgid "LC_ALL" +msgstr "" + +#: variables.c:3654 +msgid "TERMCAP" +msgstr "" + +#: variables.c:3655 +msgid "TERMINFO" +msgstr "" + +#: variables.c:3662 lib/sh/strftime.c:185 lib/sh/strftime.c:187 +msgid "TZ" +msgstr "" + +#: variables.c:3867 +msgid "ignorespace" +msgstr "" + +#: variables.c:3869 +msgid "ignoredups" +msgstr "" + +#: variables.c:3871 +msgid "ignoreboth" +msgstr "" + +#: variables.c:3873 +msgid "erasedups" +msgstr "" + +#: version.c:60 version.c:62 +#, c-format +msgid "%s.%d(%d)-%s" +msgstr "" + +#: version.c:66 version.c:68 +#, c-format +msgid "%s.%d(%d)" +msgstr "" + +#: version.c:78 +#, c-format +msgid "GNU bash, version %s (%s)\n" +msgstr "" + +#: version.c:80 +msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n" +msgstr "" + +#: xmalloc.c:91 +#, c-format +msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)" +msgstr "" + +#: xmalloc.c:93 +#, c-format +msgid "xmalloc: cannot allocate %lu bytes" +msgstr "" + +#: xmalloc.c:113 +#, c-format +msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)" +msgstr "" + +#: xmalloc.c:115 +#, c-format +msgid "xrealloc: cannot allocate %lu bytes" +msgstr "" + +#: xmalloc.c:149 +#, c-format +msgid "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)" +msgstr "" + +#: xmalloc.c:151 +#, c-format +msgid "xmalloc: %s:%d: cannot allocate %lu bytes" +msgstr "" + +#: xmalloc.c:173 +#, c-format +msgid "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)" +msgstr "" + +#: xmalloc.c:175 +#, c-format +msgid "xrealloc: %s:%d: cannot allocate %lu bytes" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "error" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "$undefined." +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "IF" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "THEN" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "ELSE" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "ELIF" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "FI" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:469 +msgid "CASE" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "ESAC" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "FOR" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "SELECT" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "WHILE" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "UNTIL" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "DO" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 +msgid "DONE" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:470 builtins/mkbuiltins.c:425 +msgid "FUNCTION" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "COND_START" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "COND_END" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "COND_ERROR" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "IN" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "BANG" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "TIME" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:471 +msgid "TIMEOPT" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:472 +msgid "WORD" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:472 +msgid "ASSIGNMENT_WORD" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:472 +msgid "NUMBER" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:472 +msgid "ARITH_CMD" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:472 +msgid "ARITH_FOR_EXPRS" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:473 +msgid "COND_CMD" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:473 +msgid "AND_AND" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:473 +msgid "OR_OR" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:473 +msgid "GREATER_GREATER" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:473 +msgid "LESS_LESS" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:474 +msgid "LESS_AND" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:474 +msgid "LESS_LESS_LESS" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:474 +msgid "GREATER_AND" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:474 +msgid "SEMI_SEMI" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:475 +msgid "LESS_LESS_MINUS" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:475 +msgid "AND_GREATER" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:475 +msgid "LESS_GREATER" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:475 +msgid "GREATER_BAR" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:475 +msgid "'&'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "';'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'\\n'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "yacc_EOF" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'|'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'>'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'<'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'-'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'{'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:476 +msgid "'}'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:477 +msgid "'('" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:477 +msgid "')'" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:477 +msgid "inputunit" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:477 +msgid "word_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:477 +msgid "redirection" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:478 +msgid "simple_command_element" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:478 +msgid "redirection_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:478 +msgid "simple_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:479 builtins/command.def:2 +#: builtins/complete.def:82 +msgid "command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:479 +msgid "shell_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:479 +msgid "for_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:479 +msgid "arith_for_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:480 +msgid "select_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:480 +msgid "case_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:480 +msgid "function_def" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:480 +msgid "function_body" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:481 +msgid "subshell" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:481 +msgid "if_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:481 +msgid "group_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:481 +msgid "arith_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:482 +msgid "cond_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:482 +msgid "elif_clause" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:482 +msgid "case_clause" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:482 +msgid "pattern_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:483 +msgid "case_clause_sequence" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:483 +msgid "pattern" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:483 +msgid "list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:483 +msgid "compound_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:483 +msgid "list0" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:484 +msgid "list1" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:484 +msgid "simple_list_terminator" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:484 +msgid "list_terminator" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:484 +msgid "newline_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:485 +msgid "simple_list" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:485 +msgid "simple_list1" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:485 +msgid "pipeline_command" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:485 +msgid "pipeline" +msgstr "" + +#: /usr/homes/chet/src/bash/src/parse.y:486 +msgid "timespec" +msgstr "" + +#: /usr/local/share/bison/bison.simple:156 +msgid "syntax error: cannot back up" +msgstr "" + +#: /usr/local/share/bison/bison.simple:442 +msgid "Starting parse\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:492 +#: /usr/local/share/bison/bison.simple:499 +#: /usr/local/share/bison/bison.simple:924 +msgid "parser stack overflow" +msgstr "" + +#: /usr/local/share/bison/bison.simple:538 +#, c-format +msgid "Stack size increased to %lu\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:545 +#, c-format +msgid "Entering state %d\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:572 +msgid "Reading a token: " +msgstr "" + +#: /usr/local/share/bison/bison.simple:583 +msgid "Now at end of input.\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:594 +#, c-format +msgid "Next token is %d (%s" +msgstr "" + +#: /usr/local/share/bison/bison.simple:633 +#, c-format +msgid "Shifting token %d (%s), " +msgstr "" + +#: /usr/local/share/bison/bison.simple:695 +#, c-format +msgid "Reducing via rule %d (line %d), " +msgstr "" + +#: /usr/local/share/bison/bison.simple:701 +#, c-format +msgid " -> %s\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:717 +msgid "state stack now" +msgstr "" + +#: /usr/local/share/bison/bison.simple:769 +#: /usr/local/share/bison/bison.simple:774 +msgid "parse error, unexpected " +msgstr "" + +#: /usr/local/share/bison/bison.simple:785 +msgid ", expecting " +msgstr "" + +#: /usr/local/share/bison/bison.simple:785 +msgid " or " +msgstr "" + +#: /usr/local/share/bison/bison.simple:795 +msgid "parse error; also virtual memory exhausted" +msgstr "" + +#: /usr/local/share/bison/bison.simple:799 +msgid "parse error" +msgstr "" + +#: /usr/local/share/bison/bison.simple:816 +#, c-format +msgid "Discarding token %d (%s).\n" +msgstr "" + +#: /usr/local/share/bison/bison.simple:862 +msgid "Error: state stack now" +msgstr "" + +#: /usr/local/share/bison/bison.simple:895 +msgid "Shifting error token, " +msgstr "" + +#: builtins/common.c:102 +#, c-format +msgid "line %d: " +msgstr "" + +#: builtins/common.c:119 +#, c-format +msgid "%s: usage: " +msgstr "" + +#: builtins/common.c:163 +#, c-format +msgid "%s: numeric argument required" +msgstr "" + +#: builtins/common.c:170 +#, c-format +msgid "%s: not found" +msgstr "" + +#: builtins/common.c:186 +#, c-format +msgid "%s: invalid option name" +msgstr "" + +#: builtins/common.c:200 +#, c-format +msgid "%s: invalid number" +msgstr "" + +#: builtins/common.c:207 +#, c-format +msgid "%s: invalid signal specification" +msgstr "" + +#: builtins/common.c:214 +#, c-format +msgid "`%s': not a pid or valid job spec" +msgstr "" + +#: builtins/common.c:229 +#, c-format +msgid "%s: %s out of range" +msgstr "" + +#: builtins/common.c:229 builtins/common.c:231 +msgid "argument" +msgstr "" + +#: builtins/common.c:231 +#, c-format +msgid "%s out of range" +msgstr "" + +#: builtins/common.c:239 +#, c-format +msgid "%s: no such job" +msgstr "" + +#: builtins/common.c:247 +#, c-format +msgid "%s: no job control" +msgstr "" + +#: builtins/common.c:249 +msgid "no job control" +msgstr "" + +#: builtins/common.c:259 +#, c-format +msgid "%s: restricted" +msgstr "" + +#: builtins/common.c:269 +#, c-format +msgid "%s: not a shell builtin" +msgstr "" + +#: builtins/common.c:417 +msgid "`'" +msgstr "" + +#: builtins/common.c:480 +#, c-format +msgid "%s: could not get current directory: %s: %s\n" +msgstr "" + +#: builtins/common.c:547 builtins/common.c:549 +#, c-format +msgid "%s: ambiguous job spec" +msgstr "" + +#: builtins/common.c:631 builtins/common.c:680 builtins/trap.def:214 +msgid "SIGJUNK" +msgstr "" + +#: builtins/common.c:631 builtins/common.c:680 +msgid "Unknown" +msgstr "" + +#: builtins/common.c:644 +#, c-format +msgid "%2d) %s" +msgstr "" + +#: builtins/evalfile.c:132 +#, c-format +msgid "%s: not a regular file" +msgstr "" + +#: builtins/evalfile.c:140 +#, c-format +msgid "%s: file is too large" +msgstr "" + +#: builtins/evalfile.c:178 builtins/evalfile.c:237 +msgid "_evalfile" +msgstr "" + +#: builtins/evalfile.c:204 builtins/mkbuiltins.c:130 builtins/source.def:2 +#: builtins/source.def:143 builtins/source.def:170 +msgid "source" +msgstr "" + +#: builtins/evalstring.c:76 builtins/evalstring.c:103 +#: builtins/evalstring.c:287 +msgid "parse_and_execute_top" +msgstr "" + +#: builtins/evalstring.c:181 builtins/evalstring.c:189 +#: builtins/evalstring.c:223 builtins/evalstring.c:272 +msgid "pe_dispose" +msgstr "" + +#: builtins/evalstring.c:205 +msgid "parse_and_execute" +msgstr "" + +#: builtins/getopt.c:108 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: builtins/getopt.c:109 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: builtins/getopt.c:231 +msgid "sh_getopt_debug_restore_state: resetting nextchar" +msgstr "" + +#: builtins/getopt.c:254 +msgid "abc:d:0123456789" +msgstr "" + +#: builtins/getopt.c:271 +msgid "digits occur in two different argv-elements.\n" +msgstr "" + +#: builtins/getopt.c:273 +#, c-format +msgid "option %c\n" +msgstr "" + +#: builtins/getopt.c:277 +msgid "option a\n" +msgstr "" + +#: builtins/getopt.c:281 +msgid "option b\n" +msgstr "" + +#: builtins/getopt.c:285 +#, c-format +msgid "option c with value `%s'\n" +msgstr "" + +#: builtins/getopt.c:292 +#, c-format +msgid "?? sh_getopt returned character code 0%o ??\n" +msgstr "" + +#: builtins/getopt.c:298 +msgid "non-option ARGV-elements: " +msgstr "" + +#: builtins/mkbuiltins.c:47 +msgid "builtins.texi" +msgstr "" + +#: builtins/mkbuiltins.c:130 builtins/break.def:2 +msgid "break" +msgstr "" + +#: builtins/mkbuiltins.c:130 builtins/break.def:2 +msgid "continue" +msgstr "" + +#: builtins/mkbuiltins.c:130 builtins/eval.def:2 builtins/eval.def:52 +msgid "eval" +msgstr "" + +#: builtins/mkbuiltins.c:130 builtins/exec.def:2 +msgid "exec" +msgstr "" + +#: builtins/mkbuiltins.c:131 builtins/mkbuiltins.c:138 +#: builtins/complete.def:86 builtins/setattr.def:2 +msgid "export" +msgstr "" + +#: builtins/mkbuiltins.c:131 builtins/mkbuiltins.c:138 builtins/setattr.def:2 +msgid "readonly" +msgstr "" + +#: builtins/mkbuiltins.c:131 builtins/return.def:2 +msgid "return" +msgstr "" + +#: builtins/mkbuiltins.c:131 builtins/shift.def:2 +msgid "shift" +msgstr "" + +#: builtins/mkbuiltins.c:131 builtins/set.def:2 +msgid "unset" +msgstr "" + +#: builtins/mkbuiltins.c:138 builtins/alias.def:2 builtins/complete.def:78 +#: builtins/type.def:228 +msgid "alias" +msgstr "" + +#: builtins/mkbuiltins.c:138 builtins/declare.def:2 +msgid "declare" +msgstr "" + +#: builtins/mkbuiltins.c:138 builtins/declare.def:2 +msgid "local" +msgstr "" + +#: builtins/mkbuiltins.c:138 +msgid "typeset" +msgstr "" + +#: builtins/mkbuiltins.c:194 +msgid "-externfile" +msgstr "" + +#: builtins/mkbuiltins.c:196 +msgid "-structfile" +msgstr "" + +#: builtins/mkbuiltins.c:198 +msgid "-noproduction" +msgstr "" + +#: builtins/mkbuiltins.c:200 +msgid "-document" +msgstr "" + +#: builtins/mkbuiltins.c:202 +msgid "-D" +msgstr "" + +#: builtins/mkbuiltins.c:218 +msgid "-documentonly" +msgstr "" + +#: builtins/mkbuiltins.c:223 +msgid "-H" +msgstr "" + +#: builtins/mkbuiltins.c:230 +#, c-format +msgid "%s: Unknown flag %s.\n" +msgstr "" + +#: builtins/mkbuiltins.c:245 +#, c-format +msgid "mk-%ld" +msgstr "" + +#: builtins/mkbuiltins.c:266 +#, c-format +msgid "@c Table of builtins created with %s.\n" +msgstr "" + +#: builtins/mkbuiltins.c:268 +msgid "@ftable @asis\n" +msgstr "" + +#: builtins/mkbuiltins.c:305 +msgid "@end ftable\n" +msgstr "" + +#: builtins/mkbuiltins.c:423 +msgid "BUILTIN" +msgstr "" + +#: builtins/mkbuiltins.c:424 +msgid "DOCNAME" +msgstr "" + +#: builtins/mkbuiltins.c:426 +msgid "SHORT_DOC" +msgstr "" + +#: builtins/mkbuiltins.c:428 +msgid "COMMENT" +msgstr "" + +#: builtins/mkbuiltins.c:429 +msgid "DEPENDS_ON" +msgstr "" + +#: builtins/mkbuiltins.c:430 +msgid "PRODUCES" +msgstr "" + +#: builtins/mkbuiltins.c:431 +msgid "END" +msgstr "" + +#: builtins/mkbuiltins.c:500 +#, c-format +msgid "mkbuiltins: %s: skipping zero-length file\n" +msgstr "" + +#: builtins/mkbuiltins.c:551 +#, c-format +msgid "Unknown directive `%s'" +msgstr "" + +#: builtins/mkbuiltins.c:577 +#, c-format +msgid "#line %d \"%s\"\n" +msgstr "" + +#: builtins/mkbuiltins.c:580 +#, c-format +msgid "#line %d \"%s%s\"\n" +msgstr "" + +#: builtins/mkbuiltins.c:582 builtins/mkbuiltins.c:954 +msgid "./" +msgstr "" + +#: builtins/mkbuiltins.c:703 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: builtins/mkbuiltins.c:715 +#, c-format +msgid "%s must be inside of a $BUILTIN block" +msgstr "" + +#: builtins/mkbuiltins.c:740 +msgid "(implied LONGDOC)" +msgstr "" + +#: builtins/mkbuiltins.c:766 +#, c-format +msgid "%s found before $END" +msgstr "" + +#: builtins/mkbuiltins.c:812 +msgid "syntax error: no current builtin for $FUNCTION directive" +msgstr "" + +#: builtins/mkbuiltins.c:816 +#, c-format +msgid "%s already has a function (%s)" +msgstr "" + +#: builtins/mkbuiltins.c:836 +#, c-format +msgid "%s already had a docname (%s)" +msgstr "" + +#: builtins/mkbuiltins.c:856 +#, c-format +msgid "%s already has short documentation (%s)" +msgstr "" + +#: builtins/mkbuiltins.c:910 +#, c-format +msgid "%s already has a %s definition" +msgstr "" + +#: builtins/mkbuiltins.c:923 +#, c-format +msgid "/* %s, created from %s. */\n" +msgstr "" + +#: builtins/mkbuiltins.c:955 +#, c-format +msgid "%s:%d:" +msgstr "" + +#: builtins/mkbuiltins.c:1010 +msgid "mkbuiltins: out of virtual memory\n" +msgstr "" + +#: builtins/mkbuiltins.c:1066 +msgid "/* builtins.c -- the built in shell commands. */" +msgstr "" + +#: builtins/mkbuiltins.c:1068 +msgid "/* This file is manufactured by ./mkbuiltins, and should not be" +msgstr "" + +#: builtins/mkbuiltins.c:1069 +msgid " edited by hand. See the source to mkbuiltins for details. */" +msgstr "" + +#: builtins/mkbuiltins.c:1071 +msgid "/* Copyright (C) 1987-2002 Free Software Foundation, Inc." +msgstr "" + +#: builtins/mkbuiltins.c:1073 +msgid " This file is part of GNU Bash, the Bourne Again SHell." +msgstr "" + +#: builtins/mkbuiltins.c:1075 +msgid " Bash is free software; you can redistribute it and/or modify it" +msgstr "" + +#: builtins/mkbuiltins.c:1076 +msgid " under the terms of the GNU General Public License as published by" +msgstr "" + +#: builtins/mkbuiltins.c:1077 +msgid " the Free Software Foundation; either version 2, or (at your option)" +msgstr "" + +#: builtins/mkbuiltins.c:1078 +msgid " any later version." +msgstr "" + +#: builtins/mkbuiltins.c:1080 +msgid " Bash is distributed in the hope that it will be useful, but WITHOUT" +msgstr "" + +#: builtins/mkbuiltins.c:1081 +msgid " ANY WARRANTY; without even the implied warranty of MERCHANTABILITY" +msgstr "" + +#: builtins/mkbuiltins.c:1082 +msgid " or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public" +msgstr "" + +#: builtins/mkbuiltins.c:1083 +msgid " License for more details." +msgstr "" + +#: builtins/mkbuiltins.c:1085 +msgid " You should have received a copy of the GNU General Public License" +msgstr "" + +#: builtins/mkbuiltins.c:1086 +msgid " along with Bash; see the file COPYING. If not, write to the Free" +msgstr "" + +#: builtins/mkbuiltins.c:1087 +msgid "" +" Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */" +msgstr "" + +#: builtins/mkbuiltins.c:1089 +msgid "/* The list of shell builtins. Each element is name, function, flags," +msgstr "" + +#: builtins/mkbuiltins.c:1090 +msgid "" +" long-doc, short-doc. The long-doc field contains a pointer to an array" +msgstr "" + +#: builtins/mkbuiltins.c:1091 +msgid "" +" of help lines. The function takes a WORD_LIST *; the first word in the" +msgstr "" + +#: builtins/mkbuiltins.c:1092 +msgid " list is the first arg to the command. The list has already had word" +msgstr "" + +#: builtins/mkbuiltins.c:1093 +msgid " expansion performed." +msgstr "" + +#: builtins/mkbuiltins.c:1095 +msgid " Functions which need to look at only the simple commands (e.g." +msgstr "" + +#: builtins/mkbuiltins.c:1096 +msgid " the enable_builtin ()), should ignore entries where" +msgstr "" + +#: builtins/mkbuiltins.c:1097 +msgid "" +" (array[i].function == (sh_builtin_func_t *)NULL). Such entries are for" +msgstr "" + +#: builtins/mkbuiltins.c:1098 +msgid "" +" the list of shell reserved control structures, like `if' and `while'." +msgstr "" + +#: builtins/mkbuiltins.c:1099 +msgid " The end of the list is denoted with a NULL name field. */" +msgstr "" + +#: builtins/mkbuiltins.c:1101 +msgid "#include \"../builtins.h\"" +msgstr "" + +#: builtins/mkbuiltins.c:1106 +msgid "" +" { (char *)0x0, (sh_builtin_func_t *)0x0, 0, (char **)0x0, (char *)0x0 }" +msgstr "" + +#: builtins/mkbuiltins.c:1107 +msgid "};" +msgstr "" + +#: builtins/mkbuiltins.c:1109 +msgid "struct builtin *shell_builtins = static_shell_builtins;" +msgstr "" + +#: builtins/mkbuiltins.c:1110 +msgid "struct builtin *current_builtin;" +msgstr "" + +#: builtins/mkbuiltins.c:1112 +msgid "int num_shell_builtins =" +msgstr "" + +#: builtins/mkbuiltins.c:1113 +msgid "\tsizeof (static_shell_builtins) / sizeof (struct builtin) - 1;" +msgstr "" + +#: builtins/mkbuiltins.c:1130 +#, c-format +msgid "#include \"%s\"\n" +msgstr "" + +#: builtins/mkbuiltins.c:1131 builtins/mkbuiltins.c:1138 +msgid "builtext.h" +msgstr "" + +#: builtins/mkbuiltins.c:1132 +msgid "" +"\n" +"struct builtin static_shell_builtins[] = {\n" +msgstr "" + +#: builtins/mkbuiltins.c:1137 +#, c-format +msgid "/* %s - The list of builtins found in libbuiltins.a. */\n" +msgstr "" + +#: builtins/mkbuiltins.c:1188 +#, c-format +msgid "extern int %s __P((WORD_LIST *));\n" +msgstr "" + +#: builtins/mkbuiltins.c:1191 +#, c-format +msgid "extern char * const %s_doc[];\n" +msgstr "" + +#: builtins/mkbuiltins.c:1198 +#, c-format +msgid " { \"%s\", " +msgstr "" + +#: builtins/mkbuiltins.c:1201 +#, c-format +msgid "%s, " +msgstr "" + +#: builtins/mkbuiltins.c:1203 +msgid "(sh_builtin_func_t *)0x0, " +msgstr "" + +#: builtins/mkbuiltins.c:1205 +#, c-format +msgid "%s%s%s, %s_doc,\n" +msgstr "" + +#: builtins/mkbuiltins.c:1206 +msgid "BUILTIN_ENABLED | STATIC_BUILTIN" +msgstr "" + +#: builtins/mkbuiltins.c:1207 +msgid " | SPECIAL_BUILTIN" +msgstr "" + +#: builtins/mkbuiltins.c:1208 +msgid " | ASSIGNMENT_BUILTIN" +msgstr "" + +#: builtins/mkbuiltins.c:1212 +#, c-format +msgid " \"%s\", (char *)NULL },\n" +msgstr "" + +#: builtins/mkbuiltins.c:1235 +#, c-format +msgid "@item %s\n" +msgstr "" + +#: builtins/mkbuiltins.c:1263 +#, c-format +msgid "char * const %s_doc[] =" +msgstr "" + +#: builtins/mkbuiltins.c:1269 lib/sh/mailstat.c:126 +#, c-format +msgid "%s/%s" +msgstr "" + +#: builtins/mkbuiltins.c:1299 +msgid "#if " +msgstr "" + +#: builtins/mkbuiltins.c:1306 +#, c-format +msgid "!defined (%s)" +msgstr "" + +#: builtins/mkbuiltins.c:1308 +#, c-format +msgid "defined (%s)" +msgstr "" + +#: builtins/mkbuiltins.c:1330 +msgid "#endif /* " +msgstr "" + +#: builtins/mkbuiltins.c:1340 +msgid " */\n" +msgstr "" + +#: builtins/mkbuiltins.c:1360 +msgid "" +" {\n" +"#if defined (HELP_BUILTIN)\n" +msgstr "" + +#: builtins/mkbuiltins.c:1373 +msgid " \"" +msgstr "" + +#: builtins/mkbuiltins.c:1387 +#, c-format +msgid "\\%c" +msgstr "" + +#: builtins/mkbuiltins.c:1391 builtins/mkbuiltins.c:1410 +#, c-format +msgid "%c" +msgstr "" + +#: builtins/mkbuiltins.c:1395 +msgid "\",\n" +msgstr "" + +#: builtins/mkbuiltins.c:1406 +#, c-format +msgid "@%c" +msgstr "" + +#: builtins/mkbuiltins.c:1420 +msgid "" +"#endif /* HELP_BUILTIN */\n" +" (char *)NULL\n" +"};\n" +msgstr "" + +#: builtins/mkbuiltins.c:1432 +msgid "helpfiles" +msgstr "" + +#: builtins/mkbuiltins.c:1435 +msgid "write_helpfiles: helpfiles: cannot create directory\n" +msgstr "" + +#: builtins/mkbuiltins.c:1439 +msgid "helpfiles/" +msgstr "" + +#: builtins/mkbuiltins.c:1446 +#, c-format +msgid "helpfiles/%s" +msgstr "" + +#: builtins/mkbuiltins.c:1451 +#, c-format +msgid "write_helpfiles: cannot open %s\n" +msgstr "" + +#: builtins/alias.def:2 +msgid "unalias" +msgstr "" + +#: builtins/alias.def:73 +msgid "p" +msgstr "" + +#: builtins/alias.def:160 +msgid "a" +msgstr "" + +#: builtins/alias.def:210 +msgid "alias " +msgstr "" + +#: builtins/bind.def:2 +msgid "bind" +msgstr "" + +#: builtins/bind.def:121 builtins/bind.def:265 +msgid "bind_builtin" +msgstr "" + +#: builtins/bind.def:127 +msgid "lvpVPsSf:q:u:m:r:x:" +msgstr "" + +#: builtins/bind.def:192 +#, c-format +msgid "`%s': invalid keymap name" +msgstr "" + +#: builtins/bind.def:231 +#, c-format +msgid "%s: cannot read: %s" +msgstr "" + +#: builtins/bind.def:246 +#, c-format +msgid "`%s': cannot unbind" +msgstr "" + +#: builtins/bind.def:281 builtins/bind.def:311 +#, c-format +msgid "`%s': unknown function name" +msgstr "" + +#: builtins/bind.def:289 +#, c-format +msgid "%s is not bound to any keys.\n" +msgstr "" + +#: builtins/bind.def:293 +#, c-format +msgid "%s can be invoked via " +msgstr "" + +#: builtins/bind.def:295 +#, c-format +msgid "\"%s\"%s" +msgstr "" + +#: builtins/bind.def:295 builtins/help.def:106 +msgid ", " +msgstr "" + +#: builtins/bind.def:295 +msgid ".\n" +msgstr "" + +#: builtins/bind.def:297 +msgid "...\n" +msgstr "" + +#: builtins/break.def:71 builtins/break.def:106 +msgid "loop count" +msgstr "" + +#: builtins/break.def:126 +msgid "only meaningful in a `for', `while', or `until' loop" +msgstr "" + +#: builtins/builtin.def:2 builtins/complete.def:81 builtins/type.def:294 +msgid "builtin" +msgstr "" + +#: builtins/caller.def:2 builtins/caller.def:138 +msgid "caller" +msgstr "" + +#: builtins/caller.def:31 +msgid "$line $filename" +msgstr "" + +#: builtins/caller.def:32 +msgid "$line $subroutine $filename" +msgstr "" + +#: builtins/caller.def:70 +msgid "1 NULL\n" +msgstr "" + +#: builtins/caller.def:94 +#, c-format +msgid "%s %s\n" +msgstr "" + +#: builtins/caller.def:110 +#, c-format +msgid "%s %s %s\n" +msgstr "" + +#: builtins/caller.def:126 +msgid "Returns the context of the current subroutine call." +msgstr "" + +#: builtins/caller.def:128 +msgid "Without EXPR, returns returns \"$line $filename\". With EXPR," +msgstr "" + +#: builtins/caller.def:129 +msgid "returns \"$line $subroutine $filename\"; this extra information" +msgstr "" + +#: builtins/caller.def:130 +msgid "can be used used to provide a stack trace." +msgstr "" + +#: builtins/caller.def:132 +msgid "The value of EXPR indicates how many call frames to go back before the" +msgstr "" + +#: builtins/caller.def:133 +msgid "current one; the top frame is frame 0." +msgstr "" + +#: builtins/caller.def:142 +msgid "caller [EXPR]" +msgstr "" + +#: builtins/cd.def:2 builtins/cd.def:96 builtins/cd.def:130 +msgid "cd" +msgstr "" + +#: builtins/cd.def:2 builtins/cd.def:338 +msgid "pwd" +msgstr "" + +#: builtins/cd.def:105 +msgid "OLDPWD=" +msgstr "" + +#: builtins/cd.def:112 +msgid "PWD=" +msgstr "" + +#: builtins/cd.def:160 builtins/cd.def:318 +msgid "LP" +msgstr "" + +#: builtins/cd.def:187 +msgid "HOME not set" +msgstr "" + +#: builtins/cd.def:199 +msgid "OLDPWD not set" +msgstr "" + +#: builtins/cd.def:210 +msgid "CDPATH" +msgstr "" + +#: builtins/cd.def:349 +#, c-format +msgid "write error: %s" +msgstr "" + +#: builtins/cd.def:378 +msgid "chdir" +msgstr "" + +#: builtins/command.def:29 +msgid "command ls" +msgstr "" + +#: builtins/command.def:73 +msgid "pvV" +msgstr "" + +#: builtins/command.def:120 builtins/command.def:160 +msgid "command_builtin" +msgstr "" + +#: builtins/complete.def:2 +msgid "complete" +msgstr "" + +#: builtins/complete.def:2 builtins/complete.def:589 +msgid "compgen" +msgstr "" + +#: builtins/complete.def:79 builtins/complete.def:458 +msgid "arrayvar" +msgstr "" + +#: builtins/complete.def:80 builtins/complete.def:459 +msgid "binding" +msgstr "" + +#: builtins/complete.def:83 +msgid "directory" +msgstr "" + +#: builtins/complete.def:84 builtins/complete.def:460 +msgid "disabled" +msgstr "" + +#: builtins/complete.def:85 builtins/complete.def:461 +msgid "enabled" +msgstr "" + +#: builtins/complete.def:87 builtins/type.def:315 builtins/type.def:335 +#: builtins/type.def:380 +msgid "file" +msgstr "" + +#: builtins/complete.def:89 builtins/complete.def:463 +msgid "helptopic" +msgstr "" + +#: builtins/complete.def:90 builtins/complete.def:464 +msgid "hostname" +msgstr "" + +#: builtins/complete.def:91 +msgid "group" +msgstr "" + +#: builtins/complete.def:92 +msgid "job" +msgstr "" + +#: builtins/complete.def:93 builtins/set.def:193 builtins/type.def:249 +msgid "keyword" +msgstr "" + +#: builtins/complete.def:94 builtins/complete.def:465 +msgid "running" +msgstr "" + +#: builtins/complete.def:95 +msgid "service" +msgstr "" + +#: builtins/complete.def:96 builtins/complete.def:466 +msgid "setopt" +msgstr "" + +#: builtins/complete.def:97 builtins/complete.def:467 +msgid "shopt" +msgstr "" + +#: builtins/complete.def:98 builtins/complete.def:468 +msgid "signal" +msgstr "" + +#: builtins/complete.def:99 builtins/complete.def:469 +msgid "stopped" +msgstr "" + +#: builtins/complete.def:100 +msgid "user" +msgstr "" + +#: builtins/complete.def:101 builtins/set.def:787 +msgid "variable" +msgstr "" + +#: builtins/complete.def:110 builtins/complete.def:434 +msgid "bashdefault" +msgstr "" + +#: builtins/complete.def:111 builtins/complete.def:435 +msgid "default" +msgstr "" + +#: builtins/complete.def:112 builtins/complete.def:436 +msgid "dirnames" +msgstr "" + +#: builtins/complete.def:113 builtins/complete.def:437 +msgid "filenames" +msgstr "" + +#: builtins/complete.def:114 builtins/complete.def:438 +msgid "nospace" +msgstr "" + +#: builtins/complete.def:115 builtins/complete.def:439 +msgid "plusdirs" +msgstr "" + +#: builtins/complete.def:170 +msgid "abcdefgjko:prsuvA:G:W:P:S:X:F:C:" +msgstr "" + +#: builtins/complete.def:183 +msgid "-r" +msgstr "" + +#: builtins/complete.def:250 +#, c-format +msgid "%s: invalid action name" +msgstr "" + +#: builtins/complete.def:380 builtins/complete.def:523 +#, c-format +msgid "%s: no completion specification" +msgstr "" + +#: builtins/complete.def:392 builtins/complete.def:400 +#, c-format +msgid "%s %s " +msgstr "" + +#: builtins/complete.def:412 +#, c-format +msgid "-A %s " +msgstr "" + +#: builtins/complete.def:418 +#, c-format +msgid "-o %s " +msgstr "" + +#: builtins/complete.def:429 +msgid "complete " +msgstr "" + +#: builtins/complete.def:444 +msgid "-a" +msgstr "" + +#: builtins/complete.def:445 +msgid "-b" +msgstr "" + +#: builtins/complete.def:447 +msgid "-d" +msgstr "" + +#: builtins/complete.def:448 +msgid "-e" +msgstr "" + +#: builtins/complete.def:449 +msgid "-f" +msgstr "" + +#: builtins/complete.def:450 +msgid "-g" +msgstr "" + +#: builtins/complete.def:451 +msgid "-j" +msgstr "" + +#: builtins/complete.def:452 +msgid "-k" +msgstr "" + +#: builtins/complete.def:453 builtins/shopt.def:325 +msgid "-s" +msgstr "" + +#: builtins/complete.def:454 builtins/shopt.def:325 +msgid "-u" +msgstr "" + +#: builtins/complete.def:455 +msgid "-v" +msgstr "" + +#: builtins/complete.def:474 +msgid "-G" +msgstr "" + +#: builtins/complete.def:475 +msgid "-W" +msgstr "" + +#: builtins/complete.def:476 +msgid "-P" +msgstr "" + +#: builtins/complete.def:477 +msgid "-S" +msgstr "" + +#: builtins/complete.def:478 +msgid "-X" +msgstr "" + +#: builtins/complete.def:481 +msgid "-F" +msgstr "" + +#: builtins/complete.def:482 +msgid "-C" +msgstr "" + +#: builtins/complete.def:570 +msgid "warning: -F option may not work as you expect" +msgstr "" + +#: builtins/complete.def:572 +msgid "warning: -C option may not work as you expect" +msgstr "" + +#: builtins/declare.def:104 +msgid "can only be used in a function" +msgstr "" + +#: builtins/declare.def:110 +msgid "+afiprtxF" +msgstr "" + +#: builtins/declare.def:112 +msgid "+fiprtxF" +msgstr "" + +#: builtins/declare.def:294 +msgid "cannot use `-f' to make functions" +msgstr "" + +#: builtins/declare.def:319 +#, c-format +msgid "%s %d %s\n" +msgstr "" + +#: builtins/declare.def:388 +#, c-format +msgid "%s: cannot destroy array variables in this way" +msgstr "" + +#: builtins/echo.def:2 +msgid "echo" +msgstr "" + +#: builtins/echo.def:65 +msgid "neE" +msgstr "" + +#: builtins/echo.def:67 +msgid "n" +msgstr "" + +#: builtins/enable.def:2 +msgid "enable" +msgstr "" + +#: builtins/enable.def:104 +msgid "adnpsf:" +msgstr "" + +#: builtins/enable.def:126 builtins/enable.def:134 +msgid "dynamic loading not available" +msgstr "" + +#: builtins/enable.def:227 +#, c-format +msgid "enable %s\n" +msgstr "" + +#: builtins/enable.def:230 +#, c-format +msgid "enable -n %s\n" +msgstr "" + +#: builtins/enable.def:301 +#, c-format +msgid "cannot open shared object %s: %s" +msgstr "" + +#: builtins/enable.def:319 +msgid "_struct" +msgstr "" + +#: builtins/enable.def:324 +#, c-format +msgid "cannot find %s in shared object %s: %s" +msgstr "" + +#: builtins/enable.def:448 +#, c-format +msgid "%s: not dynamically loaded" +msgstr "" + +#: builtins/enable.def:463 +#, c-format +msgid "%s: cannot delete: %s" +msgstr "" + +#: builtins/exec.def:100 +msgid "cla:" +msgstr "" + +#: builtins/exec.def:204 +#, c-format +msgid "%s: cannot execute: %s" +msgstr "" + +#: builtins/exit.def:61 +msgid "logout\n" +msgstr "" + +#: builtins/exit.def:61 +msgid "exit\n" +msgstr "" + +#: builtins/exit.def:81 +msgid "not login shell: use `exit'" +msgstr "" + +#: builtins/exit.def:109 +msgid "There are stopped jobs.\n" +msgstr "" + +#: builtins/exit.def:145 +msgid "~/.bash_logout" +msgstr "" + +#: builtins/fc.def:2 builtins/fc.def:269 builtins/fc.def:370 +msgid "fc" +msgstr "" + +#: builtins/fc.def:157 +msgid "${FCEDIT:-${EDITOR:-vi}}" +msgstr "" + +#: builtins/fc.def:181 +msgid ":e:lnrs" +msgstr "" + +#: builtins/fc.def:252 +msgid "no command found" +msgstr "" + +#: builtins/fc.def:317 +msgid "history specification" +msgstr "" + +#: builtins/fc.def:335 +msgid "bash-fc" +msgstr "" + +#: builtins/fc.def:338 +#, c-format +msgid "cannot open temp file %s" +msgstr "" + +#: builtins/fc.def:350 +#, c-format +msgid "\t%c" +msgstr "" + +#: builtins/fc.def:363 builtins/fc.def:368 +#, c-format +msgid "%s %s" +msgstr "" + +#: builtins/fc.def:386 builtins/fc.def:394 +msgid "fc builtin" +msgstr "" + +#: builtins/fg_bg.def:123 builtins/jobs.def:264 +msgid "current" +msgstr "" + +#: builtins/fg_bg.def:131 +#, c-format +msgid "job %%%d started without job control" +msgstr "" + +#: builtins/getopts.def:2 +msgid "getopts" +msgstr "" + +#: builtins/getopts.def:248 builtins/getopts.def:255 builtins/getopts.def:282 +#: lib/sh/strftime.c:235 lib/sh/strftime.c:242 lib/sh/strftime.c:250 +#: lib/sh/strftime.c:257 +msgid "?" +msgstr "" + +#: builtins/getopts.def:261 builtins/getopts.def:264 builtins/getopts.def:278 +#: builtins/getopts.def:283 builtins/getopts.def:288 +msgid "OPTARG" +msgstr "" + +#: builtins/hash.def:2 +msgid "hash" +msgstr "" + +#: builtins/hash.def:82 +msgid "hashing disabled" +msgstr "" + +#: builtins/hash.def:89 +msgid "dlp:rt" +msgstr "" + +#: builtins/hash.def:118 +msgid "-t" +msgstr "" + +#: builtins/hash.def:127 +#, c-format +msgid "%s: hash table empty\n" +msgstr "" + +#: builtins/hash.def:210 +#, c-format +msgid "%4d\t%s\n" +msgstr "" + +#: builtins/hash.def:218 builtins/hash.def:257 +#, c-format +msgid "builtin hash -p %s %s\n" +msgstr "" + +#: builtins/hash.def:230 +msgid "hits\tcommand\n" +msgstr "" + +#: builtins/hash.def:261 +#, c-format +msgid "%s\t" +msgstr "" + +#: builtins/help.def:80 builtins/help.def:105 +msgid "s" +msgstr "" + +#: builtins/help.def:105 +#, c-format +msgid "Shell commands matching keyword%s `" +msgstr "" + +#: builtins/help.def:107 +msgid "" +"'\n" +"\n" +msgstr "" + +#: builtins/help.def:121 +#, c-format +msgid "%s: %s\n" +msgstr "" + +#: builtins/help.def:133 +#, c-format +msgid "" +"no help topics match `%s'. Try `help help' or `man -k %s' or `info %s'." +msgstr "" + +#: builtins/help.def:159 +#, c-format +msgid "%s: cannot open: %s" +msgstr "" + +#: builtins/help.def:167 +#, c-format +msgid " %s\n" +msgstr "" + +#: builtins/help.def:177 +msgid "" +"These shell commands are defined internally. Type `help' to see this list.\n" +"Type `help name' to find out more about the function `name'.\n" +"Use `info bash' to find out more about the shell in general.\n" +"Use `man -k' or `info' to find out more about commands not in this list.\n" +"\n" +"A star (*) next to a name means that the command is disabled.\n" +"\n" +msgstr "" + +#: builtins/history.def:2 builtins/set.def:189 +msgid "history" +msgstr "" + +#: builtins/history.def:106 +msgid "acd:npsrw" +msgstr "" + +#: builtins/history.def:147 +msgid "cannot use more than one of -anrw" +msgstr "" + +#: builtins/history.def:179 +msgid "history position" +msgstr "" + +#: builtins/history.def:289 +#, c-format +msgid "%5d%c %s%s\n" +msgstr "" + +#: builtins/history.def:389 +#, c-format +msgid "%s: history expansion failed" +msgstr "" + +#: builtins/inlib.def:2 +msgid "inlib" +msgstr "" + +#: builtins/inlib.def:67 +#, c-format +msgid "%s: inlib failed" +msgstr "" + +#: builtins/jobs.def:2 +msgid "jobs" +msgstr "" + +#: builtins/jobs.def:2 +msgid "disown" +msgstr "" + +#: builtins/jobs.def:85 +msgid "lpnxrs" +msgstr "" + +#: builtins/jobs.def:101 +msgid "no other options allowed with `-x'" +msgstr "" + +#: builtins/jobs.def:185 builtins/jobs.def:197 +msgid "jobs_builtin" +msgstr "" + +#: builtins/jobs.def:224 +msgid "ahr" +msgstr "" + +#: builtins/kill.def:2 +msgid "kill" +msgstr "" + +#: builtins/kill.def:186 +#, c-format +msgid "%s: arguments must be process or job IDs" +msgstr "" + +#: builtins/kill.def:247 +msgid "Unknown error" +msgstr "" + +#: builtins/kill.def:248 +#, c-format +msgid "(%ld) - %s" +msgstr "" + +#: builtins/let.def:2 +msgid "let" +msgstr "" + +#: builtins/printf.def:2 +msgid "printf" +msgstr "" + +#: builtins/printf.def:66 +msgid "lld" +msgstr "" + +#: builtins/printf.def:68 +msgid "ld" +msgstr "" + +#: builtins/printf.def:103 +msgid "#'-+ 0" +msgstr "" + +#: builtins/printf.def:104 +msgid "hjlLtz" +msgstr "" + +#: builtins/printf.def:119 +msgid "L" +msgstr "" + +#: builtins/printf.def:248 +#, c-format +msgid "`%s': missing format character" +msgstr "" + +#: builtins/printf.def:346 builtins/printf.def:373 +msgid "" +msgstr "" + +#: builtins/printf.def:355 builtins/printf.def:378 +msgid "l" +msgstr "" + +#: builtins/printf.def:407 +#, c-format +msgid "`%c': invalid format character" +msgstr "" + +#: builtins/printf.def:427 +#, c-format +msgid "warning: %s: %s" +msgstr "" + +#: builtins/printf.def:504 +#, c-format +msgid "format parsing problem: %s" +msgstr "" + +#: builtins/printf.def:600 +msgid "missing hex digit for \\x" +msgstr "" + +#: builtins/pushd.def:2 builtins/pushd.def:171 builtins/pushd.def:230 +#: builtins/pushd.def:263 builtins/pushd.def:715 +msgid "pushd" +msgstr "" + +#: builtins/pushd.def:2 builtins/pushd.def:724 +msgid "popd" +msgstr "" + +#: builtins/pushd.def:2 builtins/pushd.def:432 builtins/pushd.def:733 +msgid "dirs" +msgstr "" + +#: builtins/pushd.def:167 +msgid "no other directory" +msgstr "" + +#: builtins/pushd.def:434 +msgid "" +msgstr "" + +#: builtins/pushd.def:436 builtins/pushd.def:455 +#, c-format +msgid "%2d %s" +msgstr "" + +#: builtins/pushd.def:463 +#, c-format +msgid "" +"\n" +"%2d %s" +msgstr "" + +#: builtins/pushd.def:478 +msgid "directory stack empty" +msgstr "" + +#: builtins/pushd.def:480 +msgid "directory stack index" +msgstr "" + +#: builtins/pushd.def:625 +msgid "dirstack" +msgstr "" + +#: builtins/pushd.def:651 +msgid "Display the list of currently remembered directories. Directories" +msgstr "" + +#: builtins/pushd.def:652 +msgid "find their way onto the list with the `pushd' command; you can get" +msgstr "" + +#: builtins/pushd.def:653 +msgid "back up through the list with the `popd' command." +msgstr "" + +#: builtins/pushd.def:655 +msgid "The -l flag specifies that `dirs' should not print shorthand versions" +msgstr "" + +#: builtins/pushd.def:656 +msgid "of directories which are relative to your home directory. This means" +msgstr "" + +#: builtins/pushd.def:657 +msgid "that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag" +msgstr "" + +#: builtins/pushd.def:658 +msgid "causes `dirs' to print the directory stack with one entry per line," +msgstr "" + +#: builtins/pushd.def:659 +msgid "prepending the directory name with its position in the stack. The -p" +msgstr "" + +#: builtins/pushd.def:660 +msgid "flag does the same thing, but the stack position is not prepended." +msgstr "" + +#: builtins/pushd.def:661 +msgid "The -c flag clears the directory stack by deleting all of the elements." +msgstr "" + +#: builtins/pushd.def:663 +msgid "+N displays the Nth entry counting from the left of the list shown by" +msgstr "" + +#: builtins/pushd.def:664 builtins/pushd.def:667 +msgid " dirs when invoked without options, starting with zero." +msgstr "" + +#: builtins/pushd.def:666 +msgid "" +"-N displays the Nth entry counting from the right of the list shown by" +msgstr "" + +#: builtins/pushd.def:672 +msgid "Adds a directory to the top of the directory stack, or rotates" +msgstr "" + +#: builtins/pushd.def:673 +msgid "the stack, making the new top of the stack the current working" +msgstr "" + +#: builtins/pushd.def:674 +msgid "directory. With no arguments, exchanges the top two directories." +msgstr "" + +#: builtins/pushd.def:676 +msgid "+N Rotates the stack so that the Nth directory (counting" +msgstr "" + +#: builtins/pushd.def:677 +msgid " from the left of the list shown by `dirs', starting with" +msgstr "" + +#: builtins/pushd.def:678 builtins/pushd.def:682 +msgid " zero) is at the top." +msgstr "" + +#: builtins/pushd.def:680 +msgid "-N Rotates the stack so that the Nth directory (counting" +msgstr "" + +#: builtins/pushd.def:681 +msgid " from the right of the list shown by `dirs', starting with" +msgstr "" + +#: builtins/pushd.def:684 +msgid "-n suppress the normal change of directory when adding directories" +msgstr "" + +#: builtins/pushd.def:685 +msgid " to the stack, so only the stack is manipulated." +msgstr "" + +#: builtins/pushd.def:687 +msgid "dir adds DIR to the directory stack at the top, making it the" +msgstr "" + +#: builtins/pushd.def:688 +msgid " new current working directory." +msgstr "" + +#: builtins/pushd.def:690 builtins/pushd.def:710 +msgid "You can see the directory stack with the `dirs' command." +msgstr "" + +#: builtins/pushd.def:695 +msgid "Removes entries from the directory stack. With no arguments," +msgstr "" + +#: builtins/pushd.def:696 +msgid "removes the top directory from the stack, and cd's to the new" +msgstr "" + +#: builtins/pushd.def:697 +msgid "top directory." +msgstr "" + +#: builtins/pushd.def:699 +msgid "+N removes the Nth entry counting from the left of the list" +msgstr "" + +#: builtins/pushd.def:700 +msgid " shown by `dirs', starting with zero. For example: `popd +0'" +msgstr "" + +#: builtins/pushd.def:701 +msgid " removes the first directory, `popd +1' the second." +msgstr "" + +#: builtins/pushd.def:703 +msgid "-N removes the Nth entry counting from the right of the list" +msgstr "" + +#: builtins/pushd.def:704 +msgid " shown by `dirs', starting with zero. For example: `popd -0'" +msgstr "" + +#: builtins/pushd.def:705 +msgid " removes the last directory, `popd -1' the next to last." +msgstr "" + +#: builtins/pushd.def:707 +msgid "-n suppress the normal change of directory when removing directories" +msgstr "" + +#: builtins/pushd.def:708 +msgid " from the stack, so only the stack is manipulated." +msgstr "" + +#: builtins/pushd.def:719 +msgid "pushd [+N | -N] [-n] [dir]" +msgstr "" + +#: builtins/pushd.def:728 +msgid "popd [+N | -N] [-n]" +msgstr "" + +#: builtins/pushd.def:737 +msgid "dirs [-clpv] [+N] [-N]" +msgstr "" + +#: builtins/read.def:2 +msgid "read" +msgstr "" + +#: builtins/read.def:178 +msgid "ersa:d:n:p:t:u:" +msgstr "" + +#: builtins/read.def:205 +#, c-format +msgid "%s: invalid timeout specification" +msgstr "" + +#: builtins/read.def:228 +#, c-format +msgid "%s: invalid file descriptor specification" +msgstr "" + +#: builtins/read.def:235 +#, c-format +msgid "%d: invalid file descriptor: %s" +msgstr "" + +#: builtins/read.def:272 builtins/read.def:317 builtins/read.def:491 +msgid "read_builtin" +msgstr "" + +#: builtins/read.def:461 +#, c-format +msgid "read error: %d: %s" +msgstr "" + +#: builtins/reserved.def:123 +msgid "let EXPRESSION" +msgstr "" + +#: builtins/return.def:61 +msgid "can only `return' from a function or sourced script" +msgstr "" + +#: builtins/set.def:161 builtins/shopt.def:170 +msgid "on" +msgstr "" + +#: builtins/set.def:162 builtins/shopt.def:171 +msgid "off" +msgstr "" + +#: builtins/set.def:174 +msgid "allexport" +msgstr "" + +#: builtins/set.def:176 +msgid "braceexpand" +msgstr "" + +#: builtins/set.def:181 +msgid "errexit" +msgstr "" + +#: builtins/set.def:182 +msgid "errtrace" +msgstr "" + +#: builtins/set.def:183 +msgid "functrace" +msgstr "" + +#: builtins/set.def:184 +msgid "hashall" +msgstr "" + +#: builtins/set.def:186 +msgid "histexpand" +msgstr "" + +#: builtins/set.def:192 +msgid "interactive-comments" +msgstr "" + +#: builtins/set.def:194 +msgid "monitor" +msgstr "" + +#: builtins/set.def:195 +msgid "noclobber" +msgstr "" + +#: builtins/set.def:196 +msgid "noexec" +msgstr "" + +#: builtins/set.def:197 +msgid "noglob" +msgstr "" + +#: builtins/set.def:199 +msgid "nolog" +msgstr "" + +#: builtins/set.def:202 +msgid "notify" +msgstr "" + +#: builtins/set.def:204 +msgid "nounset" +msgstr "" + +#: builtins/set.def:205 +msgid "onecmd" +msgstr "" + +#: builtins/set.def:206 +msgid "physical" +msgstr "" + +#: builtins/set.def:207 +msgid "pipefail" +msgstr "" + +#: builtins/set.def:209 +msgid "privileged" +msgstr "" + +#: builtins/set.def:212 +msgid "vi" +msgstr "" + +#: builtins/set.def:214 +msgid "xtrace" +msgstr "" + +#: builtins/set.def:252 builtins/shopt.def:56 +#, c-format +msgid "%-15s\t%s\n" +msgstr "" + +#: builtins/set.def:262 builtins/shopt.def:414 +#, c-format +msgid "set %co %s\n" +msgstr "" + +#: builtins/set.def:313 +msgid "10" +msgstr "" + +#: builtins/set.def:345 +msgid "editing-mode" +msgstr "" + +#: builtins/set.def:493 builtins/set.def:505 builtins/set.def:541 +msgid "SHELLOPTS" +msgstr "" + +#: builtins/set.def:722 +msgid "fv" +msgstr "" + +#: builtins/set.def:742 +msgid "cannot simultaneously unset a function and a variable" +msgstr "" + +#: builtins/set.def:779 +#, c-format +msgid "%s: cannot unset" +msgstr "" + +#: builtins/set.def:786 +#, c-format +msgid "%s: cannot unset: readonly %s" +msgstr "" + +#: builtins/set.def:797 +#, c-format +msgid "%s: not an array variable" +msgstr "" + +#: builtins/setattr.def:98 +msgid "afnp" +msgstr "" + +#: builtins/setattr.def:100 +msgid "fnp" +msgstr "" + +#: builtins/setattr.def:164 +#, c-format +msgid "%s: not a function" +msgstr "" + +#: builtins/setattr.def:201 +msgid "-ra" +msgstr "" + +#: builtins/setattr.def:332 +#, c-format +msgid "declare -%s " +msgstr "" + +#: builtins/setattr.def:334 +#, c-format +msgid "%s -%s " +msgstr "" + +#: builtins/shift.def:65 builtins/shift.def:71 +msgid "shift count" +msgstr "" + +#: builtins/shopt.def:115 +msgid "cdable_vars" +msgstr "" + +#: builtins/shopt.def:116 +msgid "cdspell" +msgstr "" + +#: builtins/shopt.def:117 +msgid "checkhash" +msgstr "" + +#: builtins/shopt.def:118 +msgid "checkwinsize" +msgstr "" + +#: builtins/shopt.def:120 +msgid "cmdhist" +msgstr "" + +#: builtins/shopt.def:122 +msgid "dotglob" +msgstr "" + +#: builtins/shopt.def:123 +msgid "execfail" +msgstr "" + +#: builtins/shopt.def:124 +msgid "expand_aliases" +msgstr "" + +#: builtins/shopt.def:126 +msgid "extdebug" +msgstr "" + +#: builtins/shopt.def:129 +msgid "extglob" +msgstr "" + +#: builtins/shopt.def:131 +msgid "extquote" +msgstr "" + +#: builtins/shopt.def:132 +msgid "failglob" +msgstr "" + +#: builtins/shopt.def:134 +msgid "force_fignore" +msgstr "" + +#: builtins/shopt.def:135 +msgid "gnu_errfmt" +msgstr "" + +#: builtins/shopt.def:136 +msgid "histreedit" +msgstr "" + +#: builtins/shopt.def:139 +msgid "histappend" +msgstr "" + +#: builtins/shopt.def:142 +msgid "histverify" +msgstr "" + +#: builtins/shopt.def:143 +msgid "hostcomplete" +msgstr "" + +#: builtins/shopt.def:145 +msgid "huponexit" +msgstr "" + +#: builtins/shopt.def:146 +msgid "interactive_comments" +msgstr "" + +#: builtins/shopt.def:148 +msgid "lithist" +msgstr "" + +#: builtins/shopt.def:150 +msgid "login_shell" +msgstr "" + +#: builtins/shopt.def:151 +msgid "mailwarn" +msgstr "" + +#: builtins/shopt.def:153 +msgid "no_empty_cmd_completion" +msgstr "" + +#: builtins/shopt.def:155 +msgid "nocaseglob" +msgstr "" + +#: builtins/shopt.def:156 +msgid "nullglob" +msgstr "" + +#: builtins/shopt.def:158 +msgid "progcomp" +msgstr "" + +#: builtins/shopt.def:160 +msgid "promptvars" +msgstr "" + +#: builtins/shopt.def:162 +msgid "restricted_shell" +msgstr "" + +#: builtins/shopt.def:164 +msgid "shift_verbose" +msgstr "" + +#: builtins/shopt.def:165 +msgid "sourcepath" +msgstr "" + +#: builtins/shopt.def:166 +msgid "xpg_echo" +msgstr "" + +#: builtins/shopt.def:196 +msgid "psuoq" +msgstr "" + +#: builtins/shopt.def:224 +msgid "cannot set and unset shell options simultaneously" +msgstr "" + +#: builtins/shopt.def:289 +#, c-format +msgid "%s: invalid shell option name" +msgstr "" + +#: builtins/shopt.def:325 +#, c-format +msgid "shopt %s %s\n" +msgstr "" + +#: builtins/source.def:116 +msgid "filename argument required" +msgstr "" + +#: builtins/source.def:136 +#, c-format +msgid "%s: file not found" +msgstr "" + +#: builtins/suspend.def:2 +msgid "suspend" +msgstr "" + +#: builtins/suspend.def:77 +msgid "f" +msgstr "" + +#: builtins/suspend.def:92 +msgid "cannot suspend" +msgstr "" + +#: builtins/suspend.def:102 +msgid "cannot suspend a login shell" +msgstr "" + +#: builtins/test.def:2 builtins/test.def:98 +msgid "test" +msgstr "" + +#: builtins/times.def:2 +msgid "times" +msgstr "" + +#: builtins/times.def:109 +msgid "" +"0.00 0.00\n" +"0.00 0.00\n" +msgstr "" + +#: builtins/trap.def:39 +msgid "kill -signal $$" +msgstr "" + +#: builtins/trap.def:94 +msgid "lp" +msgstr "" + +#: builtins/trap.def:215 +#, c-format +msgid "trap -- %s %d\n" +msgstr "" + +#: builtins/trap.def:219 builtins/trap.def:221 builtins/trap.def:224 +#, c-format +msgid "trap -- %s %s\n" +msgstr "" + +#: builtins/type.def:2 builtins/type.def:127 +msgid "type" +msgstr "" + +#: builtins/type.def:127 +msgid "-type" +msgstr "" + +#: builtins/type.def:132 +msgid "path" +msgstr "" + +#: builtins/type.def:132 +msgid "-path" +msgstr "" + +#: builtins/type.def:137 +msgid "all" +msgstr "" + +#: builtins/type.def:137 +msgid "-all" +msgstr "" + +#: builtins/type.def:145 +msgid "afptP" +msgstr "" + +#: builtins/type.def:230 +#, c-format +msgid "%s is aliased to `%s'\n" +msgstr "" + +#: builtins/type.def:234 +#, c-format +msgid "alias %s=%s\n" +msgstr "" + +#: builtins/type.def:251 +#, c-format +msgid "%s is a shell keyword\n" +msgstr "" + +#: builtins/type.def:271 +#, c-format +msgid "%s is a function\n" +msgstr "" + +#: builtins/type.def:296 +#, c-format +msgid "%s is a shell builtin\n" +msgstr "" + +#: builtins/type.def:317 builtins/type.def:382 +#, c-format +msgid "%s is %s\n" +msgstr "" + +#: builtins/type.def:337 +#, c-format +msgid "%s is hashed (%s)\n" +msgstr "" + +#: builtins/ulimit.def:2 +msgid "ulimit" +msgstr "" + +#: builtins/ulimit.def:111 +#, c-format +msgid "%ld%s" +msgstr "" + +#: builtins/ulimit.def:195 +msgid "core file size" +msgstr "" + +#: builtins/ulimit.def:195 builtins/ulimit.def:200 +msgid "blocks" +msgstr "" + +#: builtins/ulimit.def:198 +msgid "data seg size" +msgstr "" + +#: builtins/ulimit.def:198 builtins/ulimit.def:202 builtins/ulimit.def:205 +#: builtins/ulimit.def:210 builtins/ulimit.def:217 builtins/ulimit.def:220 +msgid "kbytes" +msgstr "" + +#: builtins/ulimit.def:200 +msgid "file size" +msgstr "" + +#: builtins/ulimit.def:202 +msgid "max locked memory" +msgstr "" + +#: builtins/ulimit.def:205 +msgid "max memory size" +msgstr "" + +#: builtins/ulimit.def:207 +msgid "open files" +msgstr "" + +#: builtins/ulimit.def:208 +msgid "pipe size" +msgstr "" + +#: builtins/ulimit.def:208 +msgid "512 bytes" +msgstr "" + +#: builtins/ulimit.def:210 +msgid "stack size" +msgstr "" + +#: builtins/ulimit.def:213 +msgid "cpu time" +msgstr "" + +#: builtins/ulimit.def:213 +msgid "seconds" +msgstr "" + +#: builtins/ulimit.def:215 +msgid "max user processes" +msgstr "" + +#: builtins/ulimit.def:217 +msgid "virtual memory" +msgstr "" + +#: builtins/ulimit.def:220 +msgid "swap size" +msgstr "" + +#: builtins/ulimit.def:328 builtins/ulimit.def:401 builtins/ulimit.def:674 +msgid "unlimited" +msgstr "" + +#: builtins/ulimit.def:330 +#, c-format +msgid "%s: invalid limit argument" +msgstr "" + +#: builtins/ulimit.def:356 +#, c-format +msgid "`%c': bad command" +msgstr "" + +#: builtins/ulimit.def:385 builtins/ulimit.def:649 +#, c-format +msgid "%s: cannot get limit: %s" +msgstr "" + +#: builtins/ulimit.def:397 builtins/ulimit.def:676 +msgid "hard" +msgstr "" + +#: builtins/ulimit.def:399 builtins/ulimit.def:678 +msgid "soft" +msgstr "" + +#: builtins/ulimit.def:411 +msgid "limit" +msgstr "" + +#: builtins/ulimit.def:423 builtins/ulimit.def:716 +#, c-format +msgid "%s: cannot modify limit: %s" +msgstr "" + +#: builtins/ulimit.def:667 +#, c-format +msgid "(%s, -%c) " +msgstr "" + +#: builtins/ulimit.def:669 +#, c-format +msgid "(-%c) " +msgstr "" + +#: builtins/ulimit.def:671 +#, c-format +msgid "%-18s %16s" +msgstr "" + +#: builtins/umask.def:2 +msgid "umask" +msgstr "" + +#: builtins/umask.def:80 +msgid "Sp" +msgstr "" + +#: builtins/umask.def:110 +msgid "octal number" +msgstr "" + +#: builtins/umask.def:131 +#, c-format +msgid "umask%s " +msgstr "" + +#: builtins/umask.def:131 +msgid " -S" +msgstr "" + +#: builtins/umask.def:135 +#, c-format +msgid "%04lo\n" +msgstr "" + +#: builtins/umask.def:178 +#, c-format +msgid "u=%s,g=%s,o=%s\n" +msgstr "" + +#: builtins/umask.def:194 +msgid "agou" +msgstr "" + +#: builtins/umask.def:224 +#, c-format +msgid "`%c': invalid symbolic mode operator" +msgstr "" + +#: builtins/umask.def:229 +msgid "rwx" +msgstr "" + +#: builtins/umask.def:277 +#, c-format +msgid "`%c': invalid symbolic mode character" +msgstr "" + +#: lib/sh/clock.c:79 lib/sh/timeval.c:143 +#, c-format +msgid "%ldm%d.%03ds" +msgstr "" + +#: lib/sh/fmtulong.c:55 lib/sh/snprintf.c:167 +msgid "0123456789abcdef" +msgstr "" + +#: lib/sh/fmtulong.c:56 lib/sh/snprintf.c:168 +msgid "0123456789ABCDEF" +msgstr "" + +#: lib/sh/fmtulong.c:99 +msgid "invalid base" +msgstr "" + +#: lib/sh/getcwd.c:75 +msgid "../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.." +msgstr "" + +#: lib/sh/getcwd.c:304 +msgid "cwd: getcwd" +msgstr "" + +#: lib/sh/inet_aton.c:59 +msgid "@(#)inet_addr.c\t8.1 (Berkeley) 6/17/93" +msgstr "" + +#: lib/sh/inet_aton.c:60 +msgid "$Id: inet_addr.c,v 1.5 1996/08/14 03:48:37 drepper Exp $" +msgstr "" + +#: lib/sh/mailstat.c:95 +#, c-format +msgid "%s/cur" +msgstr "" + +#: lib/sh/mailstat.c:101 +#, c-format +msgid "%s/tmp" +msgstr "" + +#: lib/sh/mailstat.c:107 +#, c-format +msgid "%s/new" +msgstr "" + +#: lib/sh/mailstat.c:126 +msgid "cur" +msgstr "" + +#: lib/sh/mailstat.c:126 +msgid "new" +msgstr "" + +#: lib/sh/mailstat.c:127 +#, c-format +msgid "%s/" +msgstr "" + +#: lib/sh/makepath.c:77 +msgid "sh_makepath" +msgstr "" + +#: lib/sh/mktime.c:330 +#, c-format +msgid "%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d" +msgstr "" + +#: lib/sh/mktime.c:345 +msgid "mktime (" +msgstr "" + +#: lib/sh/mktime.c:347 +msgid "" +")\n" +"yields (" +msgstr "" + +#: lib/sh/mktime.c:349 +#, c-format +msgid ") == %ld, should be %ld\n" +msgstr "" + +#: lib/sh/mktime.c:367 +#, c-format +msgid "%d-%d-%d%c" +msgstr "" + +#: lib/sh/mktime.c:370 +#, c-format +msgid "%d:%d:%d%c" +msgstr "" + +#: lib/sh/mktime.c:380 +#, c-format +msgid "mktime returns %ld == " +msgstr "" + +#: lib/sh/mktime.c:410 +#, c-format +msgid "" +"Usage:\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n" +"\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n" +"\t%s FROM BY TO - # Do not test those values (for benchmark).\n" +msgstr "" + +#: lib/sh/netopen.c:128 +msgid "tcp" +msgstr "" + +#: lib/sh/netopen.c:128 +msgid "udp" +msgstr "" + +#: lib/sh/netopen.c:156 +#, c-format +msgid "%s: host unknown" +msgstr "" + +#: lib/sh/netopen.c:163 +#, c-format +msgid "%s: invalid service" +msgstr "" + +#: lib/sh/netopen.c:176 lib/sh/netopen.c:234 +msgid "socket" +msgstr "" + +#: lib/sh/netopen.c:183 lib/sh/netopen.c:246 +msgid "connect" +msgstr "" + +#: lib/sh/netopen.c:294 +#, c-format +msgid "%s: bad network path specification" +msgstr "" + +#: lib/sh/netopen.c:334 +msgid "network operations not supported" +msgstr "" + +#: lib/sh/pathphys.c:269 +msgid "sh_realpath" +msgstr "" + +#: lib/sh/shmatch.c:95 lib/sh/shmatch.c:96 +msgid "BASH_REMATCH" +msgstr "" + +#: lib/sh/snprintf.c:402 +msgid "" +msgstr "" + +#: lib/sh/snprintf.c:892 +msgid "INF" +msgstr "" + +#: lib/sh/snprintf.c:892 +msgid "NAN" +msgstr "" + +#: lib/sh/snprintf.c:893 +msgid "inf" +msgstr "" + +#: lib/sh/snprintf.c:893 +msgid "nan" +msgstr "" + +#: lib/sh/snprintf.c:1646 +msgid "out of virtual memory\n" +msgstr "" + +#: lib/sh/snprintf.c:1695 lib/sh/snprintf.c:1697 lib/sh/snprintf.c:1699 +msgid "abcde\n" +msgstr "" + +#: lib/sh/snprintf.c:1696 +#, c-format +msgid "snprintf returns %d with NULL first argument and size of 0\n" +msgstr "" + +#: lib/sh/snprintf.c:1698 +#, c-format +msgid "snprintf returns %d with non-NULL first argument and size of 0\n" +msgstr "" + +#: lib/sh/snprintf.c:1700 +#, c-format +msgid "snprintf returns %d with NULL first argument and non-zero size\n" +msgstr "" + +#: lib/sh/snprintf.c:1710 +#, c-format +msgid "/%%ld %%ld/, 336, 336\n" +msgstr "" + +#: lib/sh/snprintf.c:1711 lib/sh/snprintf.c:1712 lib/sh/snprintf.c:1713 +#, c-format +msgid "/%ld %ld/\n" +msgstr "" + +#: lib/sh/snprintf.c:1717 +#, c-format +msgid "/%%d/, 336\n" +msgstr "" + +#: lib/sh/snprintf.c:1718 lib/sh/snprintf.c:1719 lib/sh/snprintf.c:1720 +#, c-format +msgid "/%d/\n" +msgstr "" + +#: lib/sh/snprintf.c:1724 +#, c-format +msgid "/%%2d/, 336\n" +msgstr "" + +#: lib/sh/snprintf.c:1725 lib/sh/snprintf.c:1726 lib/sh/snprintf.c:1727 +#, c-format +msgid "/%2d/\n" +msgstr "" + +#: lib/sh/snprintf.c:1731 +#, c-format +msgid "/%%10d/, 336\n" +msgstr "" + +#: lib/sh/snprintf.c:1732 lib/sh/snprintf.c:1733 lib/sh/snprintf.c:1734 +#, c-format +msgid "/%10d/\n" +msgstr "" + +#: lib/sh/snprintf.c:1738 +#, c-format +msgid "/%%-10d/, 336\n" +msgstr "" + +#: lib/sh/snprintf.c:1739 lib/sh/snprintf.c:1740 lib/sh/snprintf.c:1741 +#, c-format +msgid "/%-10d/\n" +msgstr "" + +#: lib/sh/snprintf.c:1748 +#, c-format +msgid "/%%f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1749 lib/sh/snprintf.c:1750 lib/sh/snprintf.c:1751 +#, c-format +msgid "/%f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1755 +#, c-format +msgid "/%%e/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1756 lib/sh/snprintf.c:1757 lib/sh/snprintf.c:1758 +#, c-format +msgid "/%e/\n" +msgstr "" + +#: lib/sh/snprintf.c:1762 +#, c-format +msgid "/%%4.2f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1763 lib/sh/snprintf.c:1764 lib/sh/snprintf.c:1765 +#, c-format +msgid "/%4.2f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1769 +#, c-format +msgid "/%%3.1f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1770 lib/sh/snprintf.c:1771 lib/sh/snprintf.c:1772 +#, c-format +msgid "/%3.1f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1776 +#, c-format +msgid "/%%10.3f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1777 lib/sh/snprintf.c:1778 lib/sh/snprintf.c:1779 +#, c-format +msgid "/%10.3f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1783 +#, c-format +msgid "/%%10.3e/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1784 lib/sh/snprintf.c:1785 lib/sh/snprintf.c:1786 +#, c-format +msgid "/%10.3e/\n" +msgstr "" + +#: lib/sh/snprintf.c:1790 +#, c-format +msgid "/%%+4.2f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1791 lib/sh/snprintf.c:1792 lib/sh/snprintf.c:1793 +#, c-format +msgid "/%+4.2f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1797 +#, c-format +msgid "/%%010.2f/, 1234.56\n" +msgstr "" + +#: lib/sh/snprintf.c:1798 lib/sh/snprintf.c:1799 lib/sh/snprintf.c:1800 +#, c-format +msgid "/%010.2f/\n" +msgstr "" + +#: lib/sh/snprintf.c:1804 +msgid "Outstanding acting !" +msgstr "" + +#: lib/sh/snprintf.c:1807 +#, c-format +msgid "/%%2s/, \"%s\"\n" +msgstr "" + +#: lib/sh/snprintf.c:1808 lib/sh/snprintf.c:1809 lib/sh/snprintf.c:1810 +#, c-format +msgid "/%2s/\n" +msgstr "" + +#: lib/sh/snprintf.c:1814 +#, c-format +msgid "/%%22s/ %s\n" +msgstr "" + +#: lib/sh/snprintf.c:1815 lib/sh/snprintf.c:1816 lib/sh/snprintf.c:1817 +#, c-format +msgid "/%22s/\n" +msgstr "" + +#: lib/sh/snprintf.c:1821 +#, c-format +msgid "/%%22.5s/ %s\n" +msgstr "" + +#: lib/sh/snprintf.c:1822 lib/sh/snprintf.c:1823 lib/sh/snprintf.c:1824 +#, c-format +msgid "/%22.5s/\n" +msgstr "" + +#: lib/sh/snprintf.c:1828 +#, c-format +msgid "/%%-22.5s/ %s\n" +msgstr "" + +#: lib/sh/snprintf.c:1829 lib/sh/snprintf.c:1830 lib/sh/snprintf.c:1831 +#, c-format +msgid "/%-22.5s/\n" +msgstr "" + +#: lib/sh/snprintf.c:1837 +#, c-format +msgid "%%x %%X %%#x, 31, 31, 31\n" +msgstr "" + +#: lib/sh/snprintf.c:1838 lib/sh/snprintf.c:1839 lib/sh/snprintf.c:1840 +#, c-format +msgid "%x %X %#x\n" +msgstr "" + +#: lib/sh/snprintf.c:1844 +#, c-format +msgid "**%%d**%% d**%% d**, 42, 42, -42\n" +msgstr "" + +#: lib/sh/snprintf.c:1845 lib/sh/snprintf.c:1846 lib/sh/snprintf.c:1847 +#, c-format +msgid "**%d**% d**% d**\n" +msgstr "" + +#: lib/sh/snprintf.c:1853 +#, c-format +msgid "/%%g/, 31.4\n" +msgstr "" + +#: lib/sh/snprintf.c:1854 lib/sh/snprintf.c:1855 lib/sh/snprintf.c:1856 +#: lib/sh/snprintf.c:1975 lib/sh/snprintf.c:1976 lib/sh/snprintf.c:1977 +#: lib/sh/snprintf.c:1982 lib/sh/snprintf.c:1983 lib/sh/snprintf.c:1984 +#, c-format +msgid "/%g/\n" +msgstr "" + +#: lib/sh/snprintf.c:1860 +#, c-format +msgid "/%%.6g/, 31.4\n" +msgstr "" + +#: lib/sh/snprintf.c:1861 lib/sh/snprintf.c:1862 lib/sh/snprintf.c:1863 +#, c-format +msgid "/%.6g/\n" +msgstr "" + +#: lib/sh/snprintf.c:1867 +#, c-format +msgid "/%%.1G/, 31.4\n" +msgstr "" + +#: lib/sh/snprintf.c:1868 lib/sh/snprintf.c:1869 lib/sh/snprintf.c:1870 +#: lib/sh/snprintf.c:1875 lib/sh/snprintf.c:1876 lib/sh/snprintf.c:1877 +#, c-format +msgid "/%.1G/\n" +msgstr "" + +#: lib/sh/snprintf.c:1874 +#, c-format +msgid "/%%.1G/, 3100000000.4\n" +msgstr "" + +#: lib/sh/snprintf.c:1881 +#, c-format +msgid "abc%%n\n" +msgstr "" + +#: lib/sh/snprintf.c:1882 lib/sh/snprintf.c:1883 lib/sh/snprintf.c:1885 +#, c-format +msgid "abc%n" +msgstr "" + +#: lib/sh/snprintf.c:1884 lib/sh/snprintf.c:1886 +#, c-format +msgid "" +"%d\n" +"\n" +msgstr "" + +#: lib/sh/snprintf.c:1888 +#, c-format +msgid "%%*.*s --> 10.10\n" +msgstr "" + +#: lib/sh/snprintf.c:1889 lib/sh/snprintf.c:1890 lib/sh/snprintf.c:1891 +#, c-format +msgid "%*.*s\n" +msgstr "" + +#: lib/sh/snprintf.c:1895 +#, c-format +msgid "%%%%%%%%\n" +msgstr "" + +#: lib/sh/snprintf.c:1896 lib/sh/snprintf.c:1897 lib/sh/snprintf.c:1898 +#, c-format +msgid "%%%%\n" +msgstr "" + +#: lib/sh/snprintf.c:1902 +msgid "Hello this is a too big string for the buffer" +msgstr "" + +#: lib/sh/snprintf.c:1904 +#, c-format +msgid "<%%>, %s\n" +msgstr "" + +#: lib/sh/snprintf.c:1907 lib/sh/snprintf.c:1908 lib/sh/snprintf.c:1915 +#: lib/sh/snprintf.c:1922 lib/sh/snprintf.c:1930 lib/sh/snprintf.c:1939 +#: lib/sh/snprintf.c:1948 lib/sh/snprintf.c:1955 +#, c-format +msgid "<%s>\n" +msgstr "" + +#: lib/sh/snprintf.c:1909 lib/sh/snprintf.c:1916 lib/sh/snprintf.c:1923 +#: lib/sh/snprintf.c:1931 lib/sh/snprintf.c:1940 lib/sh/snprintf.c:1949 +#: lib/sh/snprintf.c:1956 +#, c-format +msgid "" +"<%s>\n" +"\n" +msgstr "" + +#: lib/sh/snprintf.c:1911 +#, c-format +msgid "<%%p> vsnprintf\n" +msgstr "" + +#: lib/sh/snprintf.c:1912 lib/sh/snprintf.c:1913 +#, c-format +msgid "%p" +msgstr "" + +#: lib/sh/snprintf.c:1914 +#, c-format +msgid "<%p>\n" +msgstr "" + +#: lib/sh/snprintf.c:1918 +#, c-format +msgid "<%%lu> LONG_MAX+1\n" +msgstr "" + +#: lib/sh/snprintf.c:1919 lib/sh/snprintf.c:1920 +#, c-format +msgid "%lu" +msgstr "" + +#: lib/sh/snprintf.c:1921 +#, c-format +msgid "<%lu>\n" +msgstr "" + +#: lib/sh/snprintf.c:1926 +#, c-format +msgid "<%%llu> LLONG_MAX+1\n" +msgstr "" + +#: lib/sh/snprintf.c:1927 lib/sh/snprintf.c:1928 +#, c-format +msgid "%llu" +msgstr "" + +#: lib/sh/snprintf.c:1929 +#, c-format +msgid "<%llu>\n" +msgstr "" + +#: lib/sh/snprintf.c:1935 +#, c-format +msgid "<%%6.2LE> 42.42\n" +msgstr "" + +#: lib/sh/snprintf.c:1936 lib/sh/snprintf.c:1937 +#, c-format +msgid "%6.2LE" +msgstr "" + +#: lib/sh/snprintf.c:1938 +#, c-format +msgid "<%6.2LE>\n" +msgstr "" + +#: lib/sh/snprintf.c:1944 +#, c-format +msgid "<%%6.2A> 42.42\n" +msgstr "" + +#: lib/sh/snprintf.c:1945 lib/sh/snprintf.c:1946 +#, c-format +msgid "%6.2A" +msgstr "" + +#: lib/sh/snprintf.c:1947 +#, c-format +msgid "<%6.2A>\n" +msgstr "" + +#: lib/sh/snprintf.c:1951 +#, c-format +msgid "<%%6.2LA> 42.42\n" +msgstr "" + +#: lib/sh/snprintf.c:1952 lib/sh/snprintf.c:1953 +#, c-format +msgid "%6.2LA" +msgstr "" + +#: lib/sh/snprintf.c:1954 +#, c-format +msgid "<%6.2LA>\n" +msgstr "" + +#: lib/sh/snprintf.c:1959 +#, c-format +msgid "<%%.10240f> DBL_MAX\n" +msgstr "" + +#: lib/sh/snprintf.c:1960 lib/sh/snprintf.c:1961 +#, c-format +msgid "%.10240f" +msgstr "" + +#: lib/sh/snprintf.c:1962 +#, c-format +msgid "<%.10240f>\n" +msgstr "" + +#: lib/sh/snprintf.c:1963 lib/sh/snprintf.c:1970 +#, c-format +msgid "<%d> <%s>\n" +msgstr "" + +#: lib/sh/snprintf.c:1964 lib/sh/snprintf.c:1971 +#, c-format +msgid "" +"<%d> <%s>\n" +"\n" +msgstr "" + +#: lib/sh/snprintf.c:1966 +#, c-format +msgid "<%%.10240Lf> LDBL_MAX\n" +msgstr "" + +#: lib/sh/snprintf.c:1967 lib/sh/snprintf.c:1968 +#, c-format +msgid "%.10240Lf" +msgstr "" + +#: lib/sh/snprintf.c:1969 +#, c-format +msgid "<%.10240Lf>\n" +msgstr "" + +#: lib/sh/snprintf.c:1974 +#, c-format +msgid "/%%g/, 421.2345\n" +msgstr "" + +#: lib/sh/snprintf.c:1981 +#, c-format +msgid "/%%g/, 4214.2345\n" +msgstr "" + +#: lib/sh/snprintf.c:1988 +#, c-format +msgid "/%%.5g/, 4214.2345\n" +msgstr "" + +#: lib/sh/snprintf.c:1989 lib/sh/snprintf.c:1990 lib/sh/snprintf.c:1991 +#, c-format +msgid "/%.5g/\n" +msgstr "" + +#: lib/sh/snprintf.c:1995 +#, c-format +msgid "/%%.4g/, 4214.2345\n" +msgstr "" + +#: lib/sh/snprintf.c:1996 lib/sh/snprintf.c:1997 lib/sh/snprintf.c:1998 +#, c-format +msgid "/%.4g/\n" +msgstr "" + +#: lib/sh/snprintf.c:2002 +#, c-format +msgid "/%%'ld %%'ld/, 12345, 1234567\n" +msgstr "" + +#: lib/sh/snprintf.c:2003 lib/sh/snprintf.c:2004 lib/sh/snprintf.c:2005 +#: lib/sh/snprintf.c:2010 lib/sh/snprintf.c:2011 lib/sh/snprintf.c:2012 +#: lib/sh/snprintf.c:2017 lib/sh/snprintf.c:2018 lib/sh/snprintf.c:2019 +#, c-format +msgid "/%'ld %'ld/\n" +msgstr "" + +#: lib/sh/snprintf.c:2009 +#, c-format +msgid "/%%'ld %%'ld/, 336, 3336\n" +msgstr "" + +#: lib/sh/snprintf.c:2016 +#, c-format +msgid "/%%'ld %%'ld/, -42786, -142786\n" +msgstr "" + +#: lib/sh/snprintf.c:2023 +#, c-format +msgid "/%%'f %%'f/, 421.2345, 421234.56789\n" +msgstr "" + +#: lib/sh/snprintf.c:2024 lib/sh/snprintf.c:2025 lib/sh/snprintf.c:2026 +#: lib/sh/snprintf.c:2031 lib/sh/snprintf.c:2032 lib/sh/snprintf.c:2033 +#, c-format +msgid "/%'f %'f/\n" +msgstr "" + +#: lib/sh/snprintf.c:2030 +#, c-format +msgid "/%%'f %%'f/, -421.2345, -421234.56789\n" +msgstr "" + +#: lib/sh/snprintf.c:2037 +#, c-format +msgid "/%%'g %%'g/, 421.2345, 421234.56789\n" +msgstr "" + +#: lib/sh/snprintf.c:2038 lib/sh/snprintf.c:2039 lib/sh/snprintf.c:2040 +#: lib/sh/snprintf.c:2045 lib/sh/snprintf.c:2046 lib/sh/snprintf.c:2047 +#, c-format +msgid "/%'g %'g/\n" +msgstr "" + +#: lib/sh/snprintf.c:2044 +#, c-format +msgid "/%%'g %%'g/, -421.2345, -421234.56789\n" +msgstr "" + +#: lib/sh/snprintf.c:2052 +#, c-format +msgid "/%%'g/, 4213455.8392\n" +msgstr "" + +#: lib/sh/snprintf.c:2053 lib/sh/snprintf.c:2054 lib/sh/snprintf.c:2055 +#, c-format +msgid "/%'g/\n" +msgstr "" + +#: lib/sh/strerror.c:49 +msgid "Unknown system error " +msgstr "" + +#: lib/sh/strftime.c:153 +msgid "Sun" +msgstr "" + +#: lib/sh/strftime.c:153 +msgid "Mon" +msgstr "" + +#: lib/sh/strftime.c:153 +msgid "Tue" +msgstr "" + +#: lib/sh/strftime.c:153 +msgid "Wed" +msgstr "" + +#: lib/sh/strftime.c:154 +msgid "Thu" +msgstr "" + +#: lib/sh/strftime.c:154 +msgid "Fri" +msgstr "" + +#: lib/sh/strftime.c:154 +msgid "Sat" +msgstr "" + +#: lib/sh/strftime.c:157 +msgid "Sunday" +msgstr "" + +#: lib/sh/strftime.c:157 +msgid "Monday" +msgstr "" + +#: lib/sh/strftime.c:157 +msgid "Tuesday" +msgstr "" + +#: lib/sh/strftime.c:157 +msgid "Wednesday" +msgstr "" + +#: lib/sh/strftime.c:158 +msgid "Thursday" +msgstr "" + +#: lib/sh/strftime.c:158 +msgid "Friday" +msgstr "" + +#: lib/sh/strftime.c:158 +msgid "Saturday" +msgstr "" + +#: lib/sh/strftime.c:161 +msgid "Jan" +msgstr "" + +#: lib/sh/strftime.c:161 +msgid "Feb" +msgstr "" + +#: lib/sh/strftime.c:161 +msgid "Mar" +msgstr "" + +#: lib/sh/strftime.c:161 +msgid "Apr" +msgstr "" + +#: lib/sh/strftime.c:161 lib/sh/strftime.c:166 +msgid "May" +msgstr "" + +#: lib/sh/strftime.c:161 +msgid "Jun" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Jul" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Aug" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Sep" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Oct" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Nov" +msgstr "" + +#: lib/sh/strftime.c:162 +msgid "Dec" +msgstr "" + +#: lib/sh/strftime.c:165 +msgid "January" +msgstr "" + +#: lib/sh/strftime.c:165 +msgid "February" +msgstr "" + +#: lib/sh/strftime.c:165 +msgid "March" +msgstr "" + +#: lib/sh/strftime.c:165 +msgid "April" +msgstr "" + +#: lib/sh/strftime.c:166 +msgid "June" +msgstr "" + +#: lib/sh/strftime.c:166 +msgid "July" +msgstr "" + +#: lib/sh/strftime.c:166 +msgid "August" +msgstr "" + +#: lib/sh/strftime.c:166 +msgid "September" +msgstr "" + +#: lib/sh/strftime.c:167 +msgid "October" +msgstr "" + +#: lib/sh/strftime.c:167 +msgid "November" +msgstr "" + +#: lib/sh/strftime.c:167 +msgid "December" +msgstr "" + +#: lib/sh/strftime.c:169 +msgid "AM" +msgstr "" + +#: lib/sh/strftime.c:169 +msgid "PM" +msgstr "" + +#: lib/sh/strftime.c:270 +msgid "%A %B %d %T %Y" +msgstr "" + +#: lib/sh/strftime.c:275 lib/sh/strftime.c:280 lib/sh/strftime.c:321 +#: lib/sh/strftime.c:329 lib/sh/strftime.c:338 lib/sh/strftime.c:347 +#: lib/sh/strftime.c:352 lib/sh/strftime.c:393 lib/sh/strftime.c:413 +#: lib/sh/strftime.c:417 lib/sh/strftime.c:426 lib/sh/strftime.c:440 +#, c-format +msgid "%02d" +msgstr "" + +#: lib/sh/strftime.c:284 +msgid "%m/%d/%y" +msgstr "" + +#: lib/sh/strftime.c:288 lib/sh/strftime.c:519 lib/sh/strftime.c:528 +#, c-format +msgid "%2d" +msgstr "" + +#: lib/sh/strftime.c:296 +msgid "%Y-%m-%d" +msgstr "" + +#: lib/sh/strftime.c:342 +#, c-format +msgid "%03d" +msgstr "" + +#: lib/sh/strftime.c:373 +msgid "%I:%M:%S %p" +msgstr "" + +#: lib/sh/strftime.c:386 lib/malloc/stats.c:181 +#, c-format +msgid "%ld" +msgstr "" + +#: lib/sh/strftime.c:430 +msgid "%A %B %d %Y" +msgstr "" + +#: lib/sh/strftime.c:495 +#, c-format +msgid "%02d%02d" +msgstr "" + +#: lib/sh/strftime.c:544 +#, c-format +msgid "%2d-%3.3s-%4d" +msgstr "" + +#: lib/sh/strftime.c:786 +#, c-format +msgid "(%%A) full weekday name, var length (Sunday..Saturday) %A" +msgstr "" + +#: lib/sh/strftime.c:787 +msgid "(%%B) full month name, var length (January..December) %B" +msgstr "" + +#: lib/sh/strftime.c:788 +#, c-format +msgid "(%%C) Century %C" +msgstr "" + +#: lib/sh/strftime.c:789 +msgid "(%%D) date (%%m/%%d/%%y) %D" +msgstr "" + +#: lib/sh/strftime.c:790 +#, c-format +msgid "(%%E) Locale extensions (ignored) %E" +msgstr "" + +#: lib/sh/strftime.c:791 +#, c-format +msgid "(%%F) full month name, var length (January..December) %F" +msgstr "" + +#: lib/sh/strftime.c:792 +msgid "(%%H) hour (24-hour clock, 00..23) %H" +msgstr "" + +#: lib/sh/strftime.c:793 +msgid "(%%I) hour (12-hour clock, 01..12) %I" +msgstr "" + +#: lib/sh/strftime.c:794 +msgid "(%%M) minute (00..59) %M" +msgstr "" + +#: lib/sh/strftime.c:795 +msgid "(%%N) Emporer/Era Name %N" +msgstr "" + +#: lib/sh/strftime.c:796 +msgid "(%%O) Locale extensions (ignored) %O" +msgstr "" + +#: lib/sh/strftime.c:797 +msgid "(%%R) time, 24-hour (%%H:%%M) %R" +msgstr "" + +#: lib/sh/strftime.c:798 +#, c-format +msgid "(%%S) second (00..60) %S" +msgstr "" + +#: lib/sh/strftime.c:799 +msgid "(%%T) time, 24-hour (%%H:%%M:%%S) %T" +msgstr "" + +#: lib/sh/strftime.c:800 +msgid "(%%U) week of year, Sunday as first day of week (00..53) %U" +msgstr "" + +#: lib/sh/strftime.c:801 +msgid "(%%V) week of year according to ISO 8601 %V" +msgstr "" + +#: lib/sh/strftime.c:802 +msgid "(%%W) week of year, Monday as first day of week (00..53) %W" +msgstr "" + +#: lib/sh/strftime.c:803 +msgid "(%%X) appropriate locale time representation (%H:%M:%S) %X" +msgstr "" + +#: lib/sh/strftime.c:804 +msgid "(%%Y) year with century (1970...) %Y" +msgstr "" + +#: lib/sh/strftime.c:805 +msgid "(%%Z) timezone (EDT), or blank if timezone not determinable %Z" +msgstr "" + +#: lib/sh/strftime.c:806 +#, c-format +msgid "(%%a) locale's abbreviated weekday name (Sun..Sat) %a" +msgstr "" + +#: lib/sh/strftime.c:807 +msgid "(%%b) locale's abbreviated month name (Jan..Dec) %b" +msgstr "" + +#: lib/sh/strftime.c:808 +msgid "(%%c) full date (Sat Nov 4 12:02:33 1989)%n%t%t%t %c" +msgstr "" + +#: lib/sh/strftime.c:809 +#, c-format +msgid "(%%d) day of the month (01..31) %d" +msgstr "" + +#: lib/sh/strftime.c:810 +#, c-format +msgid "(%%e) day of the month, blank-padded ( 1..31) %e" +msgstr "" + +#: lib/sh/strftime.c:811 +msgid "(%%h) should be same as (%%b) %h" +msgstr "" + +#: lib/sh/strftime.c:812 +msgid "(%%j) day of the year (001..366) %j" +msgstr "" + +#: lib/sh/strftime.c:813 +msgid "(%%k) hour, 24-hour clock, blank pad ( 0..23) %k" +msgstr "" + +#: lib/sh/strftime.c:814 +msgid "(%%l) hour, 12-hour clock, blank pad ( 0..12) %l" +msgstr "" + +#: lib/sh/strftime.c:815 +#, c-format +msgid "(%%m) month (01..12) %m" +msgstr "" + +#: lib/sh/strftime.c:816 +#, c-format +msgid "(%%o) Emporer/Era Year %o" +msgstr "" + +#: lib/sh/strftime.c:817 +#, c-format +msgid "(%%p) locale's AM or PM based on 12-hour clock %p" +msgstr "" + +#: lib/sh/strftime.c:818 +msgid "(%%r) time, 12-hour (same as %%I:%%M:%%S %%p) %r" +msgstr "" + +#: lib/sh/strftime.c:819 +#, c-format +msgid "(%%u) ISO 8601: Weekday as decimal number [1 (Monday) - 7] %u" +msgstr "" + +#: lib/sh/strftime.c:820 +msgid "(%%v) VMS date (dd-bbb-YYYY) %v" +msgstr "" + +#: lib/sh/strftime.c:821 +msgid "(%%w) day of week (0..6, Sunday == 0) %w" +msgstr "" + +#: lib/sh/strftime.c:822 +#, c-format +msgid "(%%x) appropriate locale date representation %x" +msgstr "" + +#: lib/sh/strftime.c:823 +msgid "(%%y) last two digits of year (00..99) %y" +msgstr "" + +#: lib/sh/strftime.c:824 +msgid "(%%z) timezone offset east of GMT as HHMM (e.g. -0500) %z" +msgstr "" + +#: lib/sh/stringlist.c:235 +#, c-format +msgid "%s%s\n" +msgstr "" + +#: lib/sh/strtoimax.c:38 lib/sh/strtoimax.c:45 lib/sh/strtoumax.c:38 +#: lib/sh/strtoumax.c:45 +msgid "this configure-time declaration test was not run" +msgstr "" + +#: lib/sh/strtoimax.c:83 +#, c-format +msgid "sizeof intmax_t: %d\n" +msgstr "" + +#: lib/sh/strtoimax.c:86 +#, c-format +msgid "sizeof long long: %d\n" +msgstr "" + +#: lib/sh/strtoimax.c:88 +#, c-format +msgid "sizeof long: %d\n" +msgstr "" + +#: lib/sh/strtoimax.c:98 +#, c-format +msgid "%lld %lld %ld\n" +msgstr "" + +#: lib/sh/strtoumax.c:83 +#, c-format +msgid "sizeof uintmax_t: %d\n" +msgstr "" + +#: lib/sh/strtoumax.c:86 +#, c-format +msgid "sizeof unsigned long long: %d\n" +msgstr "" + +#: lib/sh/strtoumax.c:88 +#, c-format +msgid "sizeof unsigned long: %d\n" +msgstr "" + +#: lib/sh/strtoumax.c:98 +#, c-format +msgid "%llu %llu %lu\n" +msgstr "" + +#: lib/sh/tmpfile.c:46 +msgid "shtmp" +msgstr "" + +#: lib/sh/tmpfile.c:73 +msgid "/var/tmp" +msgstr "" + +#: lib/sh/tmpfile.c:77 +msgid "/usr/tmp" +msgstr "" + +#: lib/sh/tmpfile.c:92 +msgid "TMPDIR" +msgstr "" + +#: lib/sh/tmpfile.c:122 lib/sh/tmpfile.c:167 +#, c-format +msgid "%s/%s.XXXXXX" +msgstr "" + +#: lib/sh/tmpfile.c:135 lib/sh/tmpfile.c:184 +#, c-format +msgid "%s/%s-%lu" +msgstr "" + +#: lib/sh/tmpfile.c:212 +msgid "w+" +msgstr "" + +#: lib/malloc/alloca.c:446 +#, c-format +msgid "%011o %011o %011o\n" +msgstr "" + +#: lib/malloc/alloca.c:467 +#, c-format +msgid "%011o %011o\n" +msgstr "" + +#: lib/malloc/i386-alloca.s:1 +msgid "alloca.s" +msgstr "" + +#: lib/malloc/imalloc.h:52 +msgid "x" +msgstr "" + +#: lib/malloc/malloc.c:298 +#, c-format +msgid "malloc: failed assertion: %s\n" +msgstr "" + +#: lib/malloc/malloc.c:314 +#, c-format +msgid "" +"\r\n" +"malloc: %s:%d: assertion botched\r\n" +msgstr "" + +#: lib/malloc/malloc.c:355 +msgid "bcoalesce: CHAIN(mp2) != mp1" +msgstr "" + +#: lib/malloc/malloc.c:604 +msgid "malloc_debug_dummy\n" +msgstr "" + +#: lib/malloc/malloc.c:740 +msgid "malloc: block on free list clobbered" +msgstr "" + +#: lib/malloc/malloc.c:766 lib/malloc/malloc.c:768 lib/malloc/malloc.c:773 +msgid "malloc" +msgstr "" + +#: lib/malloc/malloc.c:817 +msgid "free: called with already freed block argument" +msgstr "" + +#: lib/malloc/malloc.c:820 +msgid "free: called with unallocated block argument" +msgstr "" + +#: lib/malloc/malloc.c:839 +msgid "free: underflow detected; mh_nbytes out of range" +msgstr "" + +#: lib/malloc/malloc.c:845 +msgid "free: start and end chunk sizes differ" +msgstr "" + +#: lib/malloc/malloc.c:942 +msgid "realloc: called with unallocated block argument" +msgstr "" + +#: lib/malloc/malloc.c:957 +msgid "realloc: underflow detected; mh_nbytes out of range" +msgstr "" + +#: lib/malloc/malloc.c:963 +msgid "realloc: start and end chunk sizes differ" +msgstr "" + +#: lib/malloc/malloc.c:1009 lib/malloc/malloc.c:1011 lib/malloc/malloc.c:1016 +msgid "realloc" +msgstr "" + +#: lib/malloc/memtest.c:125 lib/malloc/memtest.c:138 +msgid "malloc-test: " +msgstr "" + +#: lib/malloc/stats.c:99 +#, c-format +msgid "" +"Memory allocation statistics: %s\n" +" size\tfree\tin use\ttotal\tmorecore lesscore split\tcoalesce\n" +msgstr "" + +#: lib/malloc/stats.c:104 +#, c-format +msgid "%8lu\t%4d\t%6d\t%5d\t%8d\t%d %5d %8d\n" +msgstr "" + +#: lib/malloc/stats.c:108 +#, c-format +msgid "" +"\n" +"Total bytes in use: %lu, total bytes free: %lu\n" +msgstr "" + +#: lib/malloc/stats.c:110 +#, c-format +msgid "" +"\n" +"Total bytes requested by application: %lu\n" +msgstr "" + +#: lib/malloc/stats.c:111 +#, c-format +msgid "Total mallocs: %d, total frees: %d, total reallocs: %d (%d copies)\n" +msgstr "" + +#: lib/malloc/stats.c:113 +#, c-format +msgid "Total sbrks: %d, total bytes via sbrk: %d\n" +msgstr "" + +#: lib/malloc/stats.c:115 +#, c-format +msgid "Total blocks split: %d, total block coalesces: %d\n" +msgstr "" + +#: lib/malloc/stats.c:134 +msgid "/var/tmp/maltrace/stats." +msgstr "" + +#: lib/malloc/stats.c:172 +#, c-format +msgid "%s%ld" +msgstr "" + +#: lib/malloc/table.c:152 +#, c-format +msgid "malloc: %p: %s: last %s from %s:%d\n" +msgstr "" + +#: lib/malloc/table.c:154 lib/malloc/table.c:155 lib/malloc/table.c:239 +#: lib/malloc/watch.c:46 +msgid "allocated" +msgstr "" + +#: lib/malloc/table.c:154 lib/malloc/table.c:222 lib/malloc/table.c:237 +msgid "free" +msgstr "" + +#: lib/malloc/table.c:155 lib/malloc/watch.c:48 +msgid "freed" +msgstr "" + +#: lib/malloc/table.c:175 +msgid "register_alloc: alloc table is full with FIND_ALLOC?\n" +msgstr "" + +#: lib/malloc/table.c:182 +#, c-format +msgid "register_alloc: %p already in table as allocated?\n" +msgstr "" + +#: lib/malloc/table.c:211 +#, c-format +msgid "register_free: %p not in allocation table?\n" +msgstr "" + +#: lib/malloc/table.c:218 +#, c-format +msgid "register_free: %p already in table as free?\n" +msgstr "" + +#: lib/malloc/table.c:241 +msgid "undetermined?" +msgstr "" + +#: lib/malloc/table.c:255 +#, c-format +msgid "[%d] %p:%d:%s:%s:%s:%d:%d:%d\n" +msgstr "" + +#: lib/malloc/trace.c:51 +#, c-format +msgid "alloc: %s: %p (%d bytes) from '%s:%d'\n" +msgstr "" + +#: lib/malloc/trace.c:54 +#, c-format +msgid "alloc:%p:%d:%s:%d\n" +msgstr "" + +#: lib/malloc/trace.c:69 +#, c-format +msgid "free: %p (%d bytes) from '%s:%d'\n" +msgstr "" + +#: lib/malloc/trace.c:72 +#, c-format +msgid "free:%p:%d:%s:%d\n" +msgstr "" + +#: lib/malloc/trace.c:107 +msgid "/var/tmp/maltrace/trace." +msgstr "" + +#: lib/malloc/watch.c:50 +msgid "requesting resize" +msgstr "" + +#: lib/malloc/watch.c:52 +msgid "just resized" +msgstr "" + +#: lib/malloc/watch.c:54 +msgid "bug: unknown operation" +msgstr "" + +#: lib/malloc/watch.c:56 +#, c-format +msgid "malloc: watch alert: %p %s " +msgstr "" + +#: lib/malloc/watch.c:58 +#, c-format +msgid "(size %lu) " +msgstr "" + +#: lib/malloc/watch.c:59 +#, c-format +msgid "from '%s:%d'\n" +msgstr "" + +#: lib/malloc/x386-alloca.s:10 +msgid "masm" +msgstr "" + +#: lib/malloc/xmalloc.c:55 +#, c-format +msgid "%s: out of virtual memory\n" +msgstr "" + +#: lib/malloc/xmalloc.c:70 +msgid "xmalloc" +msgstr "" + +#: lib/malloc/xmalloc.c:84 +msgid "xrealloc" +msgstr "" diff --git a/subst.c.orig b/subst.c.orig new file mode 100644 index 00000000..011930b3 --- /dev/null +++ b/subst.c.orig @@ -0,0 +1,7376 @@ +/* subst.c -- The part of the shell that does parameter, command, and + globbing substitutions. */ + +/* ``Have a little faith, there's magic in the night. You ain't a + beauty, but, hey, you're alright.'' */ + +/* Copyright (C) 1987-2004 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#include "config.h" + +#include "bashtypes.h" +#include +#include "chartypes.h" +#include +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "bashansi.h" +#include "posixstat.h" +#include "bashintl.h" + +#include "shell.h" +#include "flags.h" +#include "jobs.h" +#include "execute_cmd.h" +#include "filecntl.h" +#include "trap.h" +#include "pathexp.h" +#include "mailcheck.h" + +#include "shmbutil.h" + +#include "builtins/getopt.h" +#include "builtins/common.h" + +#include +#include + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +/* The size that strings change by. */ +#define DEFAULT_INITIAL_ARRAY_SIZE 112 +#define DEFAULT_ARRAY_SIZE 128 + +/* Variable types. */ +#define VT_VARIABLE 0 +#define VT_POSPARMS 1 +#define VT_ARRAYVAR 2 +#define VT_ARRAYMEMBER 3 + +#define VT_STARSUB 128 /* $* or ${array[*]} -- used to split */ + +/* Flags for quoted_strchr */ +#define ST_BACKSL 0x01 +#define ST_CTLESC 0x02 +#define ST_SQUOTE 0x04 /* unused yet */ +#define ST_DQUOTE 0x08 /* unused yet */ + +/* Flags for the string extraction functions. */ +#define EX_NOALLOC 0x01 /* just skip; don't return substring */ +#define EX_VARNAME 0x02 /* variable name; for string_extract () */ + +/* Flags for the `pflags' argument to param_expand() */ +#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */ + +/* These defs make it easier to use the editor. */ +#define LBRACE '{' +#define RBRACE '}' +#define LPAREN '(' +#define RPAREN ')' + +/* Evaluates to 1 if C is one of the shell's special parameters whose length + can be taken, but is also one of the special expansion characters. */ +#define VALID_SPECIAL_LENGTH_PARAM(c) \ + ((c) == '-' || (c) == '?' || (c) == '#') + +/* Evaluates to 1 if C is one of the shell's special parameters for which an + indirect variable reference may be made. */ +#define VALID_INDIR_PARAM(c) \ + ((c) == '#' || (c) == '?' || (c) == '@' || (c) == '*') + +/* Evaluates to 1 if C is one of the OP characters that follows the parameter + in ${parameter[:]OPword}. */ +#define VALID_PARAM_EXPAND_CHAR(c) (sh_syntaxtab[(unsigned char)c] & CSUBSTOP) + +/* Evaluates to 1 if this is one of the shell's special variables. */ +#define SPECIAL_VAR(name, wi) \ + ((DIGIT (*name) && all_digits (name)) || \ + (name[1] == '\0' && (sh_syntaxtab[(unsigned char)*name] & CSPECVAR)) || \ + (wi && name[2] == '\0' && VALID_INDIR_PARAM (name[1]))) + +/* An expansion function that takes a string and a quoted flag and returns + a WORD_LIST *. Used as the type of the third argument to + expand_string_if_necessary(). */ +typedef WORD_LIST *EXPFUNC __P((char *, int)); + +/* Process ID of the last command executed within command substitution. */ +pid_t last_command_subst_pid = NO_PID; +pid_t current_command_subst_pid = NO_PID; + +/* Variables used to keep track of the characters in IFS. */ +SHELL_VAR *ifs_var; +char *ifs_value; +unsigned char ifs_cmap[UCHAR_MAX + 1]; +unsigned char ifs_firstc; + +/* Extern functions and variables from different files. */ +extern int last_command_exit_value, last_command_exit_signal; +extern int subshell_environment; +extern int subshell_level; +extern int eof_encountered; +extern int return_catch_flag, return_catch_value; +extern pid_t dollar_dollar_pid; +extern int posixly_correct; +extern char *this_command_name; +extern struct fd_bitmap *current_fds_to_close; +extern int wordexp_only; +extern int expanding_redir; + +/* Non-zero means to allow unmatched globbed filenames to expand to + a null file. */ +int allow_null_glob_expansion; + +/* Non-zero means to throw an error when globbing fails to match anything. */ +int fail_glob_expansion; + +#if 0 +/* Variables to keep track of which words in an expanded word list (the + output of expand_word_list_internal) are the result of globbing + expansions. GLOB_ARGV_FLAGS is used by execute_cmd.c. + (CURRENTLY UNUSED). */ +char *glob_argv_flags; +static int glob_argv_flags_size; +#endif + +static WORD_LIST expand_word_error, expand_word_fatal; +static char expand_param_error, expand_param_fatal; + +/* Tell the expansion functions to not longjmp back to top_level on fatal + errors. Enabled when doing completion and prompt string expansion. */ +static int no_longjmp_on_fatal_error = 0; + +/* Set by expand_word_unsplit; used to inhibit splitting and re-joining + $* on $IFS, primarily when doing assignment statements. */ +static int expand_no_split_dollar_star = 0; + +/* Used to hold a list of variable assignments preceding a command. Global + so the SIGCHLD handler in jobs.c can unwind-protect it when it runs a + SIGCHLD trap. */ +WORD_LIST *subst_assign_varlist = (WORD_LIST *)NULL; + +/* A WORD_LIST of words to be expanded by expand_word_list_internal, + without any leading variable assignments. */ +static WORD_LIST *garglist = (WORD_LIST *)NULL; + +static char *quoted_substring __P((char *, int, int)); +static int quoted_strlen __P((char *)); +static char *quoted_strchr __P((char *, int, int)); + +static char *expand_string_if_necessary __P((char *, int, EXPFUNC *)); +static inline char *expand_string_to_string_internal __P((char *, int, EXPFUNC *)); +static WORD_LIST *call_expand_word_internal __P((WORD_DESC *, int, int, int *, int *)); +static WORD_LIST *expand_string_internal __P((char *, int)); +static WORD_LIST *expand_string_leave_quoted __P((char *, int)); +static WORD_LIST *expand_string_for_rhs __P((char *, int, int *, int *)); + +static WORD_LIST *list_quote_escapes __P((WORD_LIST *)); +static char *dequote_escapes __P((char *)); +static char *make_quoted_char __P((int)); +static WORD_LIST *quote_list __P((WORD_LIST *)); +static WORD_LIST *dequote_list __P((WORD_LIST *)); +static char *remove_quoted_escapes __P((char *)); +static char *remove_quoted_nulls __P((char *)); + +static int unquoted_substring __P((char *, char *)); +static int unquoted_member __P((int, char *)); + +static int do_assignment_internal __P((const char *, int)); + +static char *string_extract_verbatim __P((char *, int *, char *)); +static char *string_extract __P((char *, int *, char *, int)); +static char *string_extract_double_quoted __P((char *, int *, int)); +static inline char *string_extract_single_quoted __P((char *, int *)); +static inline int skip_single_quoted __P((char *, size_t, int)); +static int skip_double_quoted __P((char *, size_t, int)); +static char *extract_delimited_string __P((char *, int *, char *, char *, char *, int)); +static char *extract_dollar_brace_string __P((char *, int *, int, int)); + +static char *pos_params __P((char *, int, int, int)); + +static unsigned char *mb_getcharlens __P((char *, int)); + +static char *remove_upattern __P((char *, char *, int)); +#if defined (HANDLE_MULTIBYTE) +# if !defined (HAVE_WCSDUP) +static wchar_t *wcsdup __P((wchar_t *)); +# endif +static wchar_t *remove_wpattern __P((wchar_t *, size_t, wchar_t *, int)); +#endif +static char *remove_pattern __P((char *, char *, int)); + +static int match_pattern_char __P((char *, char *)); +static int match_upattern __P((char *, char *, int, char **, char **)); +#if defined (HANDLE_MULTIBYTE) +static int match_pattern_wchar __P((wchar_t *, wchar_t *)); +static int match_wpattern __P((wchar_t *, char **, size_t, wchar_t *, int, char **, char **)); +#endif +static int match_pattern __P((char *, char *, int, char **, char **)); +static int getpatspec __P((int, char *)); +static char *getpattern __P((char *, int, int)); +static char *variable_remove_pattern __P((char *, char *, int, int)); +static char *list_remove_pattern __P((WORD_LIST *, char *, int, int, int)); +static char *parameter_list_remove_pattern __P((int, char *, int, int)); +#ifdef ARRAY_VARS +static char *array_remove_pattern __P((ARRAY *, char *, int, char *, int)); +#endif +static char *parameter_brace_remove_pattern __P((char *, char *, char *, int, int)); + +static char *process_substitute __P((char *, int)); + +static char *read_comsub __P((int, int)); + +#ifdef ARRAY_VARS +static arrayind_t array_length_reference __P((char *)); +#endif + +static int valid_brace_expansion_word __P((char *, int)); +static int chk_atstar __P((char *, int, int *, int *)); + +static char *parameter_brace_expand_word __P((char *, int, int)); +static char *parameter_brace_expand_indir __P((char *, int, int, int *, int *)); +static char *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *)); +static void parameter_brace_expand_error __P((char *, char *)); + +static int valid_length_expression __P((char *)); +static intmax_t parameter_brace_expand_length __P((char *)); + +static char *skiparith __P((char *, int)); +static int verify_substring_values __P((char *, char *, int, intmax_t *, intmax_t *)); +static int get_var_and_type __P((char *, char *, int, SHELL_VAR **, char **)); +static char *mb_substring __P((char *, int, int)); +static char *parameter_brace_substring __P((char *, char *, char *, int)); + +static char *pos_params_pat_subst __P((char *, char *, char *, int)); + +static char *parameter_brace_patsub __P((char *, char *, char *, int)); + +static char *parameter_brace_expand __P((char *, int *, int, int *, int *)); +static char *param_expand __P((char *, int *, int, int *, int *, int *, int *, int)); + +static WORD_LIST *expand_word_internal __P((WORD_DESC *, int, int, int *, int *)); + +static WORD_LIST *word_list_split __P((WORD_LIST *)); + +static void exp_jump_to_top_level __P((int)); + +static WORD_LIST *separate_out_assignments __P((WORD_LIST *)); +static WORD_LIST *glob_expand_word_list __P((WORD_LIST *, int)); +#ifdef BRACE_EXPANSION +static WORD_LIST *brace_expand_word_list __P((WORD_LIST *, int)); +#endif +static WORD_LIST *shell_expand_word_list __P((WORD_LIST *, int)); +static WORD_LIST *expand_word_list_internal __P((WORD_LIST *, int)); + +/* **************************************************************** */ +/* */ +/* Utility Functions */ +/* */ +/* **************************************************************** */ + +#ifdef INCLUDE_UNUSED +static char * +quoted_substring (string, start, end) + char *string; + int start, end; +{ + register int len, l; + register char *result, *s, *r; + + len = end - start; + + /* Move to string[start], skipping quoted characters. */ + for (s = string, l = 0; *s && l < start; ) + { + if (*s == CTLESC) + { + s++; + continue; + } + l++; + if (*s == 0) + break; + } + + r = result = (char *)xmalloc (2*len + 1); /* save room for quotes */ + + /* Copy LEN characters, including quote characters. */ + s = string + l; + for (l = 0; l < len; s++) + { + if (*s == CTLESC) + *r++ = *s++; + *r++ = *s; + l++; + if (*s == 0) + break; + } + *r = '\0'; + return result; +} +#endif + +#ifdef INCLUDE_UNUSED +/* Return the length of S, skipping over quoted characters */ +static int +quoted_strlen (s) + char *s; +{ + register char *p; + int i; + + i = 0; + for (p = s; *p; p++) + { + if (*p == CTLESC) + { + p++; + if (*p == 0) + return (i + 1); + } + i++; + } + + return i; +} +#endif + +/* Find the first occurrence of character C in string S, obeying shell + quoting rules. If (FLAGS & ST_BACKSL) is non-zero, backslash-escaped + characters are skipped. If (FLAGS & ST_CTLESC) is non-zero, characters + escaped with CTLESC are skipped. */ +static char * +quoted_strchr (s, c, flags) + char *s; + int c, flags; +{ + register char *p; + + for (p = s; *p; p++) + { + if (((flags & ST_BACKSL) && *p == '\\') + || ((flags & ST_CTLESC) && *p == CTLESC)) + { + p++; + if (*p == '\0') + return ((char *)NULL); + continue; + } + else if (*p == c) + return p; + } + return ((char *)NULL); +} + +/* Return 1 if CHARACTER appears in an unquoted portion of + STRING. Return 0 otherwise. CHARACTER must be a single-byte character. */ +static int +unquoted_member (character, string) + int character; + char *string; +{ + size_t slen; + int sindex, c; + DECLARE_MBSTATE; + + slen = strlen (string); + sindex = 0; + while (c = string[sindex]) + { + if (c == character) + return (1); + + switch (c) + { + default: + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\\': + sindex++; + if (string[sindex]) + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\'': + sindex = skip_single_quoted (string, slen, ++sindex); + break; + + case '"': + sindex = skip_double_quoted (string, slen, ++sindex); + break; + } + } + return (0); +} + +/* Return 1 if SUBSTR appears in an unquoted portion of STRING. */ +static int +unquoted_substring (substr, string) + char *substr, *string; +{ + size_t slen; + int sindex, c, sublen; + DECLARE_MBSTATE; + + if (substr == 0 || *substr == '\0') + return (0); + + slen = strlen (string); + sublen = strlen (substr); + for (sindex = 0; c = string[sindex]; ) + { + if (STREQN (string + sindex, substr, sublen)) + return (1); + + switch (c) + { + case '\\': + sindex++; + + if (string[sindex]) + ADVANCE_CHAR (string, slen, sindex); + break; + + case '\'': + sindex = skip_single_quoted (string, slen, ++sindex); + break; + + case '"': + sindex = skip_double_quoted (string, slen, ++sindex); + break; + + default: + ADVANCE_CHAR (string, slen, sindex); + break; + } + } + return (0); +} + +/* Most of the substitutions must be done in parallel. In order + to avoid using tons of unclear goto's, I have some functions + for manipulating malloc'ed strings. They all take INDX, a + pointer to an integer which is the offset into the string + where manipulation is taking place. They also take SIZE, a + pointer to an integer which is the current length of the + character array for this string. */ + +/* Append SOURCE to TARGET at INDEX. SIZE is the current amount + of space allocated to TARGET. SOURCE can be NULL, in which + case nothing happens. Gets rid of SOURCE by freeing it. + Returns TARGET in case the location has changed. */ +INLINE char * +sub_append_string (source, target, indx, size) + char *source, *target; + int *indx, *size; +{ + if (source) + { + int srclen, n; + + srclen = STRLEN (source); + if (srclen >= (int)(*size - *indx)) + { + n = srclen + *indx; + n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE); + target = (char *)xrealloc (target, (*size = n)); + } + + FASTCOPY (source, target + *indx, srclen); + *indx += srclen; + target[*indx] = '\0'; + + free (source); + } + return (target); +} + +#if 0 +/* UNUSED */ +/* Append the textual representation of NUMBER to TARGET. + INDX and SIZE are as in SUB_APPEND_STRING. */ +char * +sub_append_number (number, target, indx, size) + intmax_t number; + int *indx, *size; + char *target; +{ + char *temp; + + temp = itos (number); + return (sub_append_string (temp, target, indx, size)); +} +#endif + +/* Extract a substring from STRING, starting at SINDEX and ending with + one of the characters in CHARLIST. Don't make the ending character + part of the string. Leave SINDEX pointing at the ending character. + Understand about backslashes in the string. If (flags & EX_VARNAME) + is non-zero, and array variables have been compiled into the shell, + everything between a `[' and a corresponding `]' is skipped over. + If (flags & EX_NOALLOC) is non-zero, don't return the substring, just + update SINDEX. */ +static char * +string_extract (string, sindex, charlist, flags) + char *string; + int *sindex; + char *charlist; + int flags; +{ + register int c, i; + size_t slen; + char *temp; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + i = *sindex; + while (c = string[i]) + { + if (c == '\\') + { + if (string[i + 1]) + i++; + else + break; + } +#if defined (ARRAY_VARS) + else if ((flags & EX_VARNAME) && c == '[') + { + int ni; + /* If this is an array subscript, skip over it and continue. */ + ni = skipsubscript (string, i); + if (string[ni] == ']') + i = ni; + } +#endif + else if (MEMBER (c, charlist)) + break; + + ADVANCE_CHAR (string, slen, i); + } + + temp = (flags & EX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i); + *sindex = i; + return (temp); +} + +/* Extract the contents of STRING as if it is enclosed in double quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening double quote; on exit, SINDEX is left pointing after + the closing double quote. If STRIPDQ is non-zero, unquoted double + quotes are stripped and the string is terminated by a null byte. + Backslashes between the embedded double quotes are processed. If STRIPDQ + is zero, an unquoted `"' terminates the string. */ +static char * +string_extract_double_quoted (string, sindex, stripdq) + char *string; + int *sindex, stripdq; +{ + size_t slen; + char *send; + int j, i, t; + unsigned char c; + char *temp, *ret; /* The new string we return. */ + int pass_next, backquote, si; /* State variables for the machine. */ + int dquote; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + send = string + slen; + + pass_next = backquote = dquote = 0; + temp = (char *)xmalloc (1 + slen - *sindex); + + j = 0; + i = *sindex; + while (c = string[i]) + { + /* Process a character that was quoted by a backslash. */ + if (pass_next) + { + /* Posix.2 sez: + + ``The backslash shall retain its special meaning as an escape + character only when followed by one of the characters: + $ ` " \ ''. + + If STRIPDQ is zero, we handle the double quotes here and let + expand_word_internal handle the rest. If STRIPDQ is non-zero, + we have already been through one round of backslash stripping, + and want to strip these backslashes only if DQUOTE is non-zero, + indicating that we are inside an embedded double-quoted string. */ + + /* If we are in an embedded quoted string, then don't strip + backslashes before characters for which the backslash + retains its special meaning, but remove backslashes in + front of other characters. If we are not in an + embedded quoted string, don't strip backslashes at all. + This mess is necessary because the string was already + surrounded by double quotes (and sh has some really weird + quoting rules). + The returned string will be run through expansion as if + it were double-quoted. */ + if ((stripdq == 0 && c != '"') || + (stripdq && ((dquote && (sh_syntaxtab[c] & CBSDQUOTE)) || dquote == 0))) + temp[j++] = '\\'; + pass_next = 0; + +add_one_character: + COPY_CHAR_I (temp, j, string, send, i); + continue; + } + + /* A backslash protects the next character. The code just above + handles preserving the backslash in front of any character but + a double quote. */ + if (c == '\\') + { + pass_next++; + i++; + continue; + } + + /* Inside backquotes, ``the portion of the quoted string from the + initial backquote and the characters up to the next backquote + that is not preceded by a backslash, having escape characters + removed, defines that command''. */ + if (backquote) + { + if (c == '`') + backquote = 0; + temp[j++] = c; + i++; + continue; + } + + if (c == '`') + { + temp[j++] = c; + backquote++; + i++; + continue; + } + + /* Pass everything between `$(' and the matching `)' or a quoted + ${ ... } pair through according to the Posix.2 specification. */ + if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE))) + { + int free_ret = 1; + + si = i + 2; + if (string[i + 1] == LPAREN) + ret = extract_delimited_string (string, &si, "$(", "(", ")", 0); /*)*/ + else + ret = extract_dollar_brace_string (string, &si, 1, 0); + + temp[j++] = '$'; + temp[j++] = string[i + 1]; + + /* Just paranoia; ret will not be 0 unless no_longjmp_on_fatal_error + is set. */ + if (ret == 0 && no_longjmp_on_fatal_error) + { + free_ret = 0; + ret = string + i + 2; + } + + for (t = 0; ret[t]; t++, j++) + temp[j] = ret[t]; + temp[j++] = string[si]; + + i = si + 1; + if (free_ret) + free (ret); + continue; + } + + /* Add any character but a double quote to the quoted string we're + accumulating. */ + if (c != '"') + goto add_one_character; + + /* c == '"' */ + if (stripdq) + { + dquote ^= 1; + i++; + continue; + } + + break; + } + temp[j] = '\0'; + + /* Point to after the closing quote. */ + if (c) + i++; + *sindex = i; + + return (temp); +} + +/* This should really be another option to string_extract_double_quoted. */ +static int +skip_double_quoted (string, slen, sind) + char *string; + size_t slen; + int sind; +{ + int c, i; + char *ret; + int pass_next, backquote, si; + DECLARE_MBSTATE; + + pass_next = backquote = 0; + i = sind; + while (c = string[i]) + { + if (pass_next) + { + pass_next = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next++; + i++; + continue; + } + else if (backquote) + { + if (c == '`') + backquote = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '`') + { + backquote++; + i++; + continue; + } + else if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE))) + { + si = i + 2; + if (string[i + 1] == LPAREN) + ret = extract_delimited_string (string, &si, "$(", "(", ")", EX_NOALLOC); + else + ret = extract_dollar_brace_string (string, &si, 0, EX_NOALLOC); + + i = si + 1; + continue; + } + else if (c != '"') + { + ADVANCE_CHAR (string, slen, i); + continue; + } + else + break; + } + + if (c) + i++; + + return (i); +} + +/* Extract the contents of STRING as if it is enclosed in single quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening single quote; on exit, SINDEX is left pointing after + the closing single quote. */ +static inline char * +string_extract_single_quoted (string, sindex) + char *string; + int *sindex; +{ + register int i; + size_t slen; + char *t; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + i = *sindex; + while (string[i] && string[i] != '\'') + ADVANCE_CHAR (string, slen, i); + + t = substring (string, *sindex, i); + + if (string[i]) + i++; + *sindex = i; + + return (t); +} + +static inline int +skip_single_quoted (string, slen, sind) + char *string; + size_t slen; + int sind; +{ + register int c; + DECLARE_MBSTATE; + + c = sind; + while (string[c] && string[c] != '\'') + ADVANCE_CHAR (string, slen, c); + + if (string[c]) + c++; + return c; +} + +/* Just like string_extract, but doesn't hack backslashes or any of + that other stuff. Obeys CTLESC quoting. Used to do splitting on $IFS. */ +static char * +string_extract_verbatim (string, sindex, charlist) + char *string; + int *sindex; + char *charlist; +{ + register int i = *sindex; + int c; + char *temp; + + if (charlist[0] == '\'' && charlist[1] == '\0') + { + temp = string_extract_single_quoted (string, sindex); + --*sindex; /* leave *sindex at separator character */ + return temp; + } + + for (i = *sindex; c = string[i]; i++) + { + if (c == CTLESC) + { + i++; + continue; + } + + if (MEMBER (c, charlist)) + break; + } + + temp = substring (string, *sindex, i); + *sindex = i; + + return (temp); +} + +/* Extract the $( construct in STRING, and return a new string. + Start extracting at (SINDEX) as if we had just seen "$(". + Make (SINDEX) get the position of the matching ")". */ +char * +extract_command_subst (string, sindex) + char *string; + int *sindex; +{ + return (extract_delimited_string (string, sindex, "$(", "(", ")", 0)); +} + +/* Extract the $[ construct in STRING, and return a new string. (]) + Start extracting at (SINDEX) as if we had just seen "$[". + Make (SINDEX) get the position of the matching "]". */ +char * +extract_arithmetic_subst (string, sindex) + char *string; + int *sindex; +{ + return (extract_delimited_string (string, sindex, "$[", "[", "]", 0)); /*]*/ +} + +#if defined (PROCESS_SUBSTITUTION) +/* Extract the <( or >( construct in STRING, and return a new string. + Start extracting at (SINDEX) as if we had just seen "<(". + Make (SINDEX) get the position of the matching ")". */ /*))*/ +char * +extract_process_subst (string, starter, sindex) + char *string; + char *starter; + int *sindex; +{ + return (extract_delimited_string (string, sindex, starter, "(", ")", 0)); +} +#endif /* PROCESS_SUBSTITUTION */ + +#if defined (ARRAY_VARS) +char * +extract_array_assignment_list (string, sindex) + char *string; + int *sindex; +{ + return (extract_delimited_string (string, sindex, "(", (char *)NULL, ")", 0)); +} +#endif + +/* Extract and create a new string from the contents of STRING, a + character string delimited with OPENER and CLOSER. SINDEX is + the address of an int describing the current offset in STRING; + it should point to just after the first OPENER found. On exit, + SINDEX gets the position of the last character of the matching CLOSER. + If OPENER is more than a single character, ALT_OPENER, if non-null, + contains a character string that can also match CLOSER and thus + needs to be skipped. */ +static char * +extract_delimited_string (string, sindex, opener, alt_opener, closer, flags) + char *string; + int *sindex; + char *opener, *alt_opener, *closer; + int flags; +{ + int i, c, si; + size_t slen; + char *t, *result; + int pass_character, nesting_level; + int len_closer, len_opener, len_alt_opener; + DECLARE_MBSTATE; + + slen = strlen (string + *sindex) + *sindex; + len_opener = STRLEN (opener); + len_alt_opener = STRLEN (alt_opener); + len_closer = STRLEN (closer); + + pass_character = 0; + + nesting_level = 1; + i = *sindex; + + while (nesting_level) + { + c = string[i]; + + if (c == 0) + break; + + if (pass_character) /* previous char was backslash */ + { + pass_character = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + + if (c == CTLESC || c == '\\') + { + pass_character++; + i++; + continue; + } + + /* Process a nested OPENER. */ + if (STREQN (string + i, opener, len_opener)) + { + si = i + len_opener; + t = extract_delimited_string (string, &si, opener, alt_opener, closer, flags|EX_NOALLOC); + i = si + 1; + continue; + } + + /* Process a nested ALT_OPENER */ + if (len_alt_opener && STREQN (string + i, alt_opener, len_alt_opener)) + { + si = i + len_alt_opener; + t = extract_delimited_string (string, &si, alt_opener, alt_opener, closer, flags|EX_NOALLOC); + i = si + 1; + continue; + } + + /* If the current substring terminates the delimited string, decrement + the nesting level. */ + if (STREQN (string + i, closer, len_closer)) + { + i += len_closer - 1; /* move to last byte of the closer */ + nesting_level--; + if (nesting_level == 0) + break; + } + + /* Pass old-style command substitution through verbatim. */ + if (c == '`') + { + si = i + 1; + t = string_extract (string, &si, "`", flags|EX_NOALLOC); + i = si + 1; + continue; + } + + /* Pass single-quoted and double-quoted strings through verbatim. */ + if (c == '\'' || c == '"') + { + si = i + 1; + i = (c == '\'') ? skip_single_quoted (string, slen, si) + : skip_double_quoted (string, slen, si); + continue; + } + + /* move past this character, which was not special. */ + ADVANCE_CHAR (string, slen, i); + } + + if (c == 0 && nesting_level) + { + if (no_longjmp_on_fatal_error == 0) + { + report_error (_("bad substitution: no closing `%s' in %s"), closer, string); + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level (DISCARD); + } + else + { + *sindex = i; + return (char *)NULL; + } + } + + si = i - *sindex - len_closer + 1; + if (flags & EX_NOALLOC) + result = (char *)NULL; + else + { + result = (char *)xmalloc (1 + si); + strncpy (result, string + *sindex, si); + result[si] = '\0'; + } + *sindex = i; + + return (result); +} + +/* Extract a parameter expansion expression within ${ and } from STRING. + Obey the Posix.2 rules for finding the ending `}': count braces while + skipping over enclosed quoted strings and command substitutions. + SINDEX is the address of an int describing the current offset in STRING; + it should point to just after the first `{' found. On exit, SINDEX + gets the position of the matching `}'. QUOTED is non-zero if this + occurs inside double quotes. */ +/* XXX -- this is very similar to extract_delimited_string -- XXX */ +static char * +extract_dollar_brace_string (string, sindex, quoted, flags) + char *string; + int *sindex, quoted, flags; +{ + register int i, c; + size_t slen; + int pass_character, nesting_level, si; + char *result, *t; + DECLARE_MBSTATE; + + pass_character = 0; + nesting_level = 1; + slen = strlen (string + *sindex) + *sindex; + + i = *sindex; + while (c = string[i]) + { + if (pass_character) + { + pass_character = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + + /* CTLESCs and backslashes quote the next character. */ + if (c == CTLESC || c == '\\') + { + pass_character++; + i++; + continue; + } + + if (string[i] == '$' && string[i+1] == LBRACE) + { + nesting_level++; + i += 2; + continue; + } + + if (c == RBRACE) + { + nesting_level--; + if (nesting_level == 0) + break; + i++; + continue; + } + + /* Pass the contents of old-style command substitutions through + verbatim. */ + if (c == '`') + { + si = i + 1; + t = string_extract (string, &si, "`", flags|EX_NOALLOC); + i = si + 1; + continue; + } + + /* Pass the contents of new-style command substitutions and + arithmetic substitutions through verbatim. */ + if (string[i] == '$' && string[i+1] == LPAREN) + { + si = i + 2; + t = extract_delimited_string (string, &si, "$(", "(", ")", flags|EX_NOALLOC); /*)*/ + i = si + 1; + continue; + } + + /* Pass the contents of single-quoted and double-quoted strings + through verbatim. */ + if (c == '\'' || c == '"') + { + si = i + 1; + i = (c == '\'') ? skip_single_quoted (string, slen, si) + : skip_double_quoted (string, slen, si); + /* skip_XXX_quoted leaves index one past close quote */ + continue; + } + + /* move past this character, which was not special. */ + ADVANCE_CHAR (string, slen, i); + } + + if (c == 0 && nesting_level) + { + if (no_longjmp_on_fatal_error == 0) + { /* { */ + report_error ("bad substitution: no closing `%s' in %s", "}", string); + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level (DISCARD); + } + else + { + *sindex = i; + return ((char *)NULL); + } + } + + result = (flags & EX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i); + *sindex = i; + + return (result); +} + +/* Remove backslashes which are quoting backquotes from STRING. Modifies + STRING, and returns a pointer to it. */ +char * +de_backslash (string) + char *string; +{ + register size_t slen; + register int i, j, prev_i; + DECLARE_MBSTATE; + + slen = strlen (string); + i = j = 0; + + /* Loop copying string[i] to string[j], i >= j. */ + while (i < slen) + { + if (string[i] == '\\' && (string[i + 1] == '`' || string[i + 1] == '\\' || + string[i + 1] == '$')) + i++; + prev_i = i; + ADVANCE_CHAR (string, slen, i); + if (j < prev_i) + do string[j++] = string[prev_i++]; while (prev_i < i); + else + j = i; + } + string[j] = '\0'; + + return (string); +} + +#if 0 +/*UNUSED*/ +/* Replace instances of \! in a string with !. */ +void +unquote_bang (string) + char *string; +{ + register int i, j; + register char *temp; + + temp = (char *)xmalloc (1 + strlen (string)); + + for (i = 0, j = 0; (temp[j] = string[i]); i++, j++) + { + if (string[i] == '\\' && string[i + 1] == '!') + { + temp[j] = '!'; + i++; + } + } + strcpy (string, temp); + free (temp); +} +#endif + +#if defined (READLINE) +/* Return 1 if the portion of STRING ending at EINDEX is quoted (there is + an unclosed quoted string), or if the character at EINDEX is quoted + by a backslash. NO_LONGJMP_ON_FATAL_ERROR is used to flag that the various + single and double-quoted string parsing functions should not return an + error if there are unclosed quotes or braces. The characters that this + recognizes need to be the same as the contents of + rl_completer_quote_characters. */ + +#define CQ_RETURN(x) do { no_longjmp_on_fatal_error = 0; return (x); } while (0) + +int +char_is_quoted (string, eindex) + char *string; + int eindex; +{ + int i, pass_next, c; + size_t slen; + DECLARE_MBSTATE; + + slen = strlen (string); + no_longjmp_on_fatal_error = 1; + i = pass_next = 0; + while (i <= eindex) + { + c = string[i]; + + if (pass_next) + { + pass_next = 0; + if (i >= eindex) /* XXX was if (i >= eindex - 1) */ + CQ_RETURN(1); + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (c == '\'' || c == '"') + { + i = (c == '\'') ? skip_single_quoted (string, slen, ++i) + : skip_double_quoted (string, slen, ++i); + if (i > eindex) + CQ_RETURN(1); + /* no increment, the skip_xxx functions go one past end */ + } + else + ADVANCE_CHAR (string, slen, i); + } + + CQ_RETURN(0); +} + +int +unclosed_pair (string, eindex, openstr) + char *string; + int eindex; + char *openstr; +{ + int i, pass_next, openc, olen; + size_t slen; + DECLARE_MBSTATE; + + slen = strlen (string); + olen = strlen (openstr); + i = pass_next = openc = 0; + while (i <= eindex) + { + if (pass_next) + { + pass_next = 0; + if (i >= eindex) /* XXX was if (i >= eindex - 1) */ + return 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (string[i] == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (STREQN (string + i, openstr, olen)) + { + openc = 1 - openc; + i += olen; + } + else if (string[i] == '\'' || string[i] == '"') + { + i = (string[i] == '\'') ? skip_single_quoted (string, slen, i) + : skip_double_quoted (string, slen, i); + if (i > eindex) + return 0; + } + else + ADVANCE_CHAR (string, slen, i); + } + return (openc); +} + +/* Skip characters in STRING until we find a character in DELIMS, and return + the index of that character. START is the index into string at which we + begin. This is similar in spirit to strpbrk, but it returns an index into + STRING and takes a starting index. This little piece of code knows quite + a lot of shell syntax. It's very similar to skip_double_quoted and other + functions of that ilk. */ +int +skip_to_delim (string, start, delims) + char *string; + int start; + char *delims; +{ + int i, pass_next, backq, si, c; + size_t slen; + char *temp; + DECLARE_MBSTATE; + + slen = strlen (string + start) + start; + no_longjmp_on_fatal_error = 1; + i = start; + pass_next = backq = 0; + while (c = string[i]) + { + if (pass_next) + { + pass_next = 0; + if (c == 0) + CQ_RETURN(i); + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '\\') + { + pass_next = 1; + i++; + continue; + } + else if (backq) + { + if (c == '`') + backq = 0; + ADVANCE_CHAR (string, slen, i); + continue; + } + else if (c == '`') + { + backq = 1; + i++; + continue; + } + else if (c == '\'' || c == '"') + { + i = (c == '\'') ? skip_single_quoted (string, slen, ++i) + : skip_double_quoted (string, slen, ++i); + /* no increment, the skip functions increment past the closing quote. */ + } + else if (c == '$' && (string[i+1] == LPAREN || string[i+1] == LBRACE)) + { + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); + + if (string[i+1] == LPAREN) + temp = extract_delimited_string (string, &si, "$(", "(", ")", EX_NOALLOC); /* ) */ + else + temp = extract_dollar_brace_string (string, &si, 0, EX_NOALLOC); + i = si; + if (string[i] == '\0') /* don't increment i past EOS in loop */ + break; + i++; + continue; + } + else if (member (c, delims)) + break; + else + ADVANCE_CHAR (string, slen, i); + } + + CQ_RETURN(i); +} + +/* Split STRING (length SLEN) at DELIMS, and return a WORD_LIST with the + individual words. If DELIMS is NULL, the current value of $IFS is used + to split the string, and the function follows the shell field splitting + rules. SENTINEL is an index to look for. NWP, if non-NULL, + gets the number of words in the returned list. CWP, if non-NULL, gets + the index of the word containing SENTINEL. Non-whitespace chars in + DELIMS delimit separate fields. */ +WORD_LIST * +split_at_delims (string, slen, delims, sentinel, nwp, cwp) + char *string; + int slen; + char *delims; + int sentinel; + int *nwp, *cwp; +{ + int ts, te, i, nw, cw, ifs_split; + char *token, *d, *d2; + WORD_LIST *ret, *tl; + + if (string == 0 || *string == '\0') + { + if (nwp) + *nwp = 0; + if (cwp) + *cwp = 0; + return ((WORD_LIST *)NULL); + } + + d = (delims == 0) ? ifs_value : delims; + ifs_split = delims == 0; + + /* Make d2 the non-whitespace characters in delims */ + d2 = 0; + if (delims) + { + d2 = (char *)xmalloc (strlen (delims) + 1); + for (i = ts = 0; delims[i]; i++) + { + if (whitespace(delims[i]) == 0) + d2[ts++] = delims[i]; + } + d2[ts] = '\0'; + } + + ret = (WORD_LIST *)NULL; + + /* Remove sequences of whitspace characters at the start of the string, as + long as those characters are delimiters. */ + for (i = 0; member (string[i], d) && spctabnl (string[i]); i++) + ; + if (string[i] == '\0') + return (ret); + + ts = i; + nw = 0; + cw = -1; + while (1) + { + te = skip_to_delim (string, ts, d); + + /* If we have a non-whitespace delimiter character, use it to make a + separate field. This is just about what $IFS splitting does and + is closer to the behavior of the shell parser. */ + if (ts == te && d2 && member (string[ts], d2)) + { + te = ts + 1; + /* If we're using IFS splitting, the non-whitespace delimiter char + and any additional IFS whitespace delimits a field. */ + if (ifs_split) + while (member (string[te], d) && spctabnl (string[te])) + te++; + else + while (member (string[te], d2)) + te++; + } + + token = substring (string, ts, te); + + ret = add_string_to_list (token, ret); + free (token); + nw++; + + if (sentinel >= ts && sentinel <= te) + cw = nw; + + /* If the cursor is at whitespace just before word start, set the + sentinel word to the current word. */ + if (cwp && cw == -1 && sentinel == ts-1) + cw = nw; + + /* If the cursor is at whitespace between two words, make a new, empty + word, add it before (well, after, since the list is in reverse order) + the word we just added, and set the current word to that one. */ + if (cwp && cw == -1 && sentinel < ts) + { + tl = make_word_list (make_word (""), ret->next); + ret->next = tl; + cw = nw; + nw++; + } + + if (string[te] == 0) + break; + + i = te; + while (member (string[i], d) && (ifs_split || spctabnl(string[i]))) + i++; + + if (string[i]) + ts = i; + else + break; + } + + /* Special case for SENTINEL at the end of STRING. If we haven't found + the word containing SENTINEL yet, and the index we're looking for is at + the end of STRING, add an additional null argument and set the current + word pointer to that. */ + if (cwp && cw == -1 && sentinel >= slen) + { + if (whitespace (string[sentinel - 1])) + { + token = ""; + ret = add_string_to_list (token, ret); + nw++; + } + cw = nw; + } + + if (nwp) + *nwp = nw; + if (cwp) + *cwp = cw; + + return (REVERSE_LIST (ret, WORD_LIST *)); +} +#endif /* READLINE */ + +#if 0 +/* UNUSED */ +/* Extract the name of the variable to bind to from the assignment string. */ +char * +assignment_name (string) + char *string; +{ + int offset; + char *temp; + + offset = assignment (string, 0); + if (offset == 0) + return (char *)NULL; + temp = substring (string, 0, offset); + return (temp); +} +#endif + +/* **************************************************************** */ +/* */ +/* Functions to convert strings to WORD_LISTs and vice versa */ +/* */ +/* **************************************************************** */ + +/* Return a single string of all the words in LIST. SEP is the separator + to put between individual elements of LIST in the output string. */ +char * +string_list_internal (list, sep) + WORD_LIST *list; + char *sep; +{ + register WORD_LIST *t; + char *result, *r; + int word_len, sep_len, result_size; + + if (list == 0) + return ((char *)NULL); + + /* Short-circuit quickly if we don't need to separate anything. */ + if (list->next == 0) + return (savestring (list->word->word)); + + /* This is nearly always called with either sep[0] == 0 or sep[1] == 0. */ + sep_len = STRLEN (sep); + result_size = 0; + + for (t = list; t; t = t->next) + { + if (t != list) + result_size += sep_len; + result_size += strlen (t->word->word); + } + + r = result = (char *)xmalloc (result_size + 1); + + for (t = list; t; t = t->next) + { + if (t != list && sep_len) + { + if (sep_len > 1) + { + FASTCOPY (sep, r, sep_len); + r += sep_len; + } + else + *r++ = sep[0]; + } + + word_len = strlen (t->word->word); + FASTCOPY (t->word->word, r, word_len); + r += word_len; + } + + *r = '\0'; + return (result); +} + +/* Return a single string of all the words present in LIST, separating + each word with a space. */ +char * +string_list (list) + WORD_LIST *list; +{ + return (string_list_internal (list, " ")); +} + +/* Return a single string of all the words present in LIST, obeying the + quoting rules for "$*", to wit: (P1003.2, draft 11, 3.5.2) "If the + expansion [of $*] appears within a double quoted string, it expands + to a single field with the value of each parameter separated by the + first character of the IFS variable, or by a if IFS is unset." */ +char * +string_list_dollar_star (list) + WORD_LIST *list; +{ + char sep[2]; + + sep[0] = ifs_firstc; + sep[1] = '\0'; + + return (string_list_internal (list, sep)); +} + +/* Turn $@ into a string. If (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + is non-zero, the $@ appears within double quotes, and we should quote + the list before converting it into a string. If IFS is unset, and the + word is not quoted, we just need to quote CTLESC and CTLNUL characters + in the words in the list, because the default value of $IFS is + , IFS characters in the words in the list should + also be split. If IFS is null, and the word is not quoted, we need + to quote the words in the list to preserve the positional parameters + exactly. */ +char * +string_list_dollar_at (list, quoted) + WORD_LIST *list; + int quoted; +{ + char *ifs, sep[2]; + WORD_LIST *tlist; + + /* XXX this could just be ifs = ifs_value; */ + ifs = ifs_var ? value_cell (ifs_var) : (char *)0; + + sep[0] = (ifs == 0 || *ifs == 0) ? ' ' : *ifs; + sep[1] = '\0'; + + tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0)) + ? quote_list (list) + : list_quote_escapes (list); + return (string_list_internal (tlist, sep)); +} + +/* Return the list of words present in STRING. Separate the string into + words at any of the characters found in SEPARATORS. If QUOTED is + non-zero then word in the list will have its quoted flag set, otherwise + the quoted flag is left as make_word () deemed fit. + + This obeys the P1003.2 word splitting semantics. If `separators' is + exactly , then the splitting algorithm is that of + the Bourne shell, which treats any sequence of characters from `separators' + as a delimiter. If IFS is unset, which results in `separators' being set + to "", no splitting occurs. If separators has some other value, the + following rules are applied (`IFS white space' means zero or more + occurrences of , , or , as long as those characters + are in `separators'): + + 1) IFS white space is ignored at the start and the end of the + string. + 2) Each occurrence of a character in `separators' that is not + IFS white space, along with any adjacent occurrences of + IFS white space delimits a field. + 3) Any nonzero-length sequence of IFS white space delimits a field. + */ + +/* BEWARE! list_string strips null arguments. Don't call it twice and + expect to have "" preserved! */ + +/* This performs word splitting and quoted null character removal on + STRING. */ +#define issep(c) \ + (((separators)[0]) ? ((separators)[1] ? isifs(c) \ + : (c) == (separators)[0]) \ + : 0) + +WORD_LIST * +list_string (string, separators, quoted) + register char *string, *separators; + int quoted; +{ + WORD_LIST *result; + WORD_DESC *t; + char *current_word, *s; + int sindex, sh_style_split, whitesep; + + if (!string || !*string) + return ((WORD_LIST *)NULL); + + sh_style_split = separators && separators[0] == ' ' && + separators[1] == '\t' && + separators[2] == '\n' && + separators[3] == '\0'; + + /* Remove sequences of whitespace at the beginning of STRING, as + long as those characters appear in IFS. Do not do this if + STRING is quoted or if there are no separator characters. */ + if (!quoted || !separators || !*separators) + { + for (s = string; *s && spctabnl (*s) && issep (*s); s++); + + if (!*s) + return ((WORD_LIST *)NULL); + + string = s; + } + + /* OK, now STRING points to a word that does not begin with white space. + The splitting algorithm is: + extract a word, stopping at a separator + skip sequences of spc, tab, or nl as long as they are separators + This obeys the field splitting rules in Posix.2. */ + for (result = (WORD_LIST *)NULL, sindex = 0; string[sindex]; ) + { + current_word = string_extract_verbatim (string, &sindex, separators); + if (current_word == 0) + break; + + /* If we have a quoted empty string, add a quoted null argument. We + want to preserve the quoted null character iff this is a quoted + empty string; otherwise the quoted null characters are removed + below. */ + if (QUOTED_NULL (current_word)) + { + t = make_bare_word (""); + t->flags |= W_QUOTED; + free (t->word); + t->word = make_quoted_char ('\0'); + result = make_word_list (t, result); + } + else if (current_word[0] != '\0') + { + /* If we have something, then add it regardless. However, + perform quoted null character removal on the current word. */ + remove_quoted_nulls (current_word); + result = add_string_to_list (current_word, result); + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + result->word->flags |= W_QUOTED; + } + + /* If we're not doing sequences of separators in the traditional + Bourne shell style, then add a quoted null argument. */ + else if (!sh_style_split && !spctabnl (string[sindex])) + { + t = make_bare_word (""); + t->flags |= W_QUOTED; + free (t->word); + t->word = make_quoted_char ('\0'); + result = make_word_list (t, result); + } + + free (current_word); + + /* Note whether or not the separator is IFS whitespace, used later. */ + whitesep = string[sindex] && spctabnl (string[sindex]); + + /* Move past the current separator character. */ + if (string[sindex]) + sindex++; + + /* Now skip sequences of space, tab, or newline characters if they are + in the list of separators. */ + while (string[sindex] && spctabnl (string[sindex]) && issep (string[sindex])) + sindex++; + + /* If the first separator was IFS whitespace and the current character + is a non-whitespace IFS character, it should be part of the current + field delimiter, not a separate delimiter that would result in an + empty field. Look at POSIX.2, 3.6.5, (3)(b). */ + if (string[sindex] && whitesep && issep (string[sindex]) && !spctabnl (string[sindex])) + sindex++; + } + return (REVERSE_LIST (result, WORD_LIST *)); +} + +/* Parse a single word from STRING, using SEPARATORS to separate fields. + ENDPTR is set to the first character after the word. This is used by + the `read' builtin. This is never called with SEPARATORS != $IFS; + it should be simplified. + + XXX - this function is very similar to list_string; they should be + combined - XXX */ +char * +get_word_from_string (stringp, separators, endptr) + char **stringp, *separators, **endptr; +{ + register char *s; + char *current_word; + int sindex, sh_style_split, whitesep; + + if (!stringp || !*stringp || !**stringp) + return ((char *)NULL); + + s = *stringp; + + sh_style_split = separators && separators[0] == ' ' && + separators[1] == '\t' && + separators[2] == '\n' && + separators[3] == '\0'; + + /* Remove sequences of whitespace at the beginning of STRING, as + long as those characters appear in IFS. */ + if (sh_style_split || !separators || !*separators) + { + for (; *s && spctabnl (*s) && isifs (*s); s++); + + /* If the string is nothing but whitespace, update it and return. */ + if (!*s) + { + *stringp = s; + if (endptr) + *endptr = s; + return ((char *)NULL); + } + } + + /* OK, S points to a word that does not begin with white space. + Now extract a word, stopping at a separator, save a pointer to + the first character after the word, then skip sequences of spc, + tab, or nl as long as they are separators. + + This obeys the field splitting rules in Posix.2. */ + sindex = 0; + current_word = string_extract_verbatim (s, &sindex, separators); + + /* Set ENDPTR to the first character after the end of the word. */ + if (endptr) + *endptr = s + sindex; + + /* Note whether or not the separator is IFS whitespace, used later. */ + whitesep = s[sindex] && spctabnl (s[sindex]); + + /* Move past the current separator character. */ + if (s[sindex]) + sindex++; + + /* Now skip sequences of space, tab, or newline characters if they are + in the list of separators. */ + while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex])) + sindex++; + + /* If the first separator was IFS whitespace and the current character is + a non-whitespace IFS character, it should be part of the current field + delimiter, not a separate delimiter that would result in an empty field. + Look at POSIX.2, 3.6.5, (3)(b). */ + if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex])) + sindex++; + + /* Update STRING to point to the next field. */ + *stringp = s + sindex; + return (current_word); +} + +/* Remove IFS white space at the end of STRING. Start at the end + of the string and walk backwards until the beginning of the string + or we find a character that's not IFS white space and not CTLESC. + Only let CTLESC escape a white space character if SAW_ESCAPE is + non-zero. */ +char * +strip_trailing_ifs_whitespace (string, separators, saw_escape) + char *string, *separators; + int saw_escape; +{ + char *s; + + s = string + STRLEN (string) - 1; + while (s > string && ((spctabnl (*s) && isifs (*s)) || + (saw_escape && *s == CTLESC && spctabnl (s[1])))) + s--; + *++s = '\0'; + return string; +} + +#if 0 +/* UNUSED */ +/* Split STRING into words at whitespace. Obeys shell-style quoting with + backslashes, single and double quotes. */ +WORD_LIST * +list_string_with_quotes (string) + char *string; +{ + WORD_LIST *list; + char *token, *s; + size_t s_len; + int c, i, tokstart, len; + + for (s = string; s && *s && spctabnl (*s); s++) + ; + if (s == 0 || *s == 0) + return ((WORD_LIST *)NULL); + + s_len = strlen (s); + tokstart = i = 0; + list = (WORD_LIST *)NULL; + while (1) + { + c = s[i]; + if (c == '\\') + { + i++; + if (s[i]) + i++; + } + else if (c == '\'') + i = skip_single_quoted (s, s_len, ++i); + else if (c == '"') + i = skip_double_quoted (s, s_len, ++i); + else if (c == 0 || spctabnl (c)) + { + /* We have found the end of a token. Make a word out of it and + add it to the word list. */ + token = substring (s, tokstart, i); + list = add_string_to_list (token, list); + free (token); + while (spctabnl (s[i])) + i++; + if (s[i]) + tokstart = i; + else + break; + } + else + i++; /* normal character */ + } + return (REVERSE_LIST (list, WORD_LIST *)); +} +#endif + +/********************************************************/ +/* */ +/* Functions to perform assignment statements */ +/* */ +/********************************************************/ + +/* Given STRING, an assignment string, get the value of the right side + of the `=', and bind it to the left side. If EXPAND is true, then + perform parameter expansion, command substitution, and arithmetic + expansion on the right-hand side. Perform tilde expansion in any + case. Do not perform word splitting on the result of expansion. */ +static int +do_assignment_internal (string, expand) + const char *string; + int expand; +{ + int offset; + char *name, *value; + SHELL_VAR *entry; +#if defined (ARRAY_VARS) + char *t; + int ni; +#endif + int assign_list = 0; + + offset = assignment (string, 0); + name = savestring (string); + value = (char *)NULL; + + if (name[offset] == '=') + { + char *temp; + + name[offset] = 0; + temp = name + offset + 1; + +#if defined (ARRAY_VARS) + if (expand && temp[0] == LPAREN && xstrchr (temp, RPAREN)) + { + assign_list = ni = 1; + value = extract_delimited_string (temp, &ni, "(", (char *)NULL, ")", 0); + } + else +#endif + + /* Perform tilde expansion. */ + if (expand && temp[0]) + { + temp = (xstrchr (temp, '~') && unquoted_member ('~', temp)) + ? bash_tilde_expand (temp, 1) + : savestring (temp); + + value = expand_string_if_necessary (temp, 0, expand_string_unsplit); + free (temp); + } + else + value = savestring (temp); + } + + if (value == 0) + { + value = (char *)xmalloc (1); + value[0] = '\0'; + } + + if (echo_command_at_execute) + xtrace_print_assignment (name, value, assign_list, 1); + +#define ASSIGN_RETURN(r) do { FREE (value); free (name); return (r); } while (0) + +#if defined (ARRAY_VARS) + if (t = xstrchr (name, '[')) /*]*/ + { + if (assign_list) + { + report_error (_("%s: cannot assign list to array member"), name); + ASSIGN_RETURN (0); + } + entry = assign_array_element (name, value); + if (entry == 0) + ASSIGN_RETURN (0); + } + else if (assign_list) + entry = assign_array_from_string (name, value); + else +#endif /* ARRAY_VARS */ + entry = bind_variable (name, value); + + stupidly_hack_special_variables (name); + + if (entry) + VUNSETATTR (entry, att_invisible); + + /* Return 1 if the assignment seems to have been performed correctly. */ + ASSIGN_RETURN (entry ? ((readonly_p (entry) == 0) && noassign_p (entry) == 0) : 0); +} + +/* Perform the assignment statement in STRING, and expand the + right side by doing command and parameter expansion. */ +int +do_assignment (string) + const char *string; +{ + return do_assignment_internal (string, 1); +} + +/* Given STRING, an assignment string, get the value of the right side + of the `=', and bind it to the left side. Do not do command and + parameter substitution on the right hand side. */ +int +do_assignment_no_expand (string) + const char *string; +{ + return do_assignment_internal (string, 0); +} + +/*************************************************** + * * + * Functions to manage the positional parameters * + * * + ***************************************************/ + +/* Return the word list that corresponds to `$*'. */ +WORD_LIST * +list_rest_of_args () +{ + register WORD_LIST *list, *args; + int i; + + /* Break out of the loop as soon as one of the dollar variables is null. */ + for (i = 1, list = (WORD_LIST *)NULL; i < 10 && dollar_vars[i]; i++) + list = make_word_list (make_bare_word (dollar_vars[i]), list); + + for (args = rest_of_args; args; args = args->next) + list = make_word_list (make_bare_word (args->word->word), list); + + return (REVERSE_LIST (list, WORD_LIST *)); +} + +int +number_of_args () +{ + register WORD_LIST *list; + int n; + + for (n = 0; n < 9 && dollar_vars[n+1]; n++) + ; + for (list = rest_of_args; list; list = list->next) + n++; + return n; +} + +/* Return the value of a positional parameter. This handles values > 10. */ +char * +get_dollar_var_value (ind) + intmax_t ind; +{ + char *temp; + WORD_LIST *p; + + if (ind < 10) + temp = dollar_vars[ind] ? savestring (dollar_vars[ind]) : (char *)NULL; + else /* We want something like ${11} */ + { + ind -= 10; + for (p = rest_of_args; p && ind--; p = p->next) + ; + temp = p ? savestring (p->word->word) : (char *)NULL; + } + return (temp); +} + +/* Make a single large string out of the dollar digit variables, + and the rest_of_args. If DOLLAR_STAR is 1, then obey the special + case of "$*" with respect to IFS. */ +char * +string_rest_of_args (dollar_star) + int dollar_star; +{ + register WORD_LIST *list; + char *string; + + list = list_rest_of_args (); + string = dollar_star ? string_list_dollar_star (list) : string_list (list); + dispose_words (list); + return (string); +} + +/* Return a string containing the positional parameters from START to + END, inclusive. If STRING[0] == '*', we obey the rules for $*, + which only makes a difference if QUOTED is non-zero. If QUOTED includes + Q_HERE_DOCUMENT or Q_DOUBLE_QUOTES, this returns a quoted list, otherwise + no quoting chars are added. */ +static char * +pos_params (string, start, end, quoted) + char *string; + int start, end, quoted; +{ + WORD_LIST *save, *params, *h, *t; + char *ret; + int i; + + /* see if we can short-circuit. if start == end, we want 0 parameters. */ + if (start == end) + return ((char *)NULL); + + save = params = list_rest_of_args (); + if (save == 0) + return ((char *)NULL); + + for (i = 1; params && i < start; i++) + params = params->next; + if (params == 0) + return ((char *)NULL); + for (h = t = params; params && i < end; i++) + { + t = params; + params = params->next; + } + + t->next = (WORD_LIST *)NULL; + if (string[0] == '*') +#if 0 + ret = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? string_list_dollar_star (quote_list (h)) : string_list (h); +#else + { + if (quoted & Q_DOUBLE_QUOTES) + ret = string_list_dollar_star (quote_list (h)); + else if (quoted & Q_HERE_DOCUMENT) + ret = string_list (quote_list (h)); + else + ret = string_list (h); + } +#endif + else + ret = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (h) : h); + if (t != params) + t->next = params; + + dispose_words (save); + return (ret); +} + +/******************************************************************/ +/* */ +/* Functions to expand strings to strings or WORD_LISTs */ +/* */ +/******************************************************************/ + +#if defined (PROCESS_SUBSTITUTION) +#define EXP_CHAR(s) (s == '$' || s == '`' || s == '<' || s == '>' || s == CTLESC) +#else +#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC) +#endif + +/* If there are any characters in STRING that require full expansion, + then call FUNC to expand STRING; otherwise just perform quote + removal if necessary. This returns a new string. */ +static char * +expand_string_if_necessary (string, quoted, func) + char *string; + int quoted; + EXPFUNC *func; +{ + WORD_LIST *list; + size_t slen; + int i, saw_quote; + char *ret; + DECLARE_MBSTATE; + + slen = strlen (string); + i = saw_quote = 0; + while (string[i]) + { + if (EXP_CHAR (string[i])) + break; + else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"') + saw_quote = 1; + ADVANCE_CHAR (string, slen, i); + } + + if (string[i]) + { + list = (*func) (string, quoted); + if (list) + { + ret = string_list (list); + dispose_words (list); + } + else + ret = (char *)NULL; + } + else if (saw_quote && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + ret = string_quote_removal (string, quoted); + else + ret = savestring (string); + + return ret; +} + +static inline char * +expand_string_to_string_internal (string, quoted, func) + char *string; + int quoted; + EXPFUNC *func; +{ + WORD_LIST *list; + char *ret; + + if (string == 0 || *string == '\0') + return ((char *)NULL); + + list = (*func) (string, quoted); + if (list) + { + ret = string_list (list); + dispose_words (list); + } + else + ret = (char *)NULL; + + return (ret); +} + +char * +expand_string_to_string (string, quoted) + char *string; + int quoted; +{ + return (expand_string_to_string_internal (string, quoted, expand_string)); +} + +char * +expand_string_unsplit_to_string (string, quoted) + char *string; + int quoted; +{ + return (expand_string_to_string_internal (string, quoted, expand_string_unsplit)); +} + +#if defined (COND_COMMAND) +/* Just remove backslashes in STRING. Returns a new string. */ +char * +remove_backslashes (string) + char *string; +{ + char *r, *ret, *s; + + r = ret = (char *)xmalloc (strlen (string) + 1); + for (s = string; s && *s; ) + { + if (*s == '\\') + s++; + if (*s == 0) + break; + *r++ = *s++; + } + *r = '\0'; + return ret; +} + +/* This needs better error handling. */ +/* Expand W for use as an argument to a unary or binary operator in a + [[...]] expression. If SPECIAL is nonzero, this is the rhs argument + to the != or == operator, and should be treated as a pattern. In + this case, we quote the string specially for the globbing code. The + caller is responsible for removing the backslashes if the unquoted + words is needed later. */ +char * +cond_expand_word (w, special) + WORD_DESC *w; + int special; +{ + char *r, *p; + WORD_LIST *l; + + if (w->word == 0 || w->word[0] == '\0') + return ((char *)NULL); + + if (xstrchr (w->word, '~') && unquoted_member ('~', w->word)) + { + p = bash_tilde_expand (w->word, 0); + free (w->word); + w->word = p; + } + + l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0); + if (l) + { + if (special == 0) + { + dequote_list (l); + r = string_list (l); + } + else + { + p = string_list (l); + r = quote_string_for_globbing (p, QGLOB_CVTNULL); + free (p); + } + dispose_words (l); + } + else + r = (char *)NULL; + + return r; +} +#endif + +/* Call expand_word_internal to expand W and handle error returns. + A convenience function for functions that don't want to handle + any errors or free any memory before aborting. */ +static WORD_LIST * +call_expand_word_internal (w, q, i, c, e) + WORD_DESC *w; + int q, i, *c, *e; +{ + WORD_LIST *result; + + result = expand_word_internal (w, q, i, c, e); + if (result == &expand_word_error || result == &expand_word_fatal) + { + /* By convention, each time this error is returned, w->word has + already been freed (it sometimes may not be in the fatal case, + but that doesn't result in a memory leak because we're going + to exit in most cases). */ + w->word = (char *)NULL; + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level ((result == &expand_word_error) ? DISCARD : FORCE_EOF); + /* NOTREACHED */ + } + else + return (result); +} + +/* Perform parameter expansion, command substitution, and arithmetic + expansion on STRING, as if it were a word. Leave the result quoted. */ +static WORD_LIST * +expand_string_internal (string, quoted) + char *string; + int quoted; +{ + WORD_DESC td; + WORD_LIST *tresult; + + if (string == 0 || *string == 0) + return ((WORD_LIST *)NULL); + + td.flags = 0; + td.word = savestring (string); + + tresult = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + + FREE (td.word); + return (tresult); +} + +/* Expand STRING by performing parameter expansion, command substitution, + and arithmetic expansion. Dequote the resulting WORD_LIST before + returning it, but do not perform word splitting. The call to + remove_quoted_nulls () is in here because word splitting normally + takes care of quote removal. */ +WORD_LIST * +expand_string_unsplit (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *value; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + expand_no_split_dollar_star = 1; + value = expand_string_internal (string, quoted); + expand_no_split_dollar_star = 0; + + if (value) + { + if (value->word) + remove_quoted_nulls (value->word->word); + dequote_list (value); + } + return (value); +} + + +/* Expand one of the PS? prompt strings. This is a sort of combination of + expand_string_unsplit and expand_string_internal, but returns the + passed string when an error occurs. Might want to trap other calls + to jump_to_top_level here so we don't endlessly loop. */ +WORD_LIST * +expand_prompt_string (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *value; + WORD_DESC td; + + if (string == 0 || *string == 0) + return ((WORD_LIST *)NULL); + + td.flags = 0; + td.word = savestring (string); + + no_longjmp_on_fatal_error = 1; + value = expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL); + no_longjmp_on_fatal_error = 0; + + if (value == &expand_word_error || value == &expand_word_fatal) + { + value = make_word_list (make_bare_word (string), (WORD_LIST *)NULL); + return value; + } + FREE (td.word); + if (value) + { + if (value->word) + remove_quoted_nulls (value->word->word); + dequote_list (value); + } + return (value); +} + +/* Expand STRING just as if you were expanding a word, but do not dequote + the resultant WORD_LIST. This is called only from within this file, + and is used to correctly preserve quoted characters when expanding + things like ${1+"$@"}. This does parameter expansion, command + substitution, arithmetic expansion, and word splitting. */ +static WORD_LIST * +expand_string_leave_quoted (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *tlist; + WORD_LIST *tresult; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + tlist = expand_string_internal (string, quoted); + + if (tlist) + { + tresult = word_list_split (tlist); + dispose_words (tlist); + return (tresult); + } + return ((WORD_LIST *)NULL); +} + +/* This does not perform word splitting or dequote the WORD_LIST + it returns. */ +static WORD_LIST * +expand_string_for_rhs (string, quoted, dollar_at_p, has_dollar_at) + char *string; + int quoted, *dollar_at_p, *has_dollar_at; +{ + WORD_DESC td; + WORD_LIST *tresult; + + if (string == 0 || *string == '\0') + return (WORD_LIST *)NULL; + + td.flags = 0; + td.word = string; + tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at); + return (tresult); +} + +/* Expand STRING just as if you were expanding a word. This also returns + a list of words. Note that filename globbing is *NOT* done for word + or string expansion, just when the shell is expanding a command. This + does parameter expansion, command substitution, arithmetic expansion, + and word splitting. Dequote the resultant WORD_LIST before returning. */ +WORD_LIST * +expand_string (string, quoted) + char *string; + int quoted; +{ + WORD_LIST *result; + + if (string == 0 || *string == '\0') + return ((WORD_LIST *)NULL); + + result = expand_string_leave_quoted (string, quoted); + return (result ? dequote_list (result) : result); +} + +/*************************************************** + * * + * Functions to handle quoting chars * + * * + ***************************************************/ + +/* Conventions: + + A string with s[0] == CTLNUL && s[1] == 0 is a quoted null string. + The parser passes CTLNUL as CTLESC CTLNUL. */ + +/* Quote escape characters in string s, but no other characters. This is + used to protect CTLESC and CTLNUL in variable values from the rest of + the word expansion process after the variable is expanded. */ +char * +quote_escapes (string) + char *string; +{ + register char *s, *t; + size_t slen; + char *result, *send; + DECLARE_MBSTATE; + + slen = strlen (string); + send = string + slen; + + t = result = (char *)xmalloc ((slen * 2) + 1); + s = string; + + while (*s) + { + if (*s == CTLESC || *s == CTLNUL) + *t++ = CTLESC; + COPY_CHAR_P (t, s, send); + } + *t = '\0'; + return (result); +} + +static WORD_LIST * +list_quote_escapes (list) + WORD_LIST *list; +{ + register WORD_LIST *w; + char *t; + + for (w = list; w; w = w->next) + { + t = w->word->word; + w->word->word = quote_escapes (t); + free (t); + } + return list; +} + +/* Inverse of quote_escapes; remove CTLESC protecting CTLESC or CTLNUL. + + The parser passes us CTLESC as CTLESC CTLESC and CTLNUL as CTLESC CTLNUL. + This is necessary to make unquoted CTLESC and CTLNUL characters in the + data stream pass through properly. + + We need to remove doubled CTLESC characters inside quoted strings before + quoting the entire string, so we do not double the number of CTLESC + characters. + + Also used by parts of the pattern substitution code. */ +static char * +dequote_escapes (string) + char *string; +{ + register char *s, *t; + size_t slen; + char *result, *send; + DECLARE_MBSTATE; + + if (string == 0) + return string; + + slen = strlen (string); + send = string + slen; + + t = result = (char *)xmalloc (slen + 1); + s = string; + + if (strchr (string, CTLESC) == 0) + return (strcpy (result, s)); + + while (*s) + { + if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL)) + { + s++; + if (*s == '\0') + break; + } + COPY_CHAR_P (t, s, send); + } + *t = '\0'; + return result; +} + +/* Return a new string with the quoted representation of character C. */ +static char * +make_quoted_char (c) + int c; +{ + char *temp; + + temp = (char *)xmalloc (3); + if (c == 0) + { + temp[0] = CTLNUL; + temp[1] = '\0'; + } + else + { + temp[0] = CTLESC; + temp[1] = c; + temp[2] = '\0'; + } + return (temp); +} + +/* Quote STRING. Return a new string. */ +char * +quote_string (string) + char *string; +{ + register char *t; + size_t slen; + char *result, *send; + + if (*string == 0) + { + result = (char *)xmalloc (2); + result[0] = CTLNUL; + result[1] = '\0'; + } + else + { + DECLARE_MBSTATE; + + slen = strlen (string); + send = string + slen; + + result = (char *)xmalloc ((slen * 2) + 1); + + for (t = result; string < send; ) + { + *t++ = CTLESC; + COPY_CHAR_P (t, string, send); + } + *t = '\0'; + } + return (result); +} + +/* De-quoted quoted characters in STRING. */ +char * +dequote_string (string) + char *string; +{ + register char *s, *t; + size_t slen; + char *result, *send; + DECLARE_MBSTATE; + + slen = strlen (string); + + t = result = (char *)xmalloc (slen + 1); + + if (QUOTED_NULL (string)) + { + result[0] = '\0'; + return (result); + } + + /* If no character in the string can be quoted, don't bother examining + each character. Just return a copy of the string passed to us. */ + if (strchr (string, CTLESC) == NULL) + return (strcpy (result, string)); + + send = string + slen; + s = string; + while (*s) + { + if (*s == CTLESC) + { + s++; + if (*s == '\0') + break; + } + COPY_CHAR_P (t, s, send); + } + + *t = '\0'; + return (result); +} + +/* Quote the entire WORD_LIST list. */ +static WORD_LIST * +quote_list (list) + WORD_LIST *list; +{ + register WORD_LIST *w; + char *t; + + for (w = list; w; w = w->next) + { + t = w->word->word; + w->word->word = quote_string (t); + free (t); + w->word->flags |= W_QUOTED; + } + return list; +} + +static WORD_LIST * +dequote_list (list) + WORD_LIST *list; +{ + register char *s; + register WORD_LIST *tlist; + + for (tlist = list; tlist; tlist = tlist->next) + { + s = dequote_string (tlist->word->word); + free (tlist->word->word); + tlist->word->word = s; + } + return list; +} + +/* Remove CTLESC protecting a CTLESC or CTLNUL in place. Return the passed + string. */ +static char * +remove_quoted_escapes (string) + char *string; +{ + char *t; + + if (string) + { + t = dequote_escapes (string); + strcpy (string, t); + free (t); + } + + return (string); +} + +/* Perform quoted null character removal on STRING. We don't allow any + quoted null characters in the middle or at the ends of strings because + of how expand_word_internal works. remove_quoted_nulls () turns + STRING into an empty string iff it only consists of a quoted null, + and removes all unquoted CTLNUL characters. */ +static char * +remove_quoted_nulls (string) + char *string; +{ + register size_t slen; + register int i, j, prev_i; + DECLARE_MBSTATE; + + if (strchr (string, CTLNUL) == 0) /* XXX */ + return string; /* XXX */ + + slen = strlen (string); + i = j = 0; + + while (i < slen) + { + if (string[i] == CTLESC) + { + /* Old code had j++, but we cannot assume that i == j at this + point -- what if a CTLNUL has already been removed from the + string? We don't want to drop the CTLESC or recopy characters + that we've already copied down. */ + i++; string[j++] = CTLESC; + if (i == slen) + break; + } + else if (string[i] == CTLNUL) + i++; + + prev_i = i; + ADVANCE_CHAR (string, slen, i); + if (j < prev_i) + { + do string[j++] = string[prev_i++]; while (prev_i < i); + } + else + j = i; + } + string[j] = '\0'; + + return (string); +} + +/* Perform quoted null character removal on each element of LIST. + This modifies LIST. */ +void +word_list_remove_quoted_nulls (list) + WORD_LIST *list; +{ + register WORD_LIST *t; + + for (t = list; t; t = t->next) + remove_quoted_nulls (t->word->word); +} + +/* **************************************************************** */ +/* */ +/* Functions for Matching and Removing Patterns */ +/* */ +/* **************************************************************** */ + +#if defined (HANDLE_MULTIBYTE) +#if 0 /* Currently unused */ +static unsigned char * +mb_getcharlens (string, len) + char *string; + int len; +{ + int i, offset, last; + unsigned char *ret; + char *p; + DECLARE_MBSTATE; + + i = offset = 0; + last = 0; + ret = (unsigned char *)xmalloc (len); + memset (ret, 0, len); + while (string[last]) + { + ADVANCE_CHAR (string, len, offset); + ret[last] = offset - last; + last = offset; + } + return ret; +} +#endif +#endif + +/* Remove the portion of PARAM matched by PATTERN according to OP, where OP + can have one of 4 values: + RP_LONG_LEFT remove longest matching portion at start of PARAM + RP_SHORT_LEFT remove shortest matching portion at start of PARAM + RP_LONG_RIGHT remove longest matching portion at end of PARAM + RP_SHORT_RIGHT remove shortest matching portion at end of PARAM +*/ + +#define RP_LONG_LEFT 1 +#define RP_SHORT_LEFT 2 +#define RP_LONG_RIGHT 3 +#define RP_SHORT_RIGHT 4 + +static char * +remove_upattern (param, pattern, op) + char *param, *pattern; + int op; +{ + register int len; + register char *end; + register char *p, *ret, c; + + len = STRLEN (param); + end = param + len; + + switch (op) + { + case RP_LONG_LEFT: /* remove longest match at start */ + for (p = end; p >= param; p--) + { + c = *p; *p = '\0'; + if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + *p = c; + return (savestring (p)); + } + *p = c; + + } + break; + + case RP_SHORT_LEFT: /* remove shortest match at start */ + for (p = param; p <= end; p++) + { + c = *p; *p = '\0'; + if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + *p = c; + return (savestring (p)); + } + *p = c; + } + break; + + case RP_LONG_RIGHT: /* remove longest match at end */ + for (p = param; p <= end; p++) + { + if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + c = *p; *p = '\0'; + ret = savestring (param); + *p = c; + return (ret); + } + } + break; + + case RP_SHORT_RIGHT: /* remove shortest match at end */ + for (p = end; p >= param; p--) + { + if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + c = *p; *p = '\0'; + ret = savestring (param); + *p = c; + return (ret); + } + } + break; + } + + return (savestring (param)); /* no match, return original string */ +} + +#if defined (HANDLE_MULTIBYTE) + +#if !defined (HAVE_WCSDUP) +static wchar_t * +wcsdup (ws) + wchar_t *ws; +{ + wchar_t *ret; + size_t len; + + len = wcslen (ws); + ret = xmalloc ((len + 1) * sizeof (wchar_t)); + if (ret == 0) + return ret; + return (wcscpy (ret, ws)); +} +#endif /* !HAVE_WCSDUP */ + +static wchar_t * +remove_wpattern (wparam, wstrlen, wpattern, op) + wchar_t *wparam; + size_t wstrlen; + wchar_t *wpattern; + int op; +{ + wchar_t wc; + int n, n1; + wchar_t *ret; + + switch (op) + { + case RP_LONG_LEFT: /* remove longest match at start */ + for (n = wstrlen; n >= 0; n--) + { + wc = wparam[n]; wparam[n] = L'\0'; + if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wparam[n] = wc; + return (wcsdup (wparam + n)); + } + wparam[n] = wc; + } + break; + + case RP_SHORT_LEFT: /* remove shortest match at start */ + for (n = 0; n <= wstrlen; n++) + { + wc = wparam[n]; wparam[n] = L'\0'; + if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wparam[n] = wc; + return (wcsdup (wparam + n)); + } + wparam[n] = wc; + } + break; + + case RP_LONG_RIGHT: /* remove longest match at end */ + for (n = 0; n <= wstrlen; n++) + { + if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wc = wparam[n]; wparam[n] = L'\0'; + ret = wcsdup (wparam); + wparam[n] = wc; + return (ret); + } + } + break; + + case RP_SHORT_RIGHT: /* remove shortest match at end */ + for (n = wstrlen; n >= 0; n--) + { + if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH) + { + wc = wparam[n]; wparam[n] = L'\0'; + ret = wcsdup (wparam); + wparam[n] = wc; + return (ret); + } + } + break; + } + + return (wcsdup (wparam)); /* no match, return original string */ +} +#endif /* HANDLE_MULTIBYTE */ + +static char * +remove_pattern (param, pattern, op) + char *param, *pattern; + int op; +{ + if (param == NULL) + return (param); + if (*param == '\0' || pattern == NULL || *pattern == '\0') /* minor optimization */ + return (savestring (param)); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + { + wchar_t *ret, *oret; + size_t n; + wchar_t *wparam, *wpattern; + mbstate_t ps; + char *xret; + + n = xdupmbstowcs (&wpattern, NULL, pattern); + if (n == (size_t)-1) + return (remove_upattern (param, pattern, op)); + n = xdupmbstowcs (&wparam, NULL, param); + if (n == (size_t)-1) + { + free (wpattern); + return (remove_upattern (param, pattern, op)); + } + oret = ret = remove_wpattern (wparam, n, wpattern, op); + + free (wparam); + free (wpattern); + + n = strlen (param); + xret = xmalloc (n + 1); + memset (&ps, '\0', sizeof (mbstate_t)); + n = wcsrtombs (xret, (const wchar_t **)&ret, n, &ps); + xret[n] = '\0'; /* just to make sure */ + free (oret); + return xret; + } + else +#endif + return (remove_upattern (param, pattern, op)); +} + +/* Return 1 of the first character of STRING could match the first + character of pattern PAT. Used to avoid n2 calls to strmatch(). */ +static int +match_pattern_char (pat, string) + char *pat, *string; +{ + char c; + + if (*string == 0) + return (0); + + switch (c = *pat++) + { + default: + return (*string == c); + case '\\': + return (*string == *pat); + case '?': + return (*pat == LPAREN ? 1 : (*string != '\0')); + case '*': + return (1); + case '+': + case '!': + case '@': + return (*pat == LPAREN ? 1 : (*string == c)); + case '[': + return (*string != '\0'); + } +} + +/* Match PAT anywhere in STRING and return the match boundaries. + This returns 1 in case of a successful match, 0 otherwise. SP + and EP are pointers into the string where the match begins and + ends, respectively. MTYPE controls what kind of match is attempted. + MATCH_BEG and MATCH_END anchor the match at the beginning and end + of the string, respectively. The longest match is returned. */ +static int +match_upattern (string, pat, mtype, sp, ep) + char *string, *pat; + int mtype; + char **sp, **ep; +{ + int c, len; + register char *p, *p1; + char *end; + + len = STRLEN (string); + end = string + len; + + switch (mtype) + { + case MATCH_ANY: + for (p = string; p <= end; p++) + { + if (match_pattern_char (pat, p)) + { + for (p1 = end; p1 >= p; p1--) + { + c = *p1; *p1 = '\0'; + if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0) + { + *p1 = c; + *sp = p; + *ep = p1; + return 1; + } + *p1 = c; + } + } + } + + return (0); + + case MATCH_BEG: + if (match_pattern_char (pat, string) == 0) + return (0); + + for (p = end; p >= string; p--) + { + c = *p; *p = '\0'; + if (strmatch (pat, string, FNMATCH_EXTFLAG) == 0) + { + *p = c; + *sp = string; + *ep = p; + return 1; + } + *p = c; + } + + return (0); + + case MATCH_END: + for (p = string; p <= end; p++) + { + if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0) + { + *sp = p; + *ep = end; + return 1; + } + + } + + return (0); + } + + return (0); +} + +#if defined (HANDLE_MULTIBYTE) +/* Return 1 of the first character of WSTRING could match the first + character of pattern WPAT. Wide character version. */ +static int +match_pattern_wchar (wpat, wstring) + wchar_t *wpat, *wstring; +{ + wchar_t wc; + + if (*wstring == 0) + return (0); + + switch (wc = *wpat++) + { + default: + return (*wstring == wc); + case L'\\': + return (*wstring == *wpat); + case L'?': + return (*wpat == LPAREN ? 1 : (*wstring != L'\0')); + case L'*': + return (1); + case L'+': + case L'!': + case L'@': + return (*wpat == LPAREN ? 1 : (*wstring == wc)); + case L'[': + return (*wstring != L'\0'); + } +} + +/* Match WPAT anywhere in WSTRING and return the match boundaries. + This returns 1 in case of a successful match, 0 otherwise. Wide + character version. */ +static int +match_wpattern (wstring, indices, wstrlen, wpat, mtype, sp, ep) + wchar_t *wstring; + char **indices; + size_t wstrlen; + wchar_t *wpat; + int mtype; + char **sp, **ep; +{ + wchar_t wc; + int len; +#if 0 + size_t n, n1; /* Apple's gcc seems to miscompile this badly */ +#else + int n, n1; +#endif + + switch (mtype) + { + case MATCH_ANY: + for (n = 0; n <= wstrlen; n++) + { + if (match_pattern_wchar (wpat, wstring + n)) + { + for (n1 = wstrlen; n1 >= n; n1--) + { + wc = wstring[n1]; wstring[n1] = L'\0'; + if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0) + { + wstring[n1] = wc; + *sp = indices[n]; + *ep = indices[n1]; + return 1; + } + wstring[n1] = wc; + } + } + } + + return (0); + + case MATCH_BEG: + if (match_pattern_wchar (wpat, wstring) == 0) + return (0); + + for (n = wstrlen; n >= 0; n--) + { + wc = wstring[n]; wstring[n] = L'\0'; + if (wcsmatch (wpat, wstring, FNMATCH_EXTFLAG) == 0) + { + wstring[n] = wc; + *sp = indices[0]; + *ep = indices[n]; + return 1; + } + wstring[n] = wc; + } + + return (0); + + case MATCH_END: + for (n = 0; n <= wstrlen; n++) + { + if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0) + { + *sp = indices[n]; + *ep = indices[wstrlen]; + return 1; + } + } + + return (0); + } + + return (0); +} +#endif /* HANDLE_MULTIBYTE */ + +static int +match_pattern (string, pat, mtype, sp, ep) + char *string, *pat; + int mtype; + char **sp, **ep; +{ +#if defined (HANDLE_MULTIBYTE) + int ret; + size_t n; + wchar_t *wstring, *wpat; + char **indices; +#endif + + if (string == 0 || *string == 0 || pat == 0 || *pat == 0) + return (0); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + { + n = xdupmbstowcs (&wpat, NULL, pat); + if (n == (size_t)-1) + return (match_upattern (string, pat, mtype, sp, ep)); + n = xdupmbstowcs (&wstring, &indices, string); + if (n == (size_t)-1) + { + free (wpat); + return (match_upattern (string, pat, mtype, sp, ep)); + } + ret = match_wpattern (wstring, indices, n, wpat, mtype, sp, ep); + + free (wpat); + free (wstring); + free (indices); + + return (ret); + } + else +#endif + return (match_upattern (string, pat, mtype, sp, ep)); +} + +static int +getpatspec (c, value) + int c; + char *value; +{ + if (c == '#') + return ((*value == '#') ? RP_LONG_LEFT : RP_SHORT_LEFT); + else /* c == '%' */ + return ((*value == '%') ? RP_LONG_RIGHT : RP_SHORT_RIGHT); +} + +/* Posix.2 says that the WORD should be run through tilde expansion, + parameter expansion, command substitution and arithmetic expansion. + This leaves the result quoted, so quote_string_for_globbing () has + to be called to fix it up for strmatch (). If QUOTED is non-zero, + it means that the entire expression was enclosed in double quotes. + This means that quoting characters in the pattern do not make any + special pattern characters quoted. For example, the `*' in the + following retains its special meaning: "${foo#'*'}". */ +static char * +getpattern (value, quoted, expandpat) + char *value; + int quoted, expandpat; +{ + char *pat, *tword; + WORD_LIST *l; + int i; + + tword = xstrchr (value, '~') ? bash_tilde_expand (value, 0) : savestring (value); + + /* There is a problem here: how to handle single or double quotes in the + pattern string when the whole expression is between double quotes? + POSIX.2 says that enclosing double quotes do not cause the pattern to + be quoted, but does that leave us a problem with @ and array[@] and their + expansions inside a pattern? */ +#if 0 + if (expandpat && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *tword) + { + i = 0; + pat = string_extract_double_quoted (tword, &i, 1); + free (tword); + tword = pat; + } +#endif + + /* expand_string_for_rhs () leaves WORD quoted and does not perform + word splitting. */ + l = *tword ? expand_string_for_rhs (tword, + (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? Q_PATQUOTE : quoted, + (int *)NULL, (int *)NULL) + : (WORD_LIST *)0; + free (tword); + pat = string_list (l); + dispose_words (l); + if (pat) + { + tword = quote_string_for_globbing (pat, QGLOB_CVTNULL); + free (pat); + pat = tword; + } + return (pat); +} + +#if 0 +/* Handle removing a pattern from a string as a result of ${name%[%]value} + or ${name#[#]value}. */ +static char * +variable_remove_pattern (value, pattern, patspec, quoted) + char *value, *pattern; + int patspec, quoted; +{ + char *tword; + + tword = remove_pattern (value, pattern, patspec); + + return (tword); +} +#endif + +static char * +list_remove_pattern (list, pattern, patspec, itype, quoted) + WORD_LIST *list; + char *pattern; + int patspec, itype, quoted; +{ + WORD_LIST *new, *l; + WORD_DESC *w; + char *tword; + + for (new = (WORD_LIST *)NULL, l = list; l; l = l->next) + { + tword = remove_pattern (l->word->word, pattern, patspec); + w = make_bare_word (tword); + FREE (tword); + new = make_word_list (w, new); + } + + l = REVERSE_LIST (new, WORD_LIST *); + if (itype == '*') +#if 0 + tword = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? string_list_dollar_star (l) : string_list (l); +#else + tword = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (l) : string_list (l); +#endif + else + tword = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (l) : l); + + dispose_words (l); + return (tword); +} + +static char * +parameter_list_remove_pattern (itype, pattern, patspec, quoted) + int itype; + char *pattern; + int patspec, quoted; +{ + char *ret; + WORD_LIST *list; + + list = list_rest_of_args (); + if (list == 0) + return ((char *)NULL); + ret = list_remove_pattern (list, pattern, patspec, itype, quoted); + dispose_words (list); + return (ret); +} + +#if defined (ARRAY_VARS) +static char * +array_remove_pattern (a, pattern, patspec, varname, quoted) + ARRAY *a; + char *pattern; + int patspec; + char *varname; /* so we can figure out how it's indexed */ + int quoted; +{ + int itype; + char *ret; + WORD_LIST *list; + SHELL_VAR *v; + + /* compute itype from varname here */ + v = array_variable_part (varname, &ret, 0); + itype = ret[0]; + + list = array_to_word_list (a); + if (list == 0) + return ((char *)NULL); + ret = list_remove_pattern (list, pattern, patspec, itype, quoted); + dispose_words (list); + + return ret; +} +#endif /* ARRAY_VARS */ + +static char * +parameter_brace_remove_pattern (varname, value, patstr, rtype, quoted) + char *varname, *value, *patstr; + int rtype, quoted; +{ + int vtype, patspec, starsub; + char *temp1, *val, *pattern; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, quoted, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + patspec = getpatspec (rtype, patstr); + if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT) + patstr++; + + pattern = getpattern (patstr, quoted, 1); + + temp1 = (char *)NULL; /* shut up gcc */ + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + temp1 = remove_pattern (val, pattern, patspec); + if (vtype == VT_VARIABLE) + FREE (val); + if (temp1) + { + val = quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + temp1 = array_remove_pattern (array_cell (v), pattern, patspec, varname, quoted); + if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + { + val = quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; +#endif + case VT_POSPARMS: + temp1 = parameter_list_remove_pattern (varname[0], pattern, patspec, quoted); + if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0)) + { + val = quote_escapes (temp1); + free (temp1); + temp1 = val; + } + break; + } + + FREE (pattern); + return temp1; +} + +/******************************************* + * * + * Functions to expand WORD_DESCs * + * * + *******************************************/ + +/* Expand WORD, performing word splitting on the result. This does + parameter expansion, command substitution, arithmetic expansion, + word splitting, and quote removal. */ + +WORD_LIST * +expand_word (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_LIST *result, *tresult; + + tresult = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + result = word_list_split (tresult); + dispose_words (tresult); + return (result ? dequote_list (result) : result); +} + +/* Expand WORD, but do not perform word splitting on the result. This + does parameter expansion, command substitution, arithmetic expansion, + and quote removal. */ +WORD_LIST * +expand_word_unsplit (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_LIST *result; + + expand_no_split_dollar_star = 1; + result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + expand_no_split_dollar_star = 0; + + return (result ? dequote_list (result) : result); +} + +/* Perform shell expansions on WORD, but do not perform word splitting or + quote removal on the result. */ +WORD_LIST * +expand_word_leave_quoted (word, quoted) + WORD_DESC *word; + int quoted; +{ + return (call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL)); +} + +#if defined (PROCESS_SUBSTITUTION) + +/*****************************************************************/ +/* */ +/* Hacking Process Substitution */ +/* */ +/*****************************************************************/ + +#if !defined (HAVE_DEV_FD) +/* Named pipes must be removed explicitly with `unlink'. This keeps a list + of FIFOs the shell has open. unlink_fifo_list will walk the list and + unlink all of them. add_fifo_list adds the name of an open FIFO to the + list. NFIFO is a count of the number of FIFOs in the list. */ +#define FIFO_INCR 20 + +struct temp_fifo { + char *file; + pid_t proc; +}; + +static struct temp_fifo *fifo_list = (struct temp_fifo *)NULL; +static int nfifo; +static int fifo_list_size; + +static void +add_fifo_list (pathname) + char *pathname; +{ + if (nfifo >= fifo_list_size - 1) + { + fifo_list_size += FIFO_INCR; + fifo_list = (struct temp_fifo *)xrealloc (fifo_list, + fifo_list_size * sizeof (struct temp_fifo)); + } + + fifo_list[nfifo].file = savestring (pathname); + nfifo++; +} + +void +unlink_fifo_list () +{ + int saved, i, j; + + if (nfifo == 0) + return; + + for (i = saved = 0; i < nfifo; i++) + { + if ((fifo_list[i].proc == -1) || (kill(fifo_list[i].proc, 0) == -1)) + { + unlink (fifo_list[i].file); + free (fifo_list[i].file); + fifo_list[i].file = (char *)NULL; + fifo_list[i].proc = -1; + } + else + saved++; + } + + /* If we didn't remove some of the FIFOs, compact the list. */ + if (saved) + { + for (i = j = 0; i < nfifo; i++) + if (fifo_list[i].file) + { + fifo_list[j].file = fifo_list[i].file; + fifo_list[j].proc = fifo_list[i].proc; + j++; + } + nfifo = j; + } + else + nfifo = 0; +} + +static char * +make_named_pipe () +{ + char *tname; + + tname = sh_mktmpname ("sh-np", MT_USERANDOM); + if (mkfifo (tname, 0600) < 0) + { + free (tname); + return ((char *)NULL); + } + + add_fifo_list (tname); + return (tname); +} + +#else /* HAVE_DEV_FD */ + +/* DEV_FD_LIST is a bitmap of file descriptors attached to pipes the shell + has open to children. NFDS is a count of the number of bits currently + set in DEV_FD_LIST. TOTFDS is a count of the highest possible number + of open files. */ +static char *dev_fd_list = (char *)NULL; +static int nfds; +static int totfds; /* The highest possible number of open files. */ + +static void +add_fifo_list (fd) + int fd; +{ + if (!dev_fd_list || fd >= totfds) + { + int ofds; + + ofds = totfds; + totfds = getdtablesize (); + if (totfds < 0 || totfds > 256) + totfds = 256; + if (fd > totfds) + totfds = fd + 2; + + dev_fd_list = (char *)xrealloc (dev_fd_list, totfds); + memset (dev_fd_list + ofds, '\0', totfds - ofds); + } + + dev_fd_list[fd] = 1; + nfds++; +} + +void +unlink_fifo_list () +{ + register int i; + + if (nfds == 0) + return; + + for (i = 0; nfds && i < totfds; i++) + if (dev_fd_list[i]) + { + close (i); + dev_fd_list[i] = 0; + nfds--; + } + + nfds = 0; +} + +#if defined (NOTDEF) +print_dev_fd_list () +{ + register int i; + + fprintf (stderr, "pid %ld: dev_fd_list:", (long)getpid ()); + fflush (stderr); + + for (i = 0; i < totfds; i++) + { + if (dev_fd_list[i]) + fprintf (stderr, " %d", i); + } + fprintf (stderr, "\n"); +} +#endif /* NOTDEF */ + +static char * +make_dev_fd_filename (fd) + int fd; +{ + char *ret, intbuf[INT_STRLEN_BOUND (int) + 1], *p; + + ret = (char *)xmalloc (sizeof (DEV_FD_PREFIX) + 4); + + strcpy (ret, DEV_FD_PREFIX); + p = inttostr (fd, intbuf, sizeof (intbuf)); + strcpy (ret + sizeof (DEV_FD_PREFIX) - 1, p); + + add_fifo_list (fd); + return (ret); +} + +#endif /* HAVE_DEV_FD */ + +/* Return a filename that will open a connection to the process defined by + executing STRING. HAVE_DEV_FD, if defined, means open a pipe and return + a filename in /dev/fd corresponding to a descriptor that is one of the + ends of the pipe. If not defined, we use named pipes on systems that have + them. Systems without /dev/fd and named pipes are out of luck. + + OPEN_FOR_READ_IN_CHILD, if 1, means open the named pipe for reading or + use the read end of the pipe and dup that file descriptor to fd 0 in + the child. If OPEN_FOR_READ_IN_CHILD is 0, we open the named pipe for + writing or use the write end of the pipe in the child, and dup that + file descriptor to fd 1 in the child. The parent does the opposite. */ + +static char * +process_substitute (string, open_for_read_in_child) + char *string; + int open_for_read_in_child; +{ + char *pathname; + int fd, result; + pid_t old_pid, pid; +#if defined (HAVE_DEV_FD) + int parent_pipe_fd, child_pipe_fd; + int fildes[2]; +#endif /* HAVE_DEV_FD */ +#if defined (JOB_CONTROL) + pid_t old_pipeline_pgrp; +#endif + + if (!string || !*string || wordexp_only) + return ((char *)NULL); + +#if !defined (HAVE_DEV_FD) + pathname = make_named_pipe (); +#else /* HAVE_DEV_FD */ + if (pipe (fildes) < 0) + { + sys_error (_("cannot make pipe for process substitution")); + return ((char *)NULL); + } + /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of + the pipe in the parent, otherwise the read end. */ + parent_pipe_fd = fildes[open_for_read_in_child]; + child_pipe_fd = fildes[1 - open_for_read_in_child]; + /* Move the parent end of the pipe to some high file descriptor, to + avoid clashes with FDs used by the script. */ + parent_pipe_fd = move_to_high_fd (parent_pipe_fd, 1, 64); + + pathname = make_dev_fd_filename (parent_pipe_fd); +#endif /* HAVE_DEV_FD */ + + if (!pathname) + { + sys_error (_("cannot make pipe for process substitution")); + return ((char *)NULL); + } + + old_pid = last_made_pid; + +#if defined (JOB_CONTROL) + old_pipeline_pgrp = pipeline_pgrp; + pipeline_pgrp = shell_pgrp; + save_pipeline (1); +#endif /* JOB_CONTROL */ + + pid = make_child ((char *)NULL, 1); + if (pid == 0) + { + reset_terminating_signals (); /* XXX */ + free_pushed_string_input (); + /* Cancel traps, in trap.c. */ + restore_original_signals (); + setup_async_signals (); + subshell_environment |= SUBSHELL_COMSUB; + } + +#if defined (JOB_CONTROL) + set_sigchld_handler (); + stop_making_children (); + pipeline_pgrp = old_pipeline_pgrp; +#endif /* JOB_CONTROL */ + + if (pid < 0) + { + sys_error (_("cannot make child for process substitution")); + free (pathname); +#if defined (HAVE_DEV_FD) + close (parent_pipe_fd); + close (child_pipe_fd); +#endif /* HAVE_DEV_FD */ + return ((char *)NULL); + } + + if (pid > 0) + { +#if defined (JOB_CONTROL) + restore_pipeline (1); +#endif + +#if !defined (HAVE_DEV_FD) + fifo_list[nfifo-1].proc = pid; +#endif + + last_made_pid = old_pid; + +#if defined (JOB_CONTROL) && defined (PGRP_PIPE) + close_pgrp_pipe (); +#endif /* JOB_CONTROL && PGRP_PIPE */ + +#if defined (HAVE_DEV_FD) + close (child_pipe_fd); +#endif /* HAVE_DEV_FD */ + + return (pathname); + } + + set_sigint_handler (); + +#if defined (JOB_CONTROL) + set_job_control (0); +#endif /* JOB_CONTROL */ + +#if !defined (HAVE_DEV_FD) + /* Open the named pipe in the child. */ + fd = open (pathname, open_for_read_in_child ? O_RDONLY|O_NONBLOCK : O_WRONLY); + if (fd < 0) + { + /* Two separate strings for ease of translation. */ + if (open_for_read_in_child) + sys_error (_("cannot open named pipe %s for reading"), pathname); + else + sys_error (_("cannot open named pipe %s for writing"), pathname); + + exit (127); + } + if (open_for_read_in_child) + { + if (sh_unset_nodelay_mode (fd) < 0) + { + sys_error (_("cannout reset nodelay mode for fd %d"), fd); + exit (127); + } + } +#else /* HAVE_DEV_FD */ + fd = child_pipe_fd; +#endif /* HAVE_DEV_FD */ + + if (dup2 (fd, open_for_read_in_child ? 0 : 1) < 0) + { + sys_error (_("cannot duplicate named pipe %s as fd %d"), pathname, + open_for_read_in_child ? 0 : 1); + exit (127); + } + + if (fd != (open_for_read_in_child ? 0 : 1)) + close (fd); + + /* Need to close any files that this process has open to pipes inherited + from its parent. */ + if (current_fds_to_close) + { + close_fd_bitmap (current_fds_to_close); + current_fds_to_close = (struct fd_bitmap *)NULL; + } + +#if defined (HAVE_DEV_FD) + /* Make sure we close the parent's end of the pipe and clear the slot + in the fd list so it is not closed later, if reallocated by, for + instance, pipe(2). */ + close (parent_pipe_fd); + dev_fd_list[parent_pipe_fd] = 0; +#endif /* HAVE_DEV_FD */ + + result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST)); + +#if !defined (HAVE_DEV_FD) + /* Make sure we close the named pipe in the child before we exit. */ + close (open_for_read_in_child ? 0 : 1); +#endif /* !HAVE_DEV_FD */ + + exit (result); + /*NOTREACHED*/ +} +#endif /* PROCESS_SUBSTITUTION */ + +/***********************************/ +/* */ +/* Command Substitution */ +/* */ +/***********************************/ + +static char * +read_comsub (fd, quoted) + int fd, quoted; +{ + char *istring, buf[128], *bufp; + int istring_index, istring_size, c; + ssize_t bufn; + + istring = (char *)NULL; + istring_index = istring_size = bufn = 0; + +#ifdef __CYGWIN__ + setmode (fd, O_TEXT); /* we don't want CR/LF, we want Unix-style */ +#endif + + /* Read the output of the command through the pipe. */ + while (1) + { + if (fd < 0) + break; + if (--bufn <= 0) + { + bufn = zread (fd, buf, sizeof (buf)); + if (bufn <= 0) + break; + bufp = buf; + } + c = *bufp++; + + if (c == 0) + { +#if 0 + internal_warning ("read_comsub: ignored null byte in input"); +#endif + continue; + } + + /* Add the character to ISTRING, possibly after resizing it. */ + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE); + + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL) + istring[istring_index++] = CTLESC; + + istring[istring_index++] = c; + +#if 0 +#if defined (__CYGWIN__) + if (c == '\n' && istring_index > 1 && istring[istring_index - 2] == '\r') + { + istring_index--; + istring[istring_index - 1] = '\n'; + } +#endif +#endif + } + + if (istring) + istring[istring_index] = '\0'; + + /* If we read no output, just return now and save ourselves some + trouble. */ + if (istring_index == 0) + { + FREE (istring); + return (char *)NULL; + } + + /* Strip trailing newlines from the output of the command. */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + { + while (istring_index > 0) + { + if (istring[istring_index - 1] == '\n') + { + --istring_index; + + /* If the newline was quoted, remove the quoting char. */ + if (istring[istring_index - 1] == CTLESC) + --istring_index; + } + else + break; + } + istring[istring_index] = '\0'; + } + else + strip_trailing (istring, istring_index - 1, 1); + + return istring; +} + +/* Perform command substitution on STRING. This returns a string, + possibly quoted. */ +char * +command_substitute (string, quoted) + char *string; + int quoted; +{ + pid_t pid, old_pid, old_pipeline_pgrp; + char *istring; + int result, fildes[2], function_value, pflags, rc; + + istring = (char *)NULL; + + /* Don't fork () if there is no need to. In the case of no command to + run, just return NULL. */ + if (!string || !*string || (string[0] == '\n' && !string[1])) + return ((char *)NULL); + + if (wordexp_only && read_but_dont_execute) + { + last_command_exit_value = 125; + jump_to_top_level (EXITPROG); + } + + /* We're making the assumption here that the command substitution will + eventually run a command from the file system. Since we'll run + maybe_make_export_env in this subshell before executing that command, + the parent shell and any other shells it starts will have to remake + the environment. If we make it before we fork, other shells won't + have to. Don't bother if we have any temporary variable assignments, + though, because the export environment will be remade after this + command completes anyway, but do it if all the words to be expanded + are variable assignments. */ + if (subst_assign_varlist == 0 || garglist == 0) + maybe_make_export_env (); /* XXX */ + + /* Flags to pass to parse_and_execute() */ + pflags = interactive ? SEVAL_RESETLINE : 0; + + /* Pipe the output of executing STRING into the current shell. */ + if (pipe (fildes) < 0) + { + sys_error (_("cannot make pipe for command substitution")); + goto error_exit; + } + + old_pid = last_made_pid; +#if defined (JOB_CONTROL) + old_pipeline_pgrp = pipeline_pgrp; + /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */ + if ((subshell_environment & SUBSHELL_PIPE) == 0) + pipeline_pgrp = shell_pgrp; + cleanup_the_pipeline (); +#endif + + pid = make_child ((char *)NULL, 0); + if (pid == 0) + /* Reset the signal handlers in the child, but don't free the + trap strings. */ + reset_signal_handlers (); + +#if defined (JOB_CONTROL) + set_sigchld_handler (); + stop_making_children (); + pipeline_pgrp = old_pipeline_pgrp; +#else + stop_making_children (); +#endif /* JOB_CONTROL */ + + if (pid < 0) + { + sys_error (_("cannot make child for command substitution")); + error_exit: + + FREE (istring); + close (fildes[0]); + close (fildes[1]); + return ((char *)NULL); + } + + if (pid == 0) + { + set_sigint_handler (); /* XXX */ + + free_pushed_string_input (); + + if (dup2 (fildes[1], 1) < 0) + { + sys_error (_("command_substitute: cannot duplicate pipe as fd 1")); + exit (EXECUTION_FAILURE); + } + + /* If standard output is closed in the parent shell + (such as after `exec >&-'), file descriptor 1 will be + the lowest available file descriptor, and end up in + fildes[0]. This can happen for stdin and stderr as well, + but stdout is more important -- it will cause no output + to be generated from this command. */ + if ((fildes[1] != fileno (stdin)) && + (fildes[1] != fileno (stdout)) && + (fildes[1] != fileno (stderr))) + close (fildes[1]); + + if ((fildes[0] != fileno (stdin)) && + (fildes[0] != fileno (stdout)) && + (fildes[0] != fileno (stderr))) + close (fildes[0]); + + /* The currently executing shell is not interactive. */ + interactive = 0; + + /* This is a subshell environment. */ + subshell_environment |= SUBSHELL_COMSUB; + + /* When not in POSIX mode, command substitution does not inherit + the -e flag. */ + if (posixly_correct == 0) + exit_immediately_on_error = 0; + + remove_quoted_escapes (string); + + startup_state = 2; /* see if we can avoid a fork */ + /* Give command substitution a place to jump back to on failure, + so we don't go back up to main (). */ + result = setjmp (top_level); + + /* If we're running a command substitution inside a shell function, + trap `return' so we don't return from the function in the subshell + and go off to never-never land. */ + if (result == 0 && return_catch_flag) + function_value = setjmp (return_catch); + else + function_value = 0; + + if (result == ERREXIT) + rc = last_command_exit_value; + else if (result == EXITPROG) + rc = last_command_exit_value; + else if (result) + rc = EXECUTION_FAILURE; + else if (function_value) + rc = return_catch_value; + else + { + subshell_level++; + rc = parse_and_execute (string, "command substitution", pflags|SEVAL_NOHIST); + subshell_level--; + } + + last_command_exit_value = rc; + rc = run_exit_trap (); + exit (rc); + } + else + { +#if defined (JOB_CONTROL) && defined (PGRP_PIPE) + close_pgrp_pipe (); +#endif /* JOB_CONTROL && PGRP_PIPE */ + + close (fildes[1]); + + istring = read_comsub (fildes[0], quoted); + + close (fildes[0]); + + current_command_subst_pid = pid; + last_command_exit_value = wait_for (pid); + last_command_subst_pid = pid; + last_made_pid = old_pid; + +#if defined (JOB_CONTROL) + /* If last_command_exit_value > 128, then the substituted command + was terminated by a signal. If that signal was SIGINT, then send + SIGINT to ourselves. This will break out of loops, for instance. */ + if (last_command_exit_value == (128 + SIGINT) && last_command_exit_signal == SIGINT) + kill (getpid (), SIGINT); + + /* wait_for gives the terminal back to shell_pgrp. If some other + process group should have it, give it away to that group here. + pipeline_pgrp is non-zero only while we are constructing a + pipline, so what we are concerned about is whether or not that + pipeline was started in the background. A pipeline started in + the background should never get the tty back here. */ +#if 0 + if (interactive && pipeline_pgrp != (pid_t)0 && pipeline_pgrp != last_asynchronous_pid) +#else + if (interactive && pipeline_pgrp != (pid_t)0 && (subshell_environment & SUBSHELL_ASYNC) == 0) +#endif + give_terminal_to (pipeline_pgrp, 0); +#endif /* JOB_CONTROL */ + + return (istring); + } +} + +/******************************************************** + * * + * Utility functions for parameter expansion * + * * + ********************************************************/ + +#if defined (ARRAY_VARS) + +static arrayind_t +array_length_reference (s) + char *s; +{ + int len; + arrayind_t ind; + char *t, c; + ARRAY *array; + SHELL_VAR *var; + + var = array_variable_part (s, &t, &len); + + /* If unbound variables should generate an error, report one and return + failure. */ + if ((var == 0 || array_p (var) == 0) && unbound_vars_is_error) + { + c = *--t; + *t = '\0'; + err_unboundvar (s); + *t = c; + return (-1); + } + else if (var == 0) + return 0; + + /* We support a couple of expansions for variables that are not arrays. + We'll return the length of the value for v[0], and 1 for v[@] or + v[*]. Return 0 for everything else. */ + + array = array_p (var) ? array_cell (var) : (ARRAY *)NULL; + + if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']') + return (array_p (var) ? array_num_elements (array) : 1); + + ind = array_expand_index (t, len); + if (ind < 0) + { + err_badarraysub (t); + return (-1); + } + + if (array_p (var)) + t = array_reference (array, ind); + else + t = (ind == 0) ? value_cell (var) : (char *)NULL; + + len = STRLEN (t); + return (len); +} +#endif /* ARRAY_VARS */ + +static int +valid_brace_expansion_word (name, var_is_special) + char *name; + int var_is_special; +{ + if (DIGIT (*name) && all_digits (name)) + return 1; + else if (var_is_special) + return 1; +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + return 1; +#endif /* ARRAY_VARS */ + else if (legal_identifier (name)) + return 1; + else + return 0; +} + +static int +chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at) + char *name; + int quoted; + int *quoted_dollar_atp, *contains_dollar_at; +{ + char *temp1; + + if (name == 0) + { + if (quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + return 0; + } + + /* check for $@ and $* */ + if (name[0] == '@' && name[1] == 0) + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + else if (name[0] == '*' && name[1] == '\0' && quoted == 0) + { + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + + /* Now check for ${array[@]} and ${array[*]} */ +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + { + temp1 = xstrchr (name, '['); + if (temp1 && temp1[1] == '@' && temp1[2] == ']') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } /* [ */ + /* ${array[*]}, when unquoted, should be treated like ${array[@]}, + which should result in separate words even when IFS is unset. */ + if (temp1 && temp1[1] == '*' && temp1[2] == ']' && quoted == 0) + { + if (contains_dollar_at) + *contains_dollar_at = 1; + return 1; + } + } +#endif + return 0; +} + +/* Parameter expand NAME, and return a new string which is the expansion, + or NULL if there was no expansion. + VAR_IS_SPECIAL is non-zero if NAME is one of the special variables in + the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that + NAME was found inside of a double-quoted expression. */ +static char * +parameter_brace_expand_word (name, var_is_special, quoted) + char *name; + int var_is_special, quoted; +{ + char *temp, *tt; + intmax_t arg_index; + SHELL_VAR *var; + int atype; + + /* Handle multiple digit arguments, as in ${11}. */ + + if (legal_number (name, &arg_index)) + { + tt = get_dollar_var_value (arg_index); + if (tt) + temp = (*tt && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (tt) + : quote_escapes (tt); + else + temp = (char *)NULL; + FREE (tt); + } + else if (var_is_special) /* ${@} */ + { + int sindex; + tt = (char *)xmalloc (2 + strlen (name)); + tt[sindex = 0] = '$'; + strcpy (tt + 1, name); + + temp = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL, + (int *)NULL, (int *)NULL, 0); + free (tt); + } +#if defined (ARRAY_VARS) + else if (valid_array_reference (name)) + { + temp = array_value (name, quoted, &atype); + if (atype == 0 && temp) + temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (temp) + : quote_escapes (temp); + } +#endif + else if (var = find_variable (name)) + { + if (var_isset (var) && invisible_p (var) == 0) + { +#if defined (ARRAY_VARS) + temp = array_p (var) ? array_reference (array_cell (var), 0) : value_cell (var); +#else + temp = value_cell (var); +#endif + + if (temp) + temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) + ? quote_string (temp) + : quote_escapes (temp); + } + else + temp = (char *)NULL; + } + else + temp = (char *)NULL; + + return (temp); +} + +/* Expand an indirect reference to a variable: ${!NAME} expands to the + value of the variable whose name is the value of NAME. */ +static char * +parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at) + char *name; + int var_is_special, quoted; + int *quoted_dollar_atp, *contains_dollar_at; +{ + char *temp, *t; + + t = parameter_brace_expand_word (name, var_is_special, quoted); + /* Have to dequote here if necessary */ + if (t) + { + temp = (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + ? dequote_string (t) + : dequote_escapes (t); + free (t); + t = temp; + } + chk_atstar (t, quoted, quoted_dollar_atp, contains_dollar_at); + if (t == 0) + return (t); + temp = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted); + free (t); + return temp; +} + +/* Expand the right side of a parameter expansion of the form ${NAMEcVALUE}, + depending on the value of C, the separating character. C can be one of + "-", "+", or "=". QUOTED is true if the entire brace expression occurs + between double quotes. */ +static char * +parameter_brace_expand_rhs (name, value, c, quoted, qdollaratp, hasdollarat) + char *name, *value; + int c, quoted, *qdollaratp, *hasdollarat; +{ + WORD_LIST *l; + char *t, *t1, *temp; + int hasdol; + + /* XXX - Should we tilde expand in an assignment context if C is `='? */ + if (*value == '~') + temp = bash_tilde_expand (value, 0); + else if (xstrchr (value, '~') && unquoted_substring ("=~", value)) + temp = bash_tilde_expand (value, 1); + else + temp = savestring (value); + + /* If the entire expression is between double quotes, we want to treat + the value as a double-quoted string, with the exception that we strip + embedded unescaped double quotes. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *temp) + { + hasdol = 0; + t = string_extract_double_quoted (temp, &hasdol, 1); + free (temp); + temp = t; + } + + hasdol = 0; + /* XXX was 0 not quoted */ + l = *temp ? expand_string_for_rhs (temp, quoted, &hasdol, (int *)NULL) + : (WORD_LIST *)0; + if (hasdollarat) + *hasdollarat = hasdol || (l && l->next); + free (temp); + if (l) + { + /* The expansion of TEMP returned something. We need to treat things + slightly differently if HASDOL is non-zero. If we have "$@", the + individual words have already been quoted. We need to turn them + into a string with the words separated by the first character of + $IFS without any additional quoting, so string_list_dollar_at won't + do the right thing. We use string_list_dollar_star instead. */ + temp = (hasdol || l->next) ? string_list_dollar_star (l) : string_list (l); + + /* If l->next is not null, we know that TEMP contained "$@", since that + is the only expansion that creates more than one word. */ + if (qdollaratp && ((hasdol && quoted) || l->next)) + *qdollaratp = 1; + dispose_words (l); + } + else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol) + { + /* The brace expansion occurred between double quotes and there was + a $@ in TEMP. It does not matter if the $@ is quoted, as long as + it does not expand to anything. In this case, we want to return + a quoted empty string. */ + temp = (char *)xmalloc (2); + temp[0] = CTLNUL; + temp[1] = '\0'; + } + else + temp = (char *)NULL; + + if (c == '-' || c == '+') + return (temp); + + /* c == '=' */ + t = temp ? savestring (temp) : savestring (""); + t1 = dequote_string (t); + free (t); +#if defined (ARRAY_VARS) + if (valid_array_reference (name)) + assign_array_element (name, t1); + else +#endif /* ARRAY_VARS */ + bind_variable (name, t1); + free (t1); + return (temp); +} + +/* Deal with the right hand side of a ${name:?value} expansion in the case + that NAME is null or not set. If VALUE is non-null it is expanded and + used as the error message to print, otherwise a standard message is + printed. */ +static void +parameter_brace_expand_error (name, value) + char *name, *value; +{ + WORD_LIST *l; + char *temp; + + if (value && *value) + { + if (*value == '~') + temp = bash_tilde_expand (value, 0); + else if (xstrchr (value, '~') && unquoted_substring ("=~", value)) + temp = bash_tilde_expand (value, 1); + else + temp = savestring (value); + + l = expand_string (temp, 0); + FREE (temp); + temp = string_list (l); + report_error ("%s: %s", name, temp ? temp : ""); /* XXX was value not "" */ + FREE (temp); + dispose_words (l); + } + else + report_error (_("%s: parameter null or not set"), name); + + /* Free the data we have allocated during this expansion, since we + are about to longjmp out. */ + free (name); + FREE (value); +} + +/* Return 1 if NAME is something for which parameter_brace_expand_length is + OK to do. */ +static int +valid_length_expression (name) + char *name; +{ + return (name[1] == '\0' || /* ${#} */ + ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0') || /* special param */ + (DIGIT (name[1]) && all_digits (name + 1)) || /* ${#11} */ +#if defined (ARRAY_VARS) + valid_array_reference (name + 1) || /* ${#a[7]} */ +#endif + legal_identifier (name + 1)); /* ${#PS1} */ +} + +/* Handle the parameter brace expansion that requires us to return the + length of a parameter. */ +static intmax_t +parameter_brace_expand_length (name) + char *name; +{ + char *t, *newname; + intmax_t number, arg_index; + WORD_LIST *list; +#if defined (ARRAY_VARS) + SHELL_VAR *var; +#endif + + if (name[1] == '\0') /* ${#} */ + number = number_of_args (); + else if ((name[1] == '@' || name[1] == '*') && name[2] == '\0') /* ${#@}, ${#*} */ + number = number_of_args (); + else if ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0') + { + /* Take the lengths of some of the shell's special parameters. */ + switch (name[1]) + { + case '-': + t = which_set_flags (); + break; + case '?': + t = itos (last_command_exit_value); + break; + case '$': + t = itos (dollar_dollar_pid); + break; + case '!': + if (last_asynchronous_pid == NO_PID) + t = (char *)NULL; + else + t = itos (last_asynchronous_pid); + break; + case '#': + t = itos (number_of_args ()); + break; + } + number = STRLEN (t); + FREE (t); + } +#if defined (ARRAY_VARS) + else if (valid_array_reference (name + 1)) + number = array_length_reference (name + 1); +#endif /* ARRAY_VARS */ + else + { + number = 0; + + if (legal_number (name + 1, &arg_index)) /* ${#1} */ + { + t = get_dollar_var_value (arg_index); + number = STRLEN (t); + FREE (t); + } +#if defined (ARRAY_VARS) + else if ((var = find_variable (name + 1)) && array_p (var)) + { + t = array_reference (array_cell (var), 0); + number = STRLEN (t); + } +#endif + else /* ${#PS1} */ + { + newname = savestring (name); + newname[0] = '$'; + list = expand_string (newname, Q_DOUBLE_QUOTES); + t = list ? string_list (list) : (char *)NULL; + free (newname); + if (list) + dispose_words (list); + + number = STRLEN (t); + FREE (t); + } + } + + return (number); +} + +/* Skip characters in SUBSTR until DELIM. SUBSTR is an arithmetic expression, + so we do some ad-hoc parsing of an arithmetic expression to find + the first DELIM, instead of using strchr(3). Two rules: + 1. If the substring contains a `(', read until closing `)'. + 2. If the substring contains a `?', read past one `:' for each `?'. +*/ + +static char * +skiparith (substr, delim) + char *substr; + int delim; +{ + size_t sublen; + int skipcol, pcount, i; + DECLARE_MBSTATE; + + sublen = strlen (substr); + i = skipcol = pcount = 0; + while (substr[i]) + { + /* Balance parens */ + if (substr[i] == LPAREN) + { + pcount++; + i++; + continue; + } + if (substr[i] == RPAREN && pcount) + { + pcount--; + i++; + continue; + } + if (pcount) + { + ADVANCE_CHAR (substr, sublen, i); + continue; + } + + /* Skip one `:' for each `?' */ + if (substr[i] == ':' && skipcol) + { + skipcol--; + i++; + continue; + } + if (substr[i] == delim) + break; + if (substr[i] == '?') + { + skipcol++; + i++; + continue; + } + ADVANCE_CHAR (substr, sublen, i); + } + + return (substr + i); +} + +/* Verify and limit the start and end of the desired substring. If + VTYPE == 0, a regular shell variable is being used; if it is 1, + then the positional parameters are being used; if it is 2, then + VALUE is really a pointer to an array variable that should be used. + Return value is 1 if both values were OK, 0 if there was a problem + with an invalid expression, or -1 if the values were out of range. */ +static int +verify_substring_values (value, substr, vtype, e1p, e2p) + char *value, *substr; + int vtype; + intmax_t *e1p, *e2p; +{ + char *t, *temp1, *temp2; + arrayind_t len; + int expok; +#if defined (ARRAY_VARS) + ARRAY *a; +#endif + + /* duplicate behavior of strchr(3) */ + t = skiparith (substr, ':'); + if (*t && *t == ':') + *t = '\0'; + else + t = (char *)0; + + temp1 = expand_string_if_necessary (substr, Q_DOUBLE_QUOTES, expand_string); + *e1p = evalexp (temp1, &expok); + free (temp1); + if (expok == 0) + return (0); + + len = -1; /* paranoia */ + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + len = strlen (value); + break; + case VT_POSPARMS: + len = number_of_args () + 1; + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + a = (ARRAY *)value; + /* For arrays, the first value deals with array indices. */ + len = array_max_index (a); /* arrays index from 0 to n - 1 */ + break; +#endif + } + + if (len == -1) /* paranoia */ + return -1; + + if (*e1p < 0) /* negative offsets count from end */ + *e1p += len; + + if (*e1p >= len || *e1p < 0) + return (-1); + +#if defined (ARRAY_VARS) + /* For arrays, the second offset deals with the number of elements. */ + if (vtype == VT_ARRAYVAR) + len = array_num_elements (a); +#endif + + if (t) + { + t++; + temp2 = savestring (t); + temp1 = expand_string_if_necessary (temp2, Q_DOUBLE_QUOTES, expand_string); + free (temp2); + t[-1] = ':'; + *e2p = evalexp (temp1, &expok); + free (temp1); + if (expok == 0) + return (0); + if (*e2p < 0) + { + internal_error (_("%s: substring expression < 0"), t); + return (0); + } +#if defined (ARRAY_VARS) + /* In order to deal with sparse arrays, push the intelligence about how + to deal with the number of elements desired down to the array- + specific functions. */ + if (vtype != VT_ARRAYVAR) +#endif + { + *e2p += *e1p; /* want E2 chars starting at E1 */ + if (*e2p > len) + *e2p = len; + } + } + else + *e2p = len; + + return (1); +} + +/* Return the type of variable specified by VARNAME (simple variable, + positional param, or array variable). Also return the value specified + by VARNAME (value of a variable or a reference to an array element). + If this returns VT_VARIABLE, the caller assumes that CTLESC and CTLNUL + characters in the value are quoted with CTLESC and takes appropriate + steps. For convenience, *VALP is set to the dequoted VALUE. */ +static int +get_var_and_type (varname, value, quoted, varp, valp) + char *varname, *value; + int quoted; + SHELL_VAR **varp; + char **valp; +{ + int vtype; + char *temp; +#if defined (ARRAY_VARS) + SHELL_VAR *v; +#endif + + /* This sets vtype to VT_VARIABLE or VT_POSPARMS */ + vtype = (varname[0] == '@' || varname[0] == '*') && varname[1] == '\0'; + if (vtype == VT_POSPARMS && varname[0] == '*') + vtype |= VT_STARSUB; + *varp = (SHELL_VAR *)NULL; + +#if defined (ARRAY_VARS) + if (valid_array_reference (varname)) + { + v = array_variable_part (varname, &temp, (int *)0); + if (v && array_p (v)) + { /* [ */ + if (ALL_ELEMENT_SUB (temp[0]) && temp[1] == ']') + { + vtype = VT_ARRAYVAR; + if (temp[0] == '*') + vtype |= VT_STARSUB; + *valp = (char *)array_cell (v); + } + else + { + vtype = VT_ARRAYMEMBER; + *valp = array_value (varname, 1, (int *)NULL); + } + *varp = v; + } + else + return -1; + } + else if ((v = find_variable (varname)) && array_p (v)) + { + vtype = VT_ARRAYMEMBER; + *varp = v; + *valp = array_reference (array_cell (v), 0); + } + else +#endif +#if 1 + { + if (value && vtype == VT_VARIABLE) + { + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + *valp = dequote_string (value); + else + *valp = dequote_escapes (value); + } + else + *valp = value; + } +#else + *valp = (value && vtype == VT_VARIABLE) ? dequote_escapes (value) : value; +#endif + + return vtype; +} + +/******************************************************/ +/* */ +/* Functions to extract substrings of variable values */ +/* */ +/******************************************************/ + +#if defined (HANDLE_MULTIBYTE) +/* Character-oriented rather than strictly byte-oriented substrings. S and + E, rather being strict indices into STRING, indicate character (possibly + multibyte character) positions that require calculation. + Used by the ${param:offset[:length]} expansion. */ +static char * +mb_substring (string, s, e) + char *string; + int s, e; +{ + char *tt; + int start, stop, i, slen; + DECLARE_MBSTATE; + + start = 0; + slen = STRLEN (string); + + i = s; + while (string[start] && i--) + ADVANCE_CHAR (string, slen, start); + stop = start; + i = e - s; + while (string[stop] && i--) + ADVANCE_CHAR (string, slen, stop); + tt = substring (string, start, stop); + return tt; +} +#endif + +/* Process a variable substring expansion: ${name:e1[:e2]}. If VARNAME + is `@', use the positional parameters; otherwise, use the value of + VARNAME. If VARNAME is an array variable, use the array elements. */ + +static char * +parameter_brace_substring (varname, value, substr, quoted) + char *varname, *value, *substr; + int quoted; +{ + intmax_t e1, e2; + int vtype, r, starsub; + char *temp, *val, *tt; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, quoted, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + r = verify_substring_values (val, substr, vtype, &e1, &e2); + if (r <= 0) + return ((r == 0) ? &expand_param_error : (char *)NULL); + + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1) + tt = mb_substring (val, e1, e2); + else +#endif + tt = substring (val, e1, e2); + + if (vtype == VT_VARIABLE) + FREE (val); + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) + temp = quote_string (tt); + else + temp = tt ? quote_escapes (tt) : (char *)NULL; + FREE (tt); + break; + case VT_POSPARMS: + tt = pos_params (varname, e1, e2, quoted); + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) + { + temp = tt ? quote_escapes (tt) : (char *)NULL; + FREE (tt); + } + else + temp = tt; + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + /* We want E2 to be the number of elements desired (arrays can be sparse, + so verify_substring_values just returns the numbers specified and we + rely on array_subrange to understand how to deal with them). */ + tt = array_subrange (array_cell (v), e1, e2, starsub, quoted); + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) + { + temp = tt ? quote_escapes (tt) : (char *)NULL; + FREE (tt); + } + else + temp = tt; + break; +#endif + default: + temp = (char *)NULL; + } + + return temp; +} + +/****************************************************************/ +/* */ +/* Functions to perform pattern substitution on variable values */ +/* */ +/****************************************************************/ + +char * +pat_subst (string, pat, rep, mflags) + char *string, *pat, *rep; + int mflags; +{ + char *ret, *s, *e, *str; + int rsize, rptr, l, replen, mtype; + + mtype = mflags & MATCH_TYPEMASK; + + /* Special cases: + * 1. A null pattern with mtype == MATCH_BEG means to prefix STRING + * with REP and return the result. + * 2. A null pattern with mtype == MATCH_END means to append REP to + * STRING and return the result. + */ + if ((pat == 0 || *pat == 0) && (mtype == MATCH_BEG || mtype == MATCH_END)) + { + replen = STRLEN (rep); + l = strlen (string); + ret = (char *)xmalloc (replen + l + 2); + if (replen == 0) + strcpy (ret, string); + else if (mtype == MATCH_BEG) + { + strcpy (ret, rep); + strcpy (ret + replen, string); + } + else + { + strcpy (ret, string); + strcpy (ret + l, rep); + } + return (ret); + } + + ret = (char *)xmalloc (rsize = 64); + ret[0] = '\0'; + + for (replen = STRLEN (rep), rptr = 0, str = string;;) + { + if (match_pattern (str, pat, mtype, &s, &e) == 0) + break; + l = s - str; + RESIZE_MALLOCED_BUFFER (ret, rptr, (l + replen), rsize, 64); + + /* OK, now copy the leading unmatched portion of the string (from + str to s) to ret starting at rptr (the current offset). Then copy + the replacement string at ret + rptr + (s - str). Increment + rptr (if necessary) and str and go on. */ + if (l) + { + strncpy (ret + rptr, str, l); + rptr += l; + } + if (replen) + { + strncpy (ret + rptr, rep, replen); + rptr += replen; + } + str = e; /* e == end of match */ + + if (((mflags & MATCH_GLOBREP) == 0) || mtype != MATCH_ANY) + break; + + if (s == e) + e++, str++; /* avoid infinite recursion on zero-length match */ + } + + /* Now copy the unmatched portion of the input string */ + if (*str) + { + RESIZE_MALLOCED_BUFFER (ret, rptr, STRLEN(str) + 1, rsize, 64); + strcpy (ret + rptr, str); + } + else + ret[rptr] = '\0'; + + return ret; +} + +/* Do pattern match and replacement on the positional parameters. */ +static char * +pos_params_pat_subst (string, pat, rep, mflags) + char *string, *pat, *rep; + int mflags; +{ + WORD_LIST *save, *params; + WORD_DESC *w; + char *ret, *tt; + + save = params = list_rest_of_args (); + if (save == 0) + return ((char *)NULL); + + for ( ; params; params = params->next) + { + ret = pat_subst (params->word->word, pat, rep, mflags); + w = make_bare_word (ret); + dispose_word (params->word); + params->word = w; + FREE (ret); + } + + if ((mflags & (MATCH_QUOTED|MATCH_STARSUB)) == (MATCH_QUOTED|MATCH_STARSUB)) + ret = string_list_dollar_star (quote_list (save)); + else + ret = string_list ((mflags & MATCH_QUOTED) ? quote_list (save) : save); + dispose_words (save); + + return (ret); +} + +/* Perform pattern substitution on VALUE, which is the expansion of + VARNAME. PATSUB is an expression supplying the pattern to match + and the string to substitute. QUOTED is a flags word containing + the type of quoting currently in effect. */ +static char * +parameter_brace_patsub (varname, value, patsub, quoted) + char *varname, *value, *patsub; + int quoted; +{ + int vtype, mflags, starsub; + char *val, *temp, *pat, *rep, *p, *lpatsub, *tt; + SHELL_VAR *v; + + if (value == 0) + return ((char *)NULL); + + this_command_name = varname; + + vtype = get_var_and_type (varname, value, quoted, &v, &val); + if (vtype == -1) + return ((char *)NULL); + + starsub = vtype & VT_STARSUB; + vtype &= ~VT_STARSUB; + + mflags = 0; + if (*patsub == '/') + { + mflags |= MATCH_GLOBREP; + patsub++; + } + + /* Malloc this because expand_string_if_necessary or one of the expansion + functions in its call chain may free it on a substitution error. */ + lpatsub = savestring (patsub); + + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + mflags |= MATCH_QUOTED; + + if (starsub) + mflags |= MATCH_STARSUB; + + if (rep = quoted_strchr (lpatsub, '/', ST_BACKSL)) + *rep++ = '\0'; + else + rep = (char *)NULL; + + if (rep && *rep == '\0') + rep = (char *)NULL; + +#if 0 + /* Expand PAT and REP for command, variable and parameter, arithmetic, + and process substitution. Also perform quote removal. Do not + perform word splitting or filename generation. */ + pat = expand_string_if_necessary (lpatsub, (quoted & ~Q_DOUBLE_QUOTES), expand_string_unsplit); +#else + /* Perform the same expansions on the pattern as performed by the + pattern removal expansions. */ + pat = getpattern (lpatsub, quoted, 1); +#endif + + if (rep) + { + if ((mflags & MATCH_QUOTED) == 0) + rep = expand_string_if_necessary (rep, quoted, expand_string_unsplit); + else + rep = expand_string_to_string_internal (rep, quoted, expand_string_unsplit); + } + + p = pat; + if (pat && pat[0] == '#') + { + mflags |= MATCH_BEG; + p++; + } + else if (pat && pat[0] == '%') + { + mflags |= MATCH_END; + p++; + } + else + mflags |= MATCH_ANY; + + /* OK, we now want to substitute REP for PAT in VAL. If + flags & MATCH_GLOBREP is non-zero, the substitution is done + everywhere, otherwise only the first occurrence of PAT is + replaced. The pattern matching code doesn't understand + CTLESC quoting CTLESC and CTLNUL so we use the dequoted variable + values passed in (VT_VARIABLE) so the pattern substitution + code works right. We need to requote special chars after + we're done for VT_VARIABLE and VT_ARRAYMEMBER, and for the + other cases if QUOTED == 0, since the posparams and arrays + indexed by * or @ do special things when QUOTED != 0. */ + + switch (vtype) + { + case VT_VARIABLE: + case VT_ARRAYMEMBER: + temp = pat_subst (val, p, rep, mflags); + if (vtype == VT_VARIABLE) + FREE (val); + if (temp) + { + tt = quote_escapes (temp); + free (temp); + temp = tt; + } + break; + case VT_POSPARMS: + temp = pos_params_pat_subst (val, p, rep, mflags); + if (temp && (mflags & MATCH_QUOTED) == 0) + { + tt = quote_escapes (temp); + free (temp); + temp = tt; + } + break; +#if defined (ARRAY_VARS) + case VT_ARRAYVAR: + temp = array_patsub (array_cell (v), p, rep, mflags); + if (temp && (mflags & MATCH_QUOTED) == 0) + { + tt = quote_escapes (temp); + free (temp); + temp = tt; + } + break; +#endif + } + + FREE (pat); + FREE (rep); + free (lpatsub); + + return temp; +} + +/****************************************************************/ +/* */ +/* Functions to perform parameter expansion on a string */ +/* */ +/****************************************************************/ + +/* ${[#][!]name[[:]#[#]%[%]-=?+[word][:e1[:e2]]]} */ +static char * +parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_dollar_at) + char *string; + int *indexp, quoted, *quoted_dollar_atp, *contains_dollar_at; +{ + int check_nullness, var_is_set, var_is_null, var_is_special; + int want_substring, want_indir, want_patsub; + char *name, *value, *temp, *temp1; + int t_index, sindex, c; + intmax_t number; + + value = (char *)NULL; + var_is_set = var_is_null = var_is_special = check_nullness = 0; + want_substring = want_indir = want_patsub = 0; + + sindex = *indexp; + t_index = ++sindex; + name = string_extract (string, &t_index, "#%:-=?+/}", EX_VARNAME); + + /* If the name really consists of a special variable, then make sure + that we have the entire name. We don't allow indirect references + to special variables except `#', `?', `@' and `*'. */ + if ((sindex == t_index && + (string[t_index] == '-' || + string[t_index] == '?' || + string[t_index] == '#')) || + (sindex == t_index - 1 && string[sindex] == '!' && + (string[t_index] == '#' || + string[t_index] == '?' || + string[t_index] == '@' || + string[t_index] == '*'))) + { + t_index++; + free (name); + temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); + name = (char *)xmalloc (3 + (strlen (temp1))); + *name = string[sindex]; + if (string[sindex] == '!') + { + /* indirect reference of $#, $?, $@, or $* */ + name[1] = string[sindex + 1]; + strcpy (name + 2, temp1); + } + else + strcpy (name + 1, temp1); + free (temp1); + } + sindex = t_index; + + /* Find out what character ended the variable name. Then + do the appropriate thing. */ + if (c = string[sindex]) + sindex++; + + /* If c is followed by one of the valid parameter expansion + characters, move past it as normal. If not, assume that + a substring specification is being given, and do not move + past it. */ + if (c == ':' && VALID_PARAM_EXPAND_CHAR (string[sindex])) + { + check_nullness++; + if (c = string[sindex]) + sindex++; + } + else if (c == ':' && string[sindex] != RBRACE) + want_substring = 1; + else if (c == '/' && string[sindex] != RBRACE) + want_patsub = 1; + + /* Catch the valid and invalid brace expressions that made it through the + tests above. */ + /* ${#-} is a valid expansion and means to take the length of $-. + Similarly for ${#?} and ${##}... */ + if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 && + VALID_SPECIAL_LENGTH_PARAM (c) && string[sindex] == RBRACE) + { + name = (char *)xrealloc (name, 3); + name[1] = c; + name[2] = '\0'; + c = string[sindex++]; + } + + /* ...but ${#%}, ${#:}, ${#=}, ${#+}, and ${#/} are errors. */ + if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 && + member (c, "%:=+/") && string[sindex] == RBRACE) + { + temp = (char *)NULL; + goto bad_substitution; + } + + /* Indirect expansion begins with a `!'. A valid indirect expansion is + either a variable name, one of the positional parameters or a special + variable that expands to one of the positional parameters. */ + want_indir = *name == '!' && + (legal_variable_starter ((unsigned char)name[1]) || DIGIT (name[1]) + || VALID_INDIR_PARAM (name[1])); + + /* Determine the value of this variable. */ + + /* Check for special variables, directly referenced. */ + if (SPECIAL_VAR (name, want_indir)) + var_is_special++; + + /* Check for special expansion things, like the length of a parameter */ + if (*name == '#' && name[1]) + { + /* If we are not pointing at the character just after the + closing brace, then we haven't gotten all of the name. + Since it begins with a special character, this is a bad + substitution. Also check NAME for validity before trying + to go on. */ + if (string[sindex - 1] != RBRACE || (valid_length_expression (name) == 0)) + { + temp = (char *)NULL; + goto bad_substitution; + } + + number = parameter_brace_expand_length (name); + free (name); + + *indexp = sindex; + return ((number < 0) ? &expand_param_error : itos (number)); + } + + /* ${@} is identical to $@. */ + if (name[0] == '@' && name[1] == '\0') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + + if (contains_dollar_at) + *contains_dollar_at = 1; + } + + /* Process ${!PREFIX*} expansion. */ + if (want_indir && string[sindex - 1] == RBRACE && + (string[sindex - 2] == '*' || string[sindex - 2] == '@') && + legal_variable_starter ((unsigned char) name[1])) + { + char **x; + WORD_LIST *xlist; + + temp1 = savestring (name + 1); + number = strlen (temp1); + temp1[number - 1] = '\0'; + x = all_variables_matching_prefix (temp1); + xlist = strvec_to_word_list (x, 0, 0); + if (string[sindex - 2] == '*') + temp = string_list_dollar_star (xlist); + else + { + temp = string_list_dollar_at (xlist, quoted); + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + } + free (x); + free (xlist); + free (temp1); + *indexp = sindex; + return (temp); + } + +#if defined (ARRAY_VARS) + /* Process ${!ARRAY[@]} and ${!ARRAY[*]} expansion. */ /* [ */ + if (want_indir && string[sindex - 1] == RBRACE && + string[sindex - 2] == ']' && valid_array_reference (name+1)) + { + char *x, *x1; + + temp1 = savestring (name + 1); + x = array_variable_name (temp1, &x1, (int *)0); /* [ */ + FREE (x); + if (ALL_ELEMENT_SUB (x1[0]) && x1[1] == ']') + { + temp = array_keys (temp1, quoted); + if (x1[0] == '@') + { + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + } + + free (temp1); + *indexp = sindex; + return (temp); + } + + free (temp1); + } +#endif /* ARRAY_VARS */ + + /* Make sure that NAME is valid before trying to go on. */ + if (valid_brace_expansion_word (want_indir ? name + 1 : name, + var_is_special) == 0) + { + temp = (char *)NULL; + goto bad_substitution; + } + + if (want_indir) + temp = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); + else + temp = parameter_brace_expand_word (name, var_is_special, quoted); + +#if defined (ARRAY_VARS) + if (valid_array_reference (name)) + chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at); +#endif + + var_is_set = temp != (char *)0; + var_is_null = check_nullness && (var_is_set == 0 || *temp == 0); + + /* Get the rest of the stuff inside the braces. */ + if (c && c != RBRACE) + { + /* Extract the contents of the ${ ... } expansion + according to the Posix.2 rules. */ + value = extract_dollar_brace_string (string, &sindex, quoted, 0); + if (string[sindex] == RBRACE) + sindex++; + else + goto bad_substitution; + } + else + value = (char *)NULL; + + *indexp = sindex; + + /* If this is a substring spec, process it and add the result. */ + if (want_substring) + { + temp1 = parameter_brace_substring (name, temp, value, quoted); + FREE (name); + FREE (value); + FREE (temp); + return (temp1); + } + else if (want_patsub) + { + temp1 = parameter_brace_patsub (name, temp, value, quoted); + FREE (name); + FREE (value); + FREE (temp); + return (temp1); + } + + /* Do the right thing based on which character ended the variable name. */ + switch (c) + { + default: + case '\0': + bad_substitution: + report_error (_("%s: bad substitution"), string ? string : "??"); + FREE (value); + FREE (temp); + free (name); + return &expand_param_error; + + case RBRACE: + if (var_is_set == 0 && unbound_vars_is_error) + { + err_unboundvar (name); + FREE (value); + FREE (temp); + free (name); + last_command_exit_value = EXECUTION_FAILURE; + return (interactive_shell ? &expand_param_error : &expand_param_fatal); + } + break; + + case '#': /* ${param#[#]pattern} */ + case '%': /* ${param%[%]pattern} */ + if (value == 0 || *value == '\0' || temp == 0 || *temp == '\0') + { + FREE (value); + break; + } + temp1 = parameter_brace_remove_pattern (name, temp, value, c, quoted); + free (temp); + free (value); + temp = temp1; + break; + + case '-': + case '=': + case '?': + case '+': + if (var_is_set && var_is_null == 0) + { + /* If the operator is `+', we don't want the value of the named + variable for anything, just the value of the right hand side. */ + + if (c == '+') + { + /* XXX -- if we're double-quoted and the named variable is "$@", + we want to turn off any special handling of "$@" -- + we're not using it, so whatever is on the rhs applies. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + + FREE (temp); + if (value) + { + temp = parameter_brace_expand_rhs (name, value, c, + quoted, + quoted_dollar_atp, + contains_dollar_at); + free (value); + } + else + temp = (char *)NULL; + } + else + { + FREE (value); + } + /* Otherwise do nothing; just use the value in TEMP. */ + } + else /* VAR not set or VAR is NULL. */ + { + FREE (temp); + temp = (char *)NULL; + if (c == '=' && var_is_special) + { + report_error (_("$%s: cannot assign in this way"), name); + free (name); + free (value); + return &expand_param_error; + } + else if (c == '?') + { + parameter_brace_expand_error (name, value); + return (interactive_shell ? &expand_param_error : &expand_param_fatal); + } + else if (c != '+') + { + /* XXX -- if we're double-quoted and the named variable is "$@", + we want to turn off any special handling of "$@" -- + we're not using it, so whatever is on the rhs applies. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp) + *quoted_dollar_atp = 0; + if (contains_dollar_at) + *contains_dollar_at = 0; + + temp = parameter_brace_expand_rhs (name, value, c, quoted, + quoted_dollar_atp, + contains_dollar_at); + } + free (value); + } + + break; + } + free (name); + return (temp); +} + +/* Expand a single ${xxx} expansion. The braces are optional. When + the braces are used, parameter_brace_expand() does the work, + possibly calling param_expand recursively. */ +static char * +param_expand (string, sindex, quoted, expanded_something, + contains_dollar_at, quoted_dollar_at_p, had_quoted_null_p, + pflags) + char *string; + int *sindex, quoted, *expanded_something, *contains_dollar_at; + int *quoted_dollar_at_p, *had_quoted_null_p, pflags; +{ + char *temp, *temp1, uerror[3]; + int zindex, t_index, expok; + unsigned char c; + intmax_t number; + SHELL_VAR *var; + WORD_LIST *list; + + zindex = *sindex; + c = string[++zindex]; + + temp = (char *)NULL; + + /* Do simple cases first. Switch on what follows '$'. */ + switch (c) + { + /* $0 .. $9? */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + temp1 = dollar_vars[TODIGIT (c)]; + if (unbound_vars_is_error && temp1 == (char *)NULL) + { + uerror[0] = '$'; + uerror[1] = c; + uerror[2] = '\0'; + err_unboundvar (uerror); + last_command_exit_value = EXECUTION_FAILURE; + return (interactive_shell ? &expand_param_error : &expand_param_fatal); + } +#if 1 + if (temp1) + temp = (*temp1 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp1) + : quote_escapes (temp1); + else + temp = (char *)NULL; +#else + temp = temp1 ? quote_escapes (temp1) : (char *)NULL; +#endif + break; + + /* $$ -- pid of the invoking shell. */ + case '$': + temp = itos (dollar_dollar_pid); + break; + + /* $# -- number of positional parameters. */ + case '#': + temp = itos (number_of_args ()); + break; + + /* $? -- return value of the last synchronous command. */ + case '?': + temp = itos (last_command_exit_value); + break; + + /* $- -- flags supplied to the shell on invocation or by `set'. */ + case '-': + temp = which_set_flags (); + break; + + /* $! -- Pid of the last asynchronous command. */ + case '!': + /* If no asynchronous pids have been created, expand to nothing. + If `set -u' has been executed, and no async processes have + been created, this is an expansion error. */ + if (last_asynchronous_pid == NO_PID) + { + if (expanded_something) + *expanded_something = 0; + temp = (char *)NULL; + if (unbound_vars_is_error) + { + uerror[0] = '$'; + uerror[1] = c; + uerror[2] = '\0'; + err_unboundvar (uerror); + last_command_exit_value = EXECUTION_FAILURE; + return (interactive_shell ? &expand_param_error : &expand_param_fatal); + } + } + else + temp = itos (last_asynchronous_pid); + break; + + /* The only difference between this and $@ is when the arg is quoted. */ + case '*': /* `$*' */ + list = list_rest_of_args (); + + /* If there are no command-line arguments, this should just + disappear if there are other characters in the expansion, + even if it's quoted. */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0) + temp = (char *)NULL; + else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + { + /* If we have "$*" we want to make a string of the positional + parameters, separated by the first character of $IFS, and + quote the whole string, including the separators. If IFS + is unset, the parameters are separated by ' '; if $IFS is + null, the parameters are concatenated. */ +#if 0 + temp = string_list_dollar_star (list); +#else + temp = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (list) : string_list (list); +#endif + temp1 = quote_string (temp); + free (temp); + temp = temp1; + } + else + { + /* If the $* is not quoted it is identical to $@ */ + temp = string_list_dollar_at (list, quoted); + if (expand_no_split_dollar_star == 0 && contains_dollar_at) + *contains_dollar_at = 1; + } + + dispose_words (list); + break; + + /* When we have "$@" what we want is "$1" "$2" "$3" ... This + means that we have to turn quoting off after we split into + the individually quoted arguments so that the final split + on the first character of $IFS is still done. */ + case '@': /* `$@' */ + list = list_rest_of_args (); + + /* We want to flag the fact that we saw this. We can't turn + off quoting entirely, because other characters in the + string might need it (consider "\"$@\""), but we need some + way to signal that the final split on the first character + of $IFS should be done, even though QUOTED is 1. */ + if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + *quoted_dollar_at_p = 1; + if (contains_dollar_at) + *contains_dollar_at = 1; + + /* We want to separate the positional parameters with the first + character of $IFS in case $IFS is something other than a space. + We also want to make sure that splitting is done no matter what -- + according to POSIX.2, this expands to a list of the positional + parameters no matter what IFS is set to. */ + temp = string_list_dollar_at (list, quoted); + + dispose_words (list); + break; + + case LBRACE: + temp = parameter_brace_expand (string, &zindex, quoted, + quoted_dollar_at_p, + contains_dollar_at); + if (temp == &expand_param_error || temp == &expand_param_fatal) + return (temp); + + /* XXX */ + /* Quoted nulls should be removed if there is anything else + in the string. */ + /* Note that we saw the quoted null so we can add one back at + the end of this function if there are no other characters + in the string, discard TEMP, and go on. The exception to + this is when we have "${@}" and $1 is '', since $@ needs + special handling. */ + if (temp && QUOTED_NULL (temp)) + { + if (had_quoted_null_p) + *had_quoted_null_p = 1; + if (*quoted_dollar_at_p == 0) + { + free (temp); + temp = (char *)NULL; + } + + } + + goto return0; + + /* Do command or arithmetic substitution. */ + case LPAREN: + /* We have to extract the contents of this paren substitution. */ + t_index = zindex + 1; + temp = extract_command_subst (string, &t_index); + zindex = t_index; + + /* For Posix.2-style `$(( ))' arithmetic substitution, + extract the expression and pass it to the evaluator. */ + if (temp && *temp == LPAREN) + { + char *temp2; + temp1 = temp + 1; + temp2 = savestring (temp1); + t_index = strlen (temp2) - 1; + + if (temp2[t_index] != RPAREN) + { + free (temp2); + goto comsub; + } + + /* Cut off ending `)' */ + temp2[t_index] = '\0'; + + /* Expand variables found inside the expression. */ + temp1 = expand_string_if_necessary (temp2, Q_DOUBLE_QUOTES, expand_string); + free (temp2); + +arithsub: + /* No error messages. */ + this_command_name = (char *)NULL; + number = evalexp (temp1, &expok); + free (temp); + free (temp1); + if (expok == 0) + { + if (interactive_shell == 0 && posixly_correct) + { + last_command_exit_value = EXECUTION_FAILURE; + return (&expand_param_fatal); + } + else + return (&expand_param_error); + } + temp = itos (number); + break; + } + +comsub: + if (pflags & PF_NOCOMSUB) + /* we need zindex+1 because string[zindex] == RPAREN */ + temp1 = substring (string, *sindex, zindex+1); + else + temp1 = command_substitute (temp, quoted); + FREE (temp); + temp = temp1; + break; + + /* Do POSIX.2d9-style arithmetic substitution. This will probably go + away in a future bash release. */ + case '[': + /* Extract the contents of this arithmetic substitution. */ + t_index = zindex + 1; + temp = extract_arithmetic_subst (string, &t_index); + zindex = t_index; + + /* Do initial variable expansion. */ + temp1 = expand_string_if_necessary (temp, Q_DOUBLE_QUOTES, expand_string); + + goto arithsub; + + default: + /* Find the variable in VARIABLE_LIST. */ + temp = (char *)NULL; + + for (t_index = zindex; (c = string[zindex]) && legal_variable_char (c); zindex++) + ; + temp1 = (zindex > t_index) ? substring (string, t_index, zindex) : (char *)NULL; + + /* If this isn't a variable name, then just output the `$'. */ + if (temp1 == 0 || *temp1 == '\0') + { + FREE (temp1); + temp = (char *)xmalloc (2); + temp[0] = '$'; + temp[1] = '\0'; + if (expanded_something) + *expanded_something = 0; + goto return0; + } + + /* If the variable exists, return its value cell. */ + var = find_variable (temp1); + + if (var && invisible_p (var) == 0 && var_isset (var)) + { +#if defined (ARRAY_VARS) + if (array_p (var)) + { + temp = array_reference (array_cell (var), 0); + if (temp) + temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp) + : quote_escapes (temp); + else if (unbound_vars_is_error) + goto unbound_variable; + } + else +#endif + { + temp = value_cell (var); + + temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ? quote_string (temp) + : quote_escapes (temp); + } + + free (temp1); + + goto return0; + } + + temp = (char *)NULL; + +unbound_variable: + if (unbound_vars_is_error) + err_unboundvar (temp1); + else + { + free (temp1); + goto return0; + } + + free (temp1); + last_command_exit_value = EXECUTION_FAILURE; + return ((unbound_vars_is_error && interactive_shell == 0) + ? &expand_param_fatal + : &expand_param_error); + } + + if (string[zindex]) + zindex++; + +return0: + *sindex = zindex; + return (temp); +} + +/* Make a word list which is the result of parameter and variable + expansion, command substitution, arithmetic substitution, and + quote removal of WORD. Return a pointer to a WORD_LIST which is + the result of the expansion. If WORD contains a null word, the + word list returned is also null. + + QUOTED contains flag values defined in shell.h. + + ISEXP is used to tell expand_word_internal that the word should be + treated as the result of an expansion. This has implications for + how IFS characters in the word are treated. + + CONTAINS_DOLLAR_AT and EXPANDED_SOMETHING are return values; when non-null + they point to an integer value which receives information about expansion. + CONTAINS_DOLLAR_AT gets non-zero if WORD contained "$@", else zero. + EXPANDED_SOMETHING get non-zero if WORD contained any parameter expansions, + else zero. + + This only does word splitting in the case of $@ expansion. In that + case, we split on ' '. */ + +/* Values for the local variable quoted_state. */ +#define UNQUOTED 0 +#define PARTIALLY_QUOTED 1 +#define WHOLLY_QUOTED 2 + +static WORD_LIST * +expand_word_internal (word, quoted, isexp, contains_dollar_at, expanded_something) + WORD_DESC *word; + int quoted, isexp; + int *contains_dollar_at; + int *expanded_something; +{ + WORD_LIST *list; + WORD_DESC *tword; + + /* The intermediate string that we build while expanding. */ + char *istring; + + /* The current size of the above object. */ + int istring_size; + + /* Index into ISTRING. */ + int istring_index; + + /* Temporary string storage. */ + char *temp, *temp1; + + /* The text of WORD. */ + register char *string; + + /* The size of STRING. */ + size_t string_size; + + /* The index into STRING. */ + int sindex; + + /* This gets 1 if we see a $@ while quoted. */ + int quoted_dollar_at; + + /* One of UNQUOTED, PARTIALLY_QUOTED, or WHOLLY_QUOTED, depending on + whether WORD contains no quoting characters, a partially quoted + string (e.g., "xx"ab), or is fully quoted (e.g., "xxab"). */ + int quoted_state; + + int had_quoted_null; + int has_dollar_at; + int tflag; + + register unsigned char c; /* Current character. */ + int t_index; /* For calls to string_extract_xxx. */ + + char twochars[2]; + + DECLARE_MBSTATE; + + istring = (char *)xmalloc (istring_size = DEFAULT_INITIAL_ARRAY_SIZE); + istring[istring_index = 0] = '\0'; + quoted_dollar_at = had_quoted_null = has_dollar_at = 0; + quoted_state = UNQUOTED; + + string = word->word; + if (string == 0) + goto finished_with_string; + string_size = strlen (string); + + if (contains_dollar_at) + *contains_dollar_at = 0; + + /* Begin the expansion. */ + + for (sindex = 0; ;) + { + c = string[sindex]; + + /* Case on toplevel character. */ + switch (c) + { + case '\0': + goto finished_with_string; + + case CTLESC: + sindex++; +#if HANDLE_MULTIBYTE + if (MB_CUR_MAX > 1 && string[sindex]) + { + SADD_MBQCHAR_BODY(temp, string, sindex, string_size); + } + else +#endif + { + temp = (char *)xmalloc (3); + temp[0] = CTLESC; + temp[1] = c = string[sindex]; + temp[2] = '\0'; + } + +dollar_add_string: + if (string[sindex]) + sindex++; + +add_string: + if (temp) + { + istring = sub_append_string (temp, istring, &istring_index, &istring_size); + temp = (char *)0; + } + + break; + +#if defined (PROCESS_SUBSTITUTION) + /* Process substitution. */ + case '<': + case '>': + { + if (string[++sindex] != LPAREN || (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || posixly_correct) + { + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + t_index = sindex + 1; /* skip past both '<' and LPAREN */ + + temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/ + sindex = t_index; + + /* If the process substitution specification is `<()', we want to + open the pipe for writing in the child and produce output; if + it is `>()', we want to open the pipe for reading in the child + and consume input. */ + temp = temp1 ? process_substitute (temp1, (c == '>')) : (char *)0; + + FREE (temp1); + + goto dollar_add_string; + } +#endif /* PROCESS_SUBSTITUTION */ + + case '$': + if (expanded_something) + *expanded_something = 1; + + has_dollar_at = 0; + temp = param_expand (string, &sindex, quoted, expanded_something, + &has_dollar_at, "ed_dollar_at, + &had_quoted_null, + (word->flags & W_NOCOMSUB) ? PF_NOCOMSUB : 0); + + if (temp == &expand_param_error || temp == &expand_param_fatal) + { + free (string); + free (istring); + return ((temp == &expand_param_error) ? &expand_word_error + : &expand_word_fatal); + } + if (contains_dollar_at && has_dollar_at) + *contains_dollar_at = 1; + goto add_string; + break; + + case '`': /* Backquoted command substitution. */ + { + t_index = sindex++; + + if (expanded_something) + *expanded_something = 1; + + temp = string_extract (string, &sindex, "`", 0); + if (word->flags & W_NOCOMSUB) + /* sindex + 1 because string[sindex] == '`' */ + temp1 = substring (string, t_index, sindex + 1); + else + { + de_backslash (temp); + temp1 = command_substitute (temp, quoted); + } + FREE (temp); + temp = temp1; + goto dollar_add_string; + } + + case '\\': + if (string[sindex + 1] == '\n') + { + sindex += 2; + continue; + } + + c = string[++sindex]; + + if (quoted & Q_HERE_DOCUMENT) + tflag = CBSHDOC; + else if (quoted & Q_DOUBLE_QUOTES) + tflag = CBSDQUOTE; + else + tflag = 0; + + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && ((sh_syntaxtab[c] & tflag) == 0)) + { + SCOPY_CHAR_I (twochars, '\\', c, string, sindex, string_size); + } + else if (c == 0) + { + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + { + SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size); + } + + sindex++; +add_twochars: + /* BEFORE jumping here, we need to increment sindex if appropriate */ + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, + DEFAULT_ARRAY_SIZE); + istring[istring_index++] = twochars[0]; + istring[istring_index++] = twochars[1]; + istring[istring_index] = '\0'; + + break; + + case '"': +#if 0 + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT|Q_PATQUOTE)) +#else + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) +#endif + goto add_character; + + t_index = ++sindex; + temp = string_extract_double_quoted (string, &sindex, 0); + + /* If the quotes surrounded the entire string, then the + whole word was quoted. */ + quoted_state = (t_index == 1 && string[sindex] == '\0') + ? WHOLLY_QUOTED + : PARTIALLY_QUOTED; + + if (temp && *temp) + { + tword = make_word (temp); /* XXX */ + free (temp); + temp = (char *)NULL; + + has_dollar_at = 0; + list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &has_dollar_at, (int *)NULL); + + if (list == &expand_word_error || list == &expand_word_fatal) + { + free (istring); + free (string); + /* expand_word_internal has already freed temp_word->word + for us because of the way it prints error messages. */ + tword->word = (char *)NULL; + dispose_word (tword); + return list; + } + + dispose_word (tword); + + /* "$@" (a double-quoted dollar-at) expands into nothing, + not even a NULL word, when there are no positional + parameters. */ + if (list == 0 && has_dollar_at) + { + quoted_dollar_at++; + break; + } + + /* If we get "$@", we know we have expanded something, so we + need to remember it for the final split on $IFS. This is + a special case; it's the only case where a quoted string + can expand into more than one word. It's going to come back + from the above call to expand_word_internal as a list with + a single word, in which all characters are quoted and + separated by blanks. What we want to do is to turn it back + into a list for the next piece of code. */ + if (list) + dequote_list (list); + + if (has_dollar_at) + { + quoted_dollar_at++; + if (contains_dollar_at) + *contains_dollar_at = 1; + if (expanded_something) + *expanded_something = 1; + } + } + else + { + /* What we have is "". This is a minor optimization. */ + FREE (temp); + list = (WORD_LIST *)NULL; + } + + /* The code above *might* return a list (consider the case of "$@", + where it returns "$1", "$2", etc.). We can't throw away the + rest of the list, and we have to make sure each word gets added + as quoted. We test on tresult->next: if it is non-NULL, we + quote the whole list, save it to a string with string_list, and + add that string. We don't need to quote the results of this + (and it would be wrong, since that would quote the separators + as well), so we go directly to add_string. */ + if (list) + { + if (list->next) + { + /* Testing quoted_dollar_at makes sure that "$@" is + split correctly when $IFS does not contain a space. */ + temp = quoted_dollar_at + ? string_list_dollar_at (list, Q_DOUBLE_QUOTES) + : string_list (quote_list (list)); + dispose_words (list); + goto add_string; + } + else + { + temp = savestring (list->word->word); + dispose_words (list); +#if 1 + /* If the string is not a quoted null string, we want + to remove any embedded unquoted CTLNUL characters. + We do not want to turn quoted null strings back into + the empty string, though. We do this because we + want to remove any quoted nulls from expansions that + contain other characters. For example, if we have + x"$*"y or "x$*y" and there are no positional parameters, + the $* should expand into nothing. */ + /* HOWEVER, this fails if the string contains a literal + CTLNUL or CTLNUL is contained in the (non-null) expansion + of some variable. I'm not sure what to do about this + yet. There has to be some way to indicate the difference + between the two. An auxiliary data structure might be + necessary. */ + if (QUOTED_NULL (temp) == 0) + remove_quoted_nulls (temp); /* XXX */ +#endif + } + } + else + temp = (char *)NULL; + + /* We do not want to add quoted nulls to strings that are only + partially quoted; we can throw them away. */ + if (temp == 0 && quoted_state == PARTIALLY_QUOTED) + continue; + + add_quoted_string: + + if (temp) + { + temp1 = temp; + temp = quote_string (temp); + free (temp1); + goto add_string; + } + else + { + /* Add NULL arg. */ + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + + /* break; */ + + case '\'': +#if 0 + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT|Q_PATQUOTE)) +#else + if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) +#endif + goto add_character; + + t_index = ++sindex; + temp = string_extract_single_quoted (string, &sindex); + + /* If the entire STRING was surrounded by single quotes, + then the string is wholly quoted. */ + quoted_state = (t_index == 1 && string[sindex] == '\0') + ? WHOLLY_QUOTED + : PARTIALLY_QUOTED; + + /* If all we had was '', it is a null expansion. */ + if (*temp == '\0') + { + free (temp); + temp = (char *)NULL; + } + else + remove_quoted_escapes (temp); /* ??? */ + + /* We do not want to add quoted nulls to strings that are only + partially quoted; such nulls are discarded. */ + if (temp == 0 && (quoted_state == PARTIALLY_QUOTED)) + continue; + + /* If we have a quoted null expansion, add a quoted NULL to istring. */ + if (temp == 0) + { + c = CTLNUL; + sindex--; /* add_character: label increments sindex */ + goto add_character; + } + else + goto add_quoted_string; + + /* break; */ + + default: + /* This is the fix for " $@ " */ + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (isexp == 0 && isifs (c))) + { + if (string[sindex]) /* from old goto dollar_add_string */ + sindex++; + if (c == 0) + { + c = CTLNUL; + goto add_character; + } + else + { +#if HANDLE_MULTIBYTE + if (MB_CUR_MAX > 1) + sindex--; + + if (MB_CUR_MAX > 1) + { + SADD_MBQCHAR_BODY(temp, string, sindex, string_size); + } + else +#endif + { + twochars[0] = CTLESC; + twochars[1] = c; + goto add_twochars; + } + } + } + + SADD_MBCHAR (temp, string, sindex, string_size); + + add_character: + RESIZE_MALLOCED_BUFFER (istring, istring_index, 1, istring_size, + DEFAULT_ARRAY_SIZE); + istring[istring_index++] = c; + istring[istring_index] = '\0'; + + /* Next character. */ + sindex++; + } + } + +finished_with_string: + /* OK, we're ready to return. If we have a quoted string, and + quoted_dollar_at is not set, we do no splitting at all; otherwise + we split on ' '. The routines that call this will handle what to + do if nothing has been expanded. */ + + /* Partially and wholly quoted strings which expand to the empty + string are retained as an empty arguments. Unquoted strings + which expand to the empty string are discarded. The single + exception is the case of expanding "$@" when there are no + positional parameters. In that case, we discard the expansion. */ + + /* Because of how the code that handles "" and '' in partially + quoted strings works, we need to make ISTRING into a QUOTED_NULL + if we saw quoting characters, but the expansion was empty. + "" and '' are tossed away before we get to this point when + processing partially quoted strings. This makes "" and $xxx"" + equivalent when xxx is unset. We also look to see whether we + saw a quoted null from a ${} expansion and add one back if we + need to. */ + + /* If we expand to nothing and there were no single or double quotes + in the word, we throw it away. Otherwise, we return a NULL word. + The single exception is for $@ surrounded by double quotes when + there are no positional parameters. In that case, we also throw + the word away. */ + + if (*istring == '\0') + { + if (quoted_dollar_at == 0 && (had_quoted_null || quoted_state == PARTIALLY_QUOTED)) + { + istring[0] = CTLNUL; + istring[1] = '\0'; + tword = make_bare_word (istring); + list = make_word_list (tword, (WORD_LIST *)NULL); + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + } + /* According to sh, ksh, and Posix.2, if a word expands into nothing + and a double-quoted "$@" appears anywhere in it, then the entire + word is removed. */ + else if (quoted_state == UNQUOTED || quoted_dollar_at) + list = (WORD_LIST *)NULL; +#if 0 + else + { + tword = make_bare_word (istring); + list = make_word_list (tword, (WORD_LIST *)NULL); + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + } +#else + else + list = (WORD_LIST *)NULL; +#endif + } + else if (word->flags & W_NOSPLIT) + { + tword = make_bare_word (istring); + list = make_word_list (tword, (WORD_LIST *)NULL); + if (word->flags & W_ASSIGNMENT) + tword->flags |= W_ASSIGNMENT; /* XXX */ + if (word->flags & W_NOGLOB) + tword->flags |= W_NOGLOB; /* XXX */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; + } + else + { + char *ifs_chars; + + ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL; + + /* If we have $@, we need to split the results no matter what. If + IFS is unset or NULL, string_list_dollar_at has separated the + positional parameters with a space, so we split on space (we have + set ifs_chars to " \t\n" above if ifs is unset). If IFS is set, + string_list_dollar_at has separated the positional parameters + with the first character of $IFS, so we split on $IFS. */ + if (has_dollar_at && ifs_chars) + list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); + else + { + tword = make_bare_word (istring); + list = make_word_list (tword, (WORD_LIST *)NULL); + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED)) + tword->flags |= W_QUOTED; + if (word->flags & W_ASSIGNMENT) + tword->flags |= W_ASSIGNMENT; + if (word->flags & W_NOGLOB) + tword->flags |= W_NOGLOB; + } + } + + free (istring); + return (list); +} + +/* **************************************************************** */ +/* */ +/* Functions for Quote Removal */ +/* */ +/* **************************************************************** */ + +/* Perform quote removal on STRING. If QUOTED > 0, assume we are obeying the + backslash quoting rules for within double quotes or a here document. */ +char * +string_quote_removal (string, quoted) + char *string; + int quoted; +{ + size_t slen; + char *r, *result_string, *temp, *send; + int sindex, tindex, dquote; + unsigned char c; + DECLARE_MBSTATE; + + /* The result can be no longer than the original string. */ + slen = strlen (string); + send = string + slen; + + r = result_string = (char *)xmalloc (slen + 1); + + for (dquote = sindex = 0; c = string[sindex];) + { + switch (c) + { + case '\\': + c = string[++sindex]; + if (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) && (sh_syntaxtab[c] & CBSDQUOTE) == 0) + *r++ = '\\'; + /* FALLTHROUGH */ + + default: + SCOPY_CHAR_M (r, string, send, sindex); + break; + + case '\'': + if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) + { + *r++ = c; + sindex++; + break; + } + tindex = sindex + 1; + temp = string_extract_single_quoted (string, &tindex); + if (temp) + { + strcpy (r, temp); + r += strlen (r); + free (temp); + } + sindex = tindex; + break; + + case '"': + dquote = 1 - dquote; + sindex++; + break; + } + } + *r = '\0'; + return (result_string); +} + +#if 0 +/* UNUSED */ +/* Perform quote removal on word WORD. This allocates and returns a new + WORD_DESC *. */ +WORD_DESC * +word_quote_removal (word, quoted) + WORD_DESC *word; + int quoted; +{ + WORD_DESC *w; + char *t; + + t = string_quote_removal (word->word, quoted); + w = make_bare_word (t); + free (t); + return (w); +} + +/* Perform quote removal on all words in LIST. If QUOTED is non-zero, + the members of the list are treated as if they are surrounded by + double quotes. Return a new list, or NULL if LIST is NULL. */ +WORD_LIST * +word_list_quote_removal (list, quoted) + WORD_LIST *list; + int quoted; +{ + WORD_LIST *result, *t, *tresult; + + for (t = list, result = (WORD_LIST *)NULL; t; t = t->next) + { + tresult = make_word_list (word_quote_removal (t->word, quoted), (WORD_LIST *)NULL); + result = (WORD_LIST *) list_append (result, tresult); + } + return (result); +} +#endif + +/******************************************* + * * + * Functions to perform word splitting * + * * + *******************************************/ + +void +setifs (v) + SHELL_VAR *v; +{ + char *t; + unsigned char uc; + + ifs_var = v; + ifs_value = v ? value_cell (v) : " \t\n"; + + /* Should really merge ifs_cmap with sh_syntaxtab. */ + memset (ifs_cmap, '\0', sizeof (ifs_cmap)); + for (t = ifs_value ; t && *t; t++) + { + uc = *t; + ifs_cmap[uc] = 1; + } + + ifs_firstc = ifs_value ? *ifs_value : 0; +} + +char * +getifs () +{ + return ifs_value; +} + +/* This splits a single word into a WORD LIST on $IFS, but only if the word + is not quoted. list_string () performs quote removal for us, even if we + don't do any splitting. */ +WORD_LIST * +word_split (w, ifs_chars) + WORD_DESC *w; + char *ifs_chars; +{ + WORD_LIST *result; + + if (w) + { + char *xifs; + + xifs = ((w->flags & W_QUOTED) || ifs_chars == 0) ? "" : ifs_chars; + result = list_string (w->word, xifs, w->flags & W_QUOTED); + } + else + result = (WORD_LIST *)NULL; + + return (result); +} + +/* Perform word splitting on LIST and return the RESULT. It is possible + to return (WORD_LIST *)NULL. */ +static WORD_LIST * +word_list_split (list) + WORD_LIST *list; +{ + WORD_LIST *result, *t, *tresult; + + for (t = list, result = (WORD_LIST *)NULL; t; t = t->next) + { + tresult = word_split (t->word, ifs_value); + result = (WORD_LIST *) list_append (result, tresult); + } + return (result); +} + +/************************************************** + * * + * Functions to expand an entire WORD_LIST * + * * + **************************************************/ + +/* Do any word-expansion-specific cleanup and jump to top_level */ +static void +exp_jump_to_top_level (v) + int v; +{ + /* Cleanup code goes here. */ + expand_no_split_dollar_star = 0; /* XXX */ + expanding_redir = 0; + + jump_to_top_level (v); +} + +/* Put NLIST (which is a WORD_LIST * of only one element) at the front of + ELIST, and set ELIST to the new list. */ +#define PREPEND_LIST(nlist, elist) \ + do { nlist->next = elist; elist = nlist; } while (0) + +/* Separate out any initial variable assignments from TLIST. If set -k has + been executed, remove all assignment statements from TLIST. Initial + variable assignments and other environment assignments are placed + on SUBST_ASSIGN_VARLIST. */ +static WORD_LIST * +separate_out_assignments (tlist) + WORD_LIST *tlist; +{ + register WORD_LIST *vp, *lp; + + if (!tlist) + return ((WORD_LIST *)NULL); + + if (subst_assign_varlist) + dispose_words (subst_assign_varlist); /* Clean up after previous error */ + + subst_assign_varlist = (WORD_LIST *)NULL; + vp = lp = tlist; + + /* Separate out variable assignments at the start of the command. + Loop invariant: vp->next == lp + Loop postcondition: + lp = list of words left after assignment statements skipped + tlist = original list of words + */ + while (lp && (lp->word->flags & W_ASSIGNMENT)) + { + vp = lp; + lp = lp->next; + } + + /* If lp != tlist, we have some initial assignment statements. + We make SUBST_ASSIGN_VARLIST point to the list of assignment + words and TLIST point to the remaining words. */ + if (lp != tlist) + { + subst_assign_varlist = tlist; + /* ASSERT(vp->next == lp); */ + vp->next = (WORD_LIST *)NULL; /* terminate variable list */ + tlist = lp; /* remainder of word list */ + } + + /* vp == end of variable list */ + /* tlist == remainder of original word list without variable assignments */ + if (!tlist) + /* All the words in tlist were assignment statements */ + return ((WORD_LIST *)NULL); + + /* ASSERT(tlist != NULL); */ + /* ASSERT((tlist->word->flags & W_ASSIGNMENT) == 0); */ + + /* If the -k option is in effect, we need to go through the remaining + words, separate out the assignment words, and place them on + SUBST_ASSIGN_VARLIST. */ + if (place_keywords_in_env) + { + WORD_LIST *tp; /* tp == running pointer into tlist */ + + tp = tlist; + lp = tlist->next; + + /* Loop Invariant: tp->next == lp */ + /* Loop postcondition: tlist == word list without assignment statements */ + while (lp) + { + if (lp->word->flags & W_ASSIGNMENT) + { + /* Found an assignment statement, add this word to end of + subst_assign_varlist (vp). */ + if (!subst_assign_varlist) + subst_assign_varlist = vp = lp; + else + { + vp->next = lp; + vp = lp; + } + + /* Remove the word pointed to by LP from TLIST. */ + tp->next = lp->next; + /* ASSERT(vp == lp); */ + lp->next = (WORD_LIST *)NULL; + lp = tp->next; + } + else + { + tp = lp; + lp = lp->next; + } + } + } + return (tlist); +} + +#define WEXP_VARASSIGN 0x001 +#define WEXP_BRACEEXP 0x002 +#define WEXP_TILDEEXP 0x004 +#define WEXP_PARAMEXP 0x008 +#define WEXP_PATHEXP 0x010 + +/* All of the expansions, including variable assignments at the start of + the list. */ +#define WEXP_ALL (WEXP_VARASSIGN|WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP) + +/* All of the expansions except variable assignments at the start of + the list. */ +#define WEXP_NOVARS (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP) + +/* All of the `shell expansions': brace expansion, tilde expansion, parameter + expansion, command substitution, arithmetic expansion, word splitting, and + quote removal. */ +#define WEXP_SHELLEXP (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP) + +/* Take the list of words in LIST and do the various substitutions. Return + a new list of words which is the expanded list, and without things like + variable assignments. */ + +WORD_LIST * +expand_words (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_ALL)); +} + +/* Same as expand_words (), but doesn't hack variable or environment + variables. */ +WORD_LIST * +expand_words_no_vars (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_NOVARS)); +} + +WORD_LIST * +expand_words_shellexp (list) + WORD_LIST *list; +{ + return (expand_word_list_internal (list, WEXP_SHELLEXP)); +} + +static WORD_LIST * +glob_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + char **glob_array, *temp_string; + register int glob_index; + WORD_LIST *glob_list, *output_list, *disposables, *next; + WORD_DESC *tword; + + output_list = disposables = (WORD_LIST *)NULL; + glob_array = (char **)NULL; + while (tlist) + { + /* For each word, either globbing is attempted or the word is + added to orig_list. If globbing succeeds, the results are + added to orig_list and the word (tlist) is added to the list + of disposable words. If globbing fails and failed glob + expansions are left unchanged (the shell default), the + original word is added to orig_list. If globbing fails and + failed glob expansions are removed, the original word is + added to the list of disposable words. orig_list ends up + in reverse order and requires a call to REVERSE_LIST to + be set right. After all words are examined, the disposable + words are freed. */ + next = tlist->next; + + /* If the word isn't an assignment and contains an unquoted + pattern matching character, then glob it. */ + if ((tlist->word->flags & W_NOGLOB) == 0 && + unquoted_glob_pattern_p (tlist->word->word)) + { + glob_array = shell_glob_filename (tlist->word->word); + + /* Handle error cases. + I don't think we should report errors like "No such file + or directory". However, I would like to report errors + like "Read failed". */ + + if (glob_array == 0 || GLOB_FAILED (glob_array)) + { + glob_array = (char **)xmalloc (sizeof (char *)); + glob_array[0] = (char *)NULL; + } + + /* Dequote the current word in case we have to use it. */ + if (glob_array[0] == NULL) + { + temp_string = dequote_string (tlist->word->word); + free (tlist->word->word); + tlist->word->word = temp_string; + } + + /* Make the array into a word list. */ + glob_list = (WORD_LIST *)NULL; + for (glob_index = 0; glob_array[glob_index]; glob_index++) + { + tword = make_bare_word (glob_array[glob_index]); + tword->flags |= W_GLOBEXP; /* XXX */ + glob_list = make_word_list (tword, glob_list); + } + + if (glob_list) + { + output_list = (WORD_LIST *)list_append (glob_list, output_list); + PREPEND_LIST (tlist, disposables); + } + else if (fail_glob_expansion != 0) + { + report_error (_("no match: %s"), tlist->word->word); + jump_to_top_level (DISCARD); + } + else if (allow_null_glob_expansion == 0) + { + /* Failed glob expressions are left unchanged. */ + PREPEND_LIST (tlist, output_list); + } + else + { + /* Failed glob expressions are removed. */ + PREPEND_LIST (tlist, disposables); + } + } + else + { + /* Dequote the string. */ + temp_string = dequote_string (tlist->word->word); + free (tlist->word->word); + tlist->word->word = temp_string; + PREPEND_LIST (tlist, output_list); + } + + strvec_dispose (glob_array); + glob_array = (char **)NULL; + + tlist = next; + } + + if (disposables) + dispose_words (disposables); + + if (output_list) + output_list = REVERSE_LIST (output_list, WORD_LIST *); + + return (output_list); +} + +#if defined (BRACE_EXPANSION) +static WORD_LIST * +brace_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + register char **expansions; + char *temp_string; + WORD_LIST *disposables, *output_list, *next; + WORD_DESC *w; + int eindex; + + for (disposables = output_list = (WORD_LIST *)NULL; tlist; tlist = next) + { + next = tlist->next; + + /* Only do brace expansion if the word has a brace character. If + not, just add the word list element to BRACES and continue. In + the common case, at least when running shell scripts, this will + degenerate to a bunch of calls to `xstrchr', and then what is + basically a reversal of TLIST into BRACES, which is corrected + by a call to REVERSE_LIST () on BRACES when the end of TLIST + is reached. */ + if (xstrchr (tlist->word->word, LBRACE)) + { + expansions = brace_expand (tlist->word->word); + + for (eindex = 0; temp_string = expansions[eindex]; eindex++) + { + w = make_word (temp_string); + /* If brace expansion didn't change the word, preserve + the flags. We may want to preserve the flags + unconditionally someday -- XXX */ + if (STREQ (temp_string, tlist->word->word)) + w->flags = tlist->word->flags; + output_list = make_word_list (w, output_list); + free (expansions[eindex]); + } + free (expansions); + + /* Add TLIST to the list of words to be freed after brace + expansion has been performed. */ + PREPEND_LIST (tlist, disposables); + } + else + PREPEND_LIST (tlist, output_list); + } + + if (disposables) + dispose_words (disposables); + + if (output_list) + output_list = REVERSE_LIST (output_list, WORD_LIST *); + + return (output_list); +} +#endif + +static WORD_LIST * +shell_expand_word_list (tlist, eflags) + WORD_LIST *tlist; + int eflags; +{ + WORD_LIST *expanded, *orig_list, *new_list, *next, *temp_list; + int expanded_something, has_dollar_at; + char *temp_string; + + /* We do tilde expansion all the time. This is what 1003.2 says. */ + new_list = (WORD_LIST *)NULL; + for (orig_list = tlist; tlist; tlist = next) + { + temp_string = tlist->word->word; + + next = tlist->next; + + /* Posix.2 section 3.6.1 says that tildes following `=' in words + which are not assignment statements are not expanded. If the + shell isn't in posix mode, though, we perform tilde expansion + on `likely candidate' unquoted assignment statements (flags + include W_ASSIGNMENT but not W_QUOTED). A likely candidate + contains an unquoted :~ or =~. Something to think about: we + now have a flag that says to perform tilde expansion on arguments + to `assignment builtins' like declare and export that look like + assignment statements. We now do tilde expansion on such words + even in POSIX mode. */ + if (((tlist->word->flags & (W_ASSIGNMENT|W_QUOTED)) == W_ASSIGNMENT) && + (posixly_correct == 0 || (tlist->word->flags & W_TILDEEXP)) && + (unquoted_substring ("=~", temp_string) || unquoted_substring (":~", temp_string))) + { + tlist->word->word = bash_tilde_expand (temp_string, 1); + free (temp_string); + } + else if (temp_string[0] == '~') + { + tlist->word->word = bash_tilde_expand (temp_string, 0); + free (temp_string); + } + + expanded_something = 0; + expanded = expand_word_internal + (tlist->word, 0, 0, &has_dollar_at, &expanded_something); + + if (expanded == &expand_word_error || expanded == &expand_word_fatal) + { + /* By convention, each time this error is returned, + tlist->word->word has already been freed. */ + tlist->word->word = (char *)NULL; + + /* Dispose our copy of the original list. */ + dispose_words (orig_list); + /* Dispose the new list we're building. */ + dispose_words (new_list); + + last_command_exit_value = EXECUTION_FAILURE; + if (expanded == &expand_word_error) + exp_jump_to_top_level (DISCARD); + else + exp_jump_to_top_level (FORCE_EOF); + } + + /* Don't split words marked W_NOSPLIT. */ + if (expanded_something && (tlist->word->flags & W_NOSPLIT) == 0) + { + temp_list = word_list_split (expanded); + dispose_words (expanded); + } + else + { + /* If no parameter expansion, command substitution, process + substitution, or arithmetic substitution took place, then + do not do word splitting. We still have to remove quoted + null characters from the result. */ + word_list_remove_quoted_nulls (expanded); + temp_list = expanded; + } + + expanded = REVERSE_LIST (temp_list, WORD_LIST *); + new_list = (WORD_LIST *)list_append (expanded, new_list); + } + + if (orig_list) + dispose_words (orig_list); + + if (new_list) + new_list = REVERSE_LIST (new_list, WORD_LIST *); + + return (new_list); +} + +/* The workhorse for expand_words () and expand_words_no_vars (). + First arg is LIST, a WORD_LIST of words. + Second arg EFLAGS is a flags word controlling which expansions are + performed. + + This does all of the substitutions: brace expansion, tilde expansion, + parameter expansion, command substitution, arithmetic expansion, + process substitution, word splitting, and pathname expansion, according + to the bits set in EFLAGS. Words with the W_QUOTED or W_NOSPLIT bits + set, or for which no expansion is done, do not undergo word splitting. + Words with the W_NOGLOB bit set do not undergo pathname expansion. */ +static WORD_LIST * +expand_word_list_internal (list, eflags) + WORD_LIST *list; + int eflags; +{ + WORD_LIST *new_list, *temp_list; + int tint; + + if (list == 0) + return ((WORD_LIST *)NULL); + + garglist = new_list = copy_word_list (list); + if (eflags & WEXP_VARASSIGN) + { + garglist = new_list = separate_out_assignments (new_list); + if (new_list == 0) + { + if (subst_assign_varlist) + { + /* All the words were variable assignments, so they are placed + into the shell's environment. */ + for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next) + { + this_command_name = (char *)NULL; /* no arithmetic errors */ + tint = do_assignment (temp_list->word->word); + /* Variable assignment errors in non-interactive shells + running in Posix.2 mode cause the shell to exit. */ + if (tint == 0) + { + last_command_exit_value = EXECUTION_FAILURE; + if (interactive_shell == 0 && posixly_correct) + exp_jump_to_top_level (FORCE_EOF); + else + exp_jump_to_top_level (DISCARD); + } + } + dispose_words (subst_assign_varlist); + subst_assign_varlist = (WORD_LIST *)NULL; + } + return ((WORD_LIST *)NULL); + } + } + + /* Begin expanding the words that remain. The expansions take place on + things that aren't really variable assignments. */ + +#if defined (BRACE_EXPANSION) + /* Do brace expansion on this word if there are any brace characters + in the string. */ + if ((eflags & WEXP_BRACEEXP) && brace_expansion && new_list) + new_list = brace_expand_word_list (new_list, eflags); +#endif /* BRACE_EXPANSION */ + + /* Perform the `normal' shell expansions: tilde expansion, parameter and + variable substitution, command substitution, arithmetic expansion, + and word splitting. */ + new_list = shell_expand_word_list (new_list, eflags); + + /* Okay, we're almost done. Now let's just do some filename + globbing. */ + if (new_list) + { + if ((eflags & WEXP_PATHEXP) && disallow_filename_globbing == 0) + /* Glob expand the word list unless globbing has been disabled. */ + new_list = glob_expand_word_list (new_list, eflags); + else + /* Dequote the words, because we're not performing globbing. */ + new_list = dequote_list (new_list); + } + + if ((eflags & WEXP_VARASSIGN) && subst_assign_varlist) + { + sh_assign_func_t *assign_func; + + /* If the remainder of the words expand to nothing, Posix.2 requires + that the variable and environment assignments affect the shell's + environment. */ + assign_func = new_list ? assign_in_env : do_assignment; + + for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next) + { + this_command_name = (char *)NULL; + tint = (*assign_func) (temp_list->word->word); + /* Variable assignment errors in non-interactive shells running + in Posix.2 mode cause the shell to exit. */ + if (tint == 0 && assign_func == do_assignment) + { + last_command_exit_value = EXECUTION_FAILURE; + if (interactive_shell == 0 && posixly_correct) + exp_jump_to_top_level (FORCE_EOF); + else + exp_jump_to_top_level (DISCARD); + } + } + + dispose_words (subst_assign_varlist); + subst_assign_varlist = (WORD_LIST *)NULL; + } + +#if 0 + tint = list_length (new_list) + 1; + RESIZE_MALLOCED_BUFFER (glob_argv_flags, 0, tint, glob_argv_flags_size, 16); + for (tint = 0, temp_list = new_list; temp_list; temp_list = temp_list->next) + glob_argv_flags[tint++] = (temp_list->word->flags & W_GLOBEXP) ? '1' : '0'; + glob_argv_flags[tint] = '\0'; +#endif + + return (new_list); +} diff --git a/support/mkconffiles b/support/mkconffiles old mode 100755 new mode 100644 diff --git a/support/mkversion.sh b/support/mkversion.sh old mode 100755 new mode 100644 diff --git a/support/rlvers.sh b/support/rlvers.sh old mode 100755 new mode 100644 diff --git a/tests/? b/tests/? deleted file mode 100644 index 857f13ad..00000000 --- a/tests/? +++ /dev/null @@ -1 +0,0 @@ -$ diff --git a/tests/cprint.right.save1 b/tests/cprint.right.save1 new file mode 100644 index 00000000..6b711b8c --- /dev/null +++ b/tests/cprint.right.save1 @@ -0,0 +1,72 @@ +tf is a function +tf () +{ + echo this is ${0##*/} >/dev/null; + echo a | cat - >/dev/null; + test -f ${0##*/} && echo ${0##*/} is a regular file; + test -d ${0##*/} || echo ${0##*/} is not a directory; + echo a; + echo b; + echo c; + echo background >/dev/null & ( exit 1 ); + echo $?; + { + echo a + }; + i=0; + while (( " i < 3 " )); do + test -r /dev/fd/$i; + i=$(( i + 1 )); + done; + [[ -r /dev/fd/0 && -w /dev/fd/1 ]] || echo oops >/dev/null; + for name in $( echo 1 2 3 ); + do + test -r /dev/fd/$name; + done; + if [[ -r /dev/fd/0 && -w /dev/fd/1 ]]; then + echo ok >/dev/null; + else + if (( " 7 > 40 " )); then + echo oops; + else + echo done; + fi; + fi >/dev/null; + case $PATH in + *$PWD*) + echo \$PWD in \$PATH + ;; + *) + echo \$PWD not in \$PATH + ;; + esac >/dev/null; + while false; do + echo z; + done >/dev/null; + until true; do + echo z; + done >/dev/null; + echo \&\|'()' \{ echo abcde \; \}; + eval fu\%nc'()' \{ echo abcde \; \}; + type fu\%nc +} +tf2 is a function +tf2 () +{ + ( { + time -p echo a | cat - >/dev/null + } ) 2>&1 +} +cprint.tests is a regular file +cprint.tests is not a directory +a +b +c +1 +a +&|() { echo abcde ; } +fu%nc is a function +fu%nc () +{ + echo abcde +} diff --git a/tests/history.tests.save b/tests/history.tests.save new file mode 100644 index 00000000..4a218c30 --- /dev/null +++ b/tests/history.tests.save @@ -0,0 +1,97 @@ +trap 'rm /tmp/newhistory' 0 + +# bad options +history -x +# cannot use -r and -w at the same time +history -r -w /dev/null + +# bad option +fc -v + +# all of these should result in an empty history list +history -c +history -r /dev/null +history -n /dev/null +history -c + +HISTFILE=history.list +HISTCONTROL=ignoreboth +HISTIGNORE='&:history*:fc*' +HISTSIZE=32 + +shopt -s cmdhist +set -o history + +history + +fc -l +fc -nl + +fc -lr +fc -nlr + +history -s "echo line for history" +history + +history -p '!!' + +fc -nl + +HISTFILE=/tmp/newhistory +history -a +echo displaying \$HISTFILE after history -a +cat $HISTFILE + +history +history -w +cat $HISTFILE + +history -s "echo line 2 for history" +history +history -p '!e' +history -p '!!' + +# this should show up as one history entry +for x in one two three +do + : +done +history + +# just a basic test. a full test suite for history expansion should be +# created +set -H +!! +!e + +unset HISTSIZE +unset HISTFILE + +fc -l 4 +fc -l 4 8 + +fc -l 502 +fc -l one=two three=four 502 + +history 4 + +shopt -so history +shopt -s expand_aliases + +alias r="fc -s" + +echo aa ab ac + +r a=x +r x=4 b=8 + +# this had better fail with `no command found' +r cc + +unalias -a +alias + +set +o history + +shopt -q -o history +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 diff --git a/tests/run-histexpand.debug b/tests/run-histexpand.debug new file mode 100644 index 00000000..16b325fa --- /dev/null +++ b/tests/run-histexpand.debug @@ -0,0 +1,4 @@ +echo "warning: all of these tests will fail if history has not been compiled" >&2 +echo "warning: into the shell" >&2 +${THIS_SH} +o histexpand ./histexp.tests > /tmp/xx 2>&1 +diff /tmp/xx histexp.right && rm -f /tmp/xx

SBnPzh3Vthb=TQT;3D0_!6U6d%wGHu(oZQHzQ+s2=^dDG6Dwr$(CZJYI~`|GY6 z)TG8SIg^M%tabMGK-C2zt=RdCp%vQY$EYV;(ud@SXQfi^cHaku;<9`~iqShj>aiML zKam+8*R$DnACz@8(n46|h~fdUcbVgx!}e6#SG>?L@8gAI%bsgg+O(e5&(;KK5nWn` z)Y!VWqARyMtkq88WZgi`y-fAYbCH#<0Go@WB42LBDlFk{Zcjnq=7y0&s?m(s&9J}1ah)GHKt_fjv!23EO&L*D7VdXUd8EiqSF=^SJQf^Fuhq%}PG1P}cN0p( z;QN&BtWS)e`NGIVL*ruN+CeaIGuP2vIoo(aN)Qy|_YSft8>PvntP;Ce!ZAWZ8trfK zxhsUHuBi%IUN8v{1X+;G8`ku)G9~Lob6>o~`_e|z4xrPU76*4YIM|0$W-l|%b7Do! zxkERkJEnklghG+)Jqw!BANIA;PfoigOQiy!dWb_RxS41&&Hz!cK>{DQq(NOrOuF*d zkmW+fRR}i5T)w$OT_ZW-(z}_0p+M0SL80RbXeJfP?}cFVZr3MXmF@Esn1IcsGIJEl zoG%!J5DQKrJ0(ts`jk%(d*t|C%no33GS@L>h#LL*N&Gr8wz{$2#*U98OjQ7d zem&KQ83dil9A`21QMvpMU(=LkmI_k5ZH1Z{aI%1LR9)=FGCi`-?Fe&$dXny}>Y@s> z1WpZ}2b4ZZw|xiip}6ML*teA^+e;)*346;*2Q+epg~zZKgbgOdIuik>#pwUgO&%@PmPl2_@zTSW=}MmdSQ#g80RTr5dmug+N0du; z<=eXa&H#|Ue~v&m15v9Xz+D*y3FEA&-(H2C0fU75w_y5C^EqaeMd ziCp8p?ZiaI_7jnRQ6E>sjfa6t2}N&MIpuW%YPMH$RefIK1f|K4Pm-}B2NU>jJR12w z`?XnX2HF**&0Oe~0V_pJV`=%C`!r=saG*dFVtFM)J_9k`$F;>Bi?Z-7-{vV=YI*um zKB13Bo?cGo%v2bG7YhS%d_JoP^lDjJmR0v*2xs0#R)6wqfGA4_8WtdQt&3rLCBh!| z_*8+BGKBq<#R(bC{87~5k4`r4P?o?HAAY`u5HM%ufVC3!GGk#MT8!}-&Wx$*3`zm= zg903yRI6P@#*Vq>y@NYkWeGT~R*t~g)wlsZxL?aJJ^`yPKcnGS*^lnFs9C8W&SQK|XZ zZypMc^x1)zl_|RMLmu-c$>=NV25)#Xzsa<7ulg2j9Yt*Paj#1c#Lz=%0E%iY9n4j? zr3;9&;Vd8Bl$MZ<4r?8GeRaQ7twgP4HK-|96CL?oDU&C^dwm%C^+IWGnpoMn&_GA+ zy=$H$f3vdQk16!}yemULHJ@Hl$QK0*L;{i9ePaq1dTs&f{3P;GP@X?4%v9rp8Fjs| z3it(-UQi~gc3t)Sy0aug;<>YBEI`;&aw(MJ`JRXFB0f8{gSRD1Akk2olhN(D;?nNi ztBrLPWeHQx+k4LG>;iO6f0~Cv9f0*UU^<(-*3Y|3YfB$g0*^ z#;HnpdKOk&79&9@{SLWsV)7S%_(LHKMvrKhrf83{lin^k5-ux!udX9<7Lgzp`w!74oJy;D)#W5IIfp9;2LLqfZMFnB8p;2f^ z!sl@3bl$kLjqPm9EhjOw=A7x56SZsy_WvcLVd7?(%cxwUx^m>(3T*>V2zh3-ljD*K zDCvkb2f+AV?%&Sg5tAgiEHRr{dxS~B?$#?c6n!;-G!{=$c)}Tc<8Ys3ILq~sfm|#- zIV!+tF;{kbhP_@vyB_~+XsxfyY1tF6R@+g@Jf-A;AiQeN(#3pg!nzSj>VSAztw{%F z4;VML_qf+Jpw5Z1=WB9G?6a&G-tD;tFNk=W+R*l^;hd<_2VbiV2J~o>0}}I)U_6S7 z+DZ?yOfhIEC}|`Oz`expu)qxvI=XhYc}IMEHGP?@oCNP6S#pwSegDZ!->ZjWcQxte znA(~cy#EDULd(4+;p_6X#7R#=&rPTzT#CqrbhXCM47>6H@DlQ==rHEKaHe7IeP*FT3J{`u^1ufx zA{@vwOJIB9`;v-@yy=ofq^o6b)t78*okj4>g>=7z%j~Zr8$_k$B{!ihTWM(ExYu~5I=W3Wgc?8Yrf`2?sy)<6e@(%^ zWNty$(3Aiyn>&bA0Yu4!So@~aI z0;jRhonc*=<>qVzA@WjN-mbj9`a|yW>aCeJN>$KmNAt9QoWs=h53YJLop#_)1$M(F zUWc%d^&%WAx#N%L`B187wd>}X8J)J^+Rc^j{FG8U5@L|9YOkkE$v*{vb;5hi%E1A( zhdxX#rkRk0{^Kw78=K`K5>C-Ak=aRl8FlQ*hw~8=g$1`3vYXM;uA|~lW8})dAk0BN z3rK}eG^A=}?``m@Ydz+&1X1_ZOIOn$Vdtr!PhkfQ&s=eEjK7CY5W{B$%UYS+zqs9e+}^K!ul*j9orj&MmB8&((eNUQF-3_99PU2U zCNR0$au5>Eo63GI6EIxo5OaNSdqua;`+dQ*$^C=5=0~Ye3X23^MsBXC0r?LN1!_97 zjlv1Fh#Cb_lZ#+<32Fx6XMgc}?~DZB%!P8#z&Msr10NT#R+QA;g_I3Wkenvc9~Ah4 z>lVjB<$L0z7XJ~GSRQI_T3%^tqPi#~W3=U~g`eq4TetjuL_G_$`!d1(1a^VdqwGgk ztzuYDx1Nfb`64BNbuBhb58D;ud;$meX^Mnwmx}E}*UzoT%FbUWEN{wArW5r_lrEB4 zDJBnQGn`sJ=y-CBr0Wpccf@+5HWgNuj1@k=U1T8pvgdK;75&lnwJs}R6W1rl5Syqn z8*fH1|C^Td@7IAU?2=&3%@A#L;BUPw71;~+vVJ~v%9k%VdikPc6r~U!NA>v6KydYI z-c{-mK zlY@20Y|pgyUI;F)hI&wUMF4#62Akm5Gfcu|xR_idSb{h{)71DdxM0|)v-=-J2ZRrY z$G`aZf1?&zfTU*kUSJS?#x6s(+`H@2okFz;jWhL!>;p6SJi@jI(m!bk(DWdt3vkp@ zRPt45QR#2h8Bhz~7k>#!-<0OK#uV%inteANEZ z!6}1wJ1jxu&|Hr6-c6RY`XP6_#L8u<$Cl#BlE(cA6NAA@9Z}*+q>ZF zS3FjzFP9Wx?=2fjmG3>nyVqUlp&q|8ZrU&pAAQAjsi7kMhiNLsSw4k4d^BVn6{KI; zv5lmOu}w?8up3{hP{G>iB@i`g*OER{K_7vDiElhl!_`N4o7Rs0+S=Zs;UzdJkF=O} z9AlHQHNTv2kty2Cn2$i|9XQsV!6=)7Y$@2tv8V7*oqIdd&$P#_HZ_>v&_e2thaM8& z{j&BBy-TNJ6@kK$7eTNA^Qy3$w|JEI(wbL0r3FdVS{6EU(GGOy(+kZ~_?6)L|;02lV?=R=-CCY*wYa5kAufsoOWR=8xMAJE6UgMU zmOp?Qo)xS|aWr+GO2S9-3B}8ITl$uFw3C*Hm)v5u*&l{rp0l{SbLa%Bq?CSWm(;!U zsg8_oyfTtkY|nv1t!xtAOXvhyE1h4NQ#ei z9-%KBRBgdu15eQE)*?HTZRZVl6Z9~(&{R>eR1ss&1co!^+kCd#n>3JAw0B)9*k~dr zEK-AUW;q0qSh`RW_gxLRHb11U5BPo3by1Y86crd7r;(yvO)Ft9-RmmF%ZkVEI?cuZ z0Ql6TTcp2~Ycc6? zh#$h=7%aLKos2L0&QrnGOUB4pI-#2pZZm&DViywP4ULyuASbs%amfP0wY*}RzhX{_ z5uAkAZ_-~X=yJ#L>6!K2$H_@JXlC(fcm&sf&TQb$A53yMu4;8Gfdn2m@p}8y_ozN( z^=rYoc|n_{U1>APBh2f&`M9)^ve{ajj3L2hk0yJ#vvGM1q8^E%_xN^Mns!;ciwXPG zDS#J=?e+$xi)YzhO^+-AHez)000yb^T?40Aacj@N%0yRn*_x6|lQ(LS%A`z)i{G!V~}xef5fd5 zm*?bTjiZWtjn;9(jq8yo-p;I)^>Cec-4iae;D^GS%W&q@7B(qD(eTSy1^IGp&XK-; z*5a@jHu-t8+v$8fBicH7N&Xw44HvfYRBtv#?$y30q+?!_ zux_(_3XOxlb=5;=vhwJKUpxK1N_Sg{Z{)}i(OWfCVAqlAdJIks4w-;Vr(0eeL{A8CY_D6@%nRK3E5Ef&m!(; zo|0|cBL}NUr^EQ~{W`gyeNNRt+L_(t*jk+t^n8n-4t>JCN!-QX3JSWjl$;pqs1)3x zu8z!=#Jcgya0Gbn*>xxR)K0O}m`3yRUpqv*b>AJoL<1J8|gj>GY6hVR0_JXJ9~0?LR+Ld%EFU1?M$+N>z7p_j3*`Vg(Tq&m~Jx6wW*yQn~NMd#5eAj{|&l1OF|IjA1?nF zICEzA2C)(RH4k~#9Z4|)!$t_<=Tl*OCK+i+pgqdNDxZNNZmv{PJ3@a_M?=P=fN*AL z_L40_^Qu@RsddWmeL&m_`LK*4)s0~L zqQ^(F>6^#1_#M!eGCU#AvEY$%w0_Nrdah%{xHY8wl^=yp5~@SgN_eEo@;Q!S9x4sn z$_0&$o3MnIc82C|#zt_oDXZB`nRJahXIS(FDQ!{(lW3ZbHBJ-xkGZsxu$YycxJ-{@ z(YQ4M%PU%PN`O~~x(;&f@|hWolkFc{U0oIHj=De)H*k6KYVegV7$p%6N_8?a%Vub4 z&x;@rCnpa-vcHR7GTPM@P`5H=vNUpFO)^>Od3EOs6tW$vIx*_L(iL}_wguyi?^00| z&_fGO#~+zd1wJ;#ZSDMmy>q&{rZcxy8FS3jm@%i<;1C{uQ@Qg}&(bn^;1wWh2?c+s z)-)?(=p$UXz(hovI?v1-ikcTxU}c0oJII??h|sW5KIqS%5l)3&WS>Ff%=5BMOsFhs zOfX7H$k*0DInK;Tb@cr{WMub~sTC_ria=)Liy$7|tq>#{0QalQPw`}nm= zk7!i;{<(Aez2h((iuH`Qe{e9c+wR5v!#T*w#G*u;FtM{n6AhEhkTuxSJ>${AgqmwY z(E(BT;xEoa${n+c1rp-~ZX%JQ=yB~0IBibLcF{M580F8L+EY1RxOrG)>#gQ3olR$U zDW>D0R!708L7LX9GYq7nl4e^V(I!uo9VjX&e-rKEQo+C{Po*)BY>6Bu5pUB(qlrX| z_W4%#s5PL@Y~f>JA`>G)uZ|q9?r{=MNHk1nCDWu!i7t&6F{>{alk|@WGFw236d_5P zu!u~Z6b~fvY~s>H!Jj?zv=$Dve#6dr-bk|2hIhmASF z5WgEfQ3RvxS_RiCxsSn@QY%;U7jjgl0G*_(;I@K2{-q2G@lW051bLel8SF5>sA<2` zl@&oNH3+#%yA-j)e@9@E;>0MPuBL`4`k0F7__WwNBH6km@ZJp{a>`X)bW9v%Ds+Uo zY0VQ!kC8vF7ky`EV@3P*4g31>t7%k62V-+uYkMSD+O}ema!2$y?l%Uz{PzpLQx0Il zZyt<_i4eCNO(a?v4W4FAYZhv9Ww#e=b?gs!)i&sfc21D3wej(Hn}3n8+en#dEKhH+ zNxpemDX)D^9;#l=2{pMa=C{hrqj!DiZN_yLPvi|=+-Zfogykqepa_l8>jToo<%r!; zdxoryIqo@)Ve7-vMZ08d$yZQZBFl$3jPdVr>T@&|yTs*4zarp=_>3Xz6Fjm!a@M3h zP#+_)hZu}e>w`SP?MYF@zxK=N@XUly?3=gQMS~{QO16oA=_wmPvkabiaiY0|?UZ+7Zrg`T3 zTU0`??xW*Fwf$vAv`EW&n}X#6hWXNhf0VIVrvF?44ZlZ;)XJ*a{@%bi+gN4XD8_&| z2iI^D|GPc$L8%iMc>63m{t*Gv-UQwJNKoED!M~RpIAv4~ii?HJW`W{C#MID56>Z5? zV`x1=UB*+8Zh1h-K{WWotmhy3(KGwwk9H71eb6Icg`U$Zkbl59w+%|?%`RPo@T}ZL z;&1@dN;8uZh5Um714t$%TiNJ1-VOLsh^&p*H+-n9i|4YEj!6hbVJAg5LMHE)({oR* zRw63d>PQv)VhLSlBcDLYUJo>OS1KW4)?}iw`x0gXROmoD_wy5nag{!6!`H&5T86nO zWne_44Hmc^7e*&W;p)rJJ4R(#3H!QhF=yTg+mZCS$RgJ8A)aOTB%)G+O?#^l?||T3vX~W|Y>?pmEUnnrXu42GN4_Y3b8q zD!O!4R*n>&Gdp5aAfKoB6RRJV5H+*ZAXW(^AH^}`YGd7G2dUEnyEiEn)It<3Q4Ojc zOQfEdi(DFs4LrmQM3>tI2g|Xp44)0V?DOAdT3ZXeSK*`2mLGBe$(B9Haz~-|#I=D< z@{649&pwp%wUNMp@X>Wln2BW_6{ojijj6{*Mp&-Ix3uC;F7R9p?<|get5dDA9dIjn z3?Z}tEBX^weBFKv+9wZo(ZMh#j`H{%wE&HY0{sx9YT(|y4qnLU8quG?;UHo@_j>JS zjmF=3nh}4XmE9fkwo`|y-q*%Tw18Q#DS^b&@M%#4r>m_m6qoY$q9>&U(q60@qpi1L zc=6@qYP3o4Wtb_5J7HWl!ngs*gD;@P-})0w#9SUwze`<7()~MiO&?O?&J=ff2YdY& zD8dl);o{>VQ)7WW`57kN+9eGSj35!E5NadQuona%_1XCTl!u$tN6C$vK*avY5C*62 zHDYQ_OfDL#9f^Y4;+L~=jh=@a(PYfb*qeneeC#k$@Vo(3FMSv!dF{hk30ZUq zm#V+-erU5vOsi_Rnf(5@@ZNyjS%M*Xbr8{_x!8HbrY7bfju;Gc&c-NvG7XzTSL1*u zi5~Yf27U|pR1Gcr4rnk(7|tKV1`_R{)I7%?-OSXk#ntS-j!z9%uBdHzT(-Oo zrKDX-rdQ{JHtA@tE;H%&z;#x>1j^M|?##IXI$I~J9>mYv&H-}?k-~D-->{NGX@l7S zHi=W0-oe%U(tlyl7(L*V;LzvG&tRS6?g_*I{6D7|4|$iq0<${& zS;6}&1{I7CO##MAk+HWqwT+F0IOE;^A+)Sw6?C6Ti01S%m}3xQ4_`4<#I?4T6I6A= zS>=DmUjCZ}cu8l+pl^Qe`03bz2a)#JZeXH`gnVp(?mOWGaV-AA2*#VwW81O7g}qz8 z7Gx9t7hVJqOVsp<4Fyk;QI_BDpdv&tcliL`A(8{0PF>m1T{{J+s;dTi?CZS06hQ*y%$f%9QKLccim4iXY%5M|)|x1IM`+_3tw4_)gHAQ> zA`ILx@_QgwP3@i`+%Rb%1R~dLO%gm)k^(iq0q;>x|AR+t{TnMiy}q3Xyp$nZ{ntCm zzpdsK(=j8crma{wWC%vY~zopw$(P3dKm&xKg8ZD(WRp8xVz=7vLnqa50`b9 zei`EmW&jCH;-p}|^j?4p!BMl}Y`?rA%pJphB_`pH6Z-?|954@^-tlv2N(&!rGkD1y zZ?m%=)*7twlOM%gmWEknC7*j!4`NdQkC~_Ia=%Zx6MmSa?*MXXfE$SFXD2P|^0{K6 z7#pg*=sXpgf;j7*Kv{t7o(LAaXadxOaupNz-!NH!341Cq@F|Je!!d&pE-p5N0r}l; zm|gS^Zdta`psN{X{Q1GIp{h@O)N3u?Y9iuLJ3aV``VXp6OUA_=h`cq_9ymYS_qz{C z&NyL^FNOZ;G1xe9qji})*@uJarFX(P{Js!8n3hZAwBf7$QNs_>4W%v&uCVvm8rEj) z_~7_{{Nscn8Z~ikPnF%9iGd`!T!UW; zz%S8Xe+Oa~fO`QD3-_t6g(zYHcSmh&^q21o!4tlQ{OD3Okw-%btB+h|-?N%0?>PPg zmLoLh*dF%bhhtx=W29-1;Ly@phqk_+?mn>^3D~qH|JGCX*Udc&Sgkb;2O9qIc{~~w zx$te9TaDR(qmj+L&t`Y7d+YmD^rMhAg)NswGwVR_4ej0xG7B;Y#Cu%G<*CAmy2-k! z2;Ijx**;{9hWWRa=$I%69S_nqO6C0bjC*@@+Q6M|uGv-!y#Hx2bI~ayeOCN&3U3 zkyRkSczlAVBvE2yh5Hx3SA>7ng;I(|Y8uU!7(YzHm$MD}g8i6AmTvcG((1^%&I@0H zf$2v~+-aHDjV6|cQ}%B%`C=7hpin^?7L_Gs*2Cn}YQGj!p1u0=5!SMhu$?7oKe(#F zem#(Ak)L1$IHd6386AKSW^DCPN`UW&6-120ejOKCPhZh9?MrXT2eb*lIv~EQYvxWl zhrqkNeZ$XXlrhyt^kN=4biuFGO|x=K9jJ)_*3{KQMkQ^sJUi{FPpW>N+=*2ipSbw@LCHlWZyz@G40 zpl1Vi`tT+hb9s|4)J;vKaolihvhiYy3xEe+O4EVUp;LhntlC#oZ>FX)c1q`4ZL#?U zANa`u>-pPkzdNqe%G1FJ>mB}OImTVIcK1>cn-t1to;w?vwe6-CJ{eMs5x&pUXU@kC zcibCbP7o6UIQu26P@9`!%LIIX z1s-$^q+TT9#~tqBJs(~yT4rO`(uGEkm`IcM*GK!(8vAZOTbw^p?s~<)ssF<5@;nky zZq?oD=CGL*X0`2ww70&oIos{1)gdXBA<1r*Q@LATZpmhauC5A^V5#guwAlxv@=&)$ zfXRCWv)A@d%vSrVRstv3Zj1vzu1$GxcB<>-fjIa7K^bd4Z(qlb6tKFy&judDe=vf2 z3I@Xi_f;U6l)gpFm90`UeC_PtJWtal_)nEH-LhH|XK;vYQ`0k<;PigZQAr&xDXu^b zBqAH$VGJR^Gi%sm%S<0UC+kNx={$D!A~wjyDUO+9lQ>5eMr+R0#hZzw+}^7H>|dm|WqjnGZWJFL5|h3(#=*I`#KD_Kz{dEa z20fZhAgOB&v2T_=)XKcf#+9;a&EH+;`Ol44;Kx<0E07Pw)(C!nU}Y>f8FE4g+YZ|; zs^g7>x}|T+47Y?%*QZSOI>jvowSSp%A4dT4YI)@NiWk>g!4m;;3+C(x*QZ%youm>q ztQBlyt_K_i~WW^FHLJ=(m3%oC+p01Lhp1BPcr(75B(;*1aXYFF@X{+|f;zA2=WoLWO(aHCE zIogM4x!CeWsjZ`{0+PI~!-r>KD-Wf4GspW13$o@0RCD|wXFJ@1-^Icp(NO!OVkr0= zM%QZ@L}8Xd@$~Dfnrg;(U!apR7ARFfl=ILnTKX zTm_7XoR^26#t}tOFOvbaH(Fwl!B3%nBy93-Am~fQSI|43&G#tLx>X5^sy7gO8z4j6*df5Ex7a$6Hu0>v~UFP`rRQQfbyh z#BTc_dP;z7aAB$HwXC1RwHy=%Ar<;&?*h$=L@(zyP^>XweOjVVQ~c8xI;#NHB;{2#!me%{Ln_%8^wFAjFS*A%_EzL27(51Acw5_eU%x?1jZjx3X^g z^LX2)f?EYjmmj&)g9L#3!YVmX%a-v?3Q32ER!_BsdV%c8_LurpBY2Rq^O3x-Blc{G zE*tFRQ@U5a2#DSY@LmQH@(~`q|MGd)olJ*AFa()Vr{8!HkOwL=H|+c|n7` zaqerIIJ6J7ksCfv6l+iZ~D(v>FqB z!N(szRIi=+a=MS5+F77%dR#+md4tbNZzjS9r0S$GbGkd&!u{L69p$`FsEN41E*@xQ z{XQc6tJ<#_-qM4X8ak6+z{rM&JnVKy*7;!2bS7md@!`WKI)Kz`G4^f4uXME6C(^lA}6a);j(rha@IznO57 z^(}@v{x28DWaoqJL{zIf^B1mqVh6C9!Rrq=HG|VU2O)nP9k8~b%yA4Dq68iPhFUfSsj`TJQf&*f6DU-1O2{<3T?qM^2sw0>DwgV!-fv$*S|`T5Z~B_E}aiKJjJN{3CS-n9jU>d&RbMWu?1 zFHhoR;y=sBvPc%yMYW4EqT&Lujv&hO5OP?lxYkW6tkifbxSLJkZ5Psv_f}!$^uo-Q z#FrCEg@PRrJ4C7ZthHl_J zNhJb{`1p8PsV9{rdP_{m8~k6%EPbWG&4U9}REdo`yX7_e!(21g7I+mVXcdOLVGFka zM9J@SJ(I;dq7%##w9UzIUa{|5?`&8upv>&bdlcI2$@6O3p-VD{&E&5alFECr$anYY z<{m}WYM+(C*L#+?QS{D_V*ksF<~!o=7;<)KI|cnL*+HVJp&J^vnv(e|@iXxviCGN= zJ6NO^aJVssg9?k0Qb#_zfCl*927~aBMMMO7$#p3bKbx0JVL?%NxXZRrP;U_WR6&cT zCo^YD?k9`X!EU@S<>=&WdNNoKbqB=}H=rzloJK}cQwr?4i&r;+OLU*D(s-z-G}&54 z!hY#GhjT2n1+Z@3CeycJ==deoLUSO)w&R&Sr#VJY637WI%XE`)1C6!9P~8IF+6(mK zI`wOzfx91+q(SHqIpPkqxqy$*KaDi&Xg2b8@qHqwkYd?E_ulvF+iAO90xKHE`px*~ zjrbsf3tP>}lCwA4Y?qafA{sShA}OFC7!ex4oA?O%u+(61;tPmBOzej&HY$Ki~{7Dxht&Xqr%D4N>b+Sc$R=7331m zBrMKcoUI>R1mq7y6ab`LUh)SIqfhTnhIXp=0-^VZZ?6aP_Ovi2)BYe85v@hvnjadB zFneRadur8NO+8G%7OmuB5pZ?av~f_1B$c76RZ*wRjhi{r zux|;;_*NvxpS%D9^Z~XlYFgY=@Ikxt826<#?QGiz4h#ZdcX%;zy=QtKo*y2^+^&0u zwmZ9-Hg(%hVH6ATpC)QeK8$-Jf2kf-@4(w^x|Q#Rx3@ob;(Mj44iz)doAmhj&2ya5 zHDSb>RXdT!?D+yC`;Mis8eU2r^B8UuHX-Onwj-5xR^h}{Sefy$cL;FVf2=KtjL;46m{ehno`87*m#DnMus!J-meT6o4AfCK=fv$!U$M(7(W46u0tg)^V08Ukt> zT{iWx@V3pdS%Pq z^D##Q_K&K@N)NKL3w`qHwfGVTr=1!Y^6vAyjuKc^fRcEnx;6o@Dri4na(I9c$Qf_~ zCt6|zqZn{~w_2H6xOKT|r6{cN^<+ld?O#BcgLfF2Nza~bezrw4MKZqEa96Qx z8Vw2ydLd;LQn5lxVo7?S|CM?L`+4~Un{S?RuuA#dtrAV5nsqS=kGtB?#&T3f|HWGo znOY{vpJ>HGcxY?20uqswGPy>S1ixS4K{hlt_EB>ANkN4BT&B)2>7E4FTXw)d` z7s^8~Uwd%N)ovi!YgWeXHZhR08*S1JzpT%K_q5o~G#$H~e#hTVY`F({#I4CxQHn&I zMp_!fGlxeIi$u1IVKE1<35EOz_a%(!|0Dgkt(t+D9V8xD3THsf{gFrFHclUuyR0Q66 z1&C6EY|?B*S?qJ-bHQWI;D$<2kX*p?u0rJ@by_cDRm(n%Ejq#fxpJR*YAR zEz<4EEt_pY$KKoh!}>MSt-`*-#l^GrL-e!aXP(1l$;orRjS0l|d(nX49=xj)G9RQE z^BN+9^Jr7^KxWR;4NLQV-348}btMC(jB$!2OIU}5f>rU+8ZsDMW~t?ZYOR4-bW_Bq zlmX{BVNWtL!`3Hx6j?E4U67aqJ#I!GD0h#=aM3we>H={-XD|ZBgt|;lS=zPNq>}i*PUvgi+$rf1$BEu;rvoHwuw-av%rldL73I>J( z%Gz*0%mbT->Zduqcq_gYx0Z|hg-)L_Psi!njTgOCF_O}FNULl}G>xXTAI1u=fr6xD zP;yMV8=9Xi$EYk<%JL-xQ5EDLU$f?nZpOki z&6wqO?vWt4cF}KJ1R8GWr#jD$WS0TKbj^f*@A1#pkDDEz?|}pLme;3y1;@w_nm1B^ z?h5qHOi>vKnthb@zLd7~v9eWt!vsd2kv`iq%1(%l*iu#=_-S4t81!}{*$5vw4Qatq z!9ek!NP}r2uP{bu$=pF!V)$+XU&L*q>rZ~KD0#=9_sZkhY27Z{jYruYAGWXOG{O3p zPi+K&gFM93XJkl1leISag55*JyFs~tGb2mF_UFa)79v{=On+Se*L>``(BkIcy}>wu zVE&0sthNPve(os{Ny0&(tgc9OL~xZI{<}7?*229`EWf`|W$Dt5~ls z`U@;z3rCu49@3}$No!tI0*)p@`Fp%1b3RMhhXh&>i#mm85AoFTE)M?h^c*~C;wYB~ zP^pnvR8v9kIX3fX;uC0~Q56vVM-L$#W#_8C^f#Q+-1mMfhi|D++WKq4Xtd6PDChWj zHPe%?`CFsmZ{M-7AFBqOz}L-V|1G|HXeHNKJZTTKy@?PYlDw4u`0_Z-+~|}47&jtU zY^PT)SoKzP6~JrFd>0kMS;QSRj0!>;P18; zvUWMxQkPqndc87i2vm3Y&3k0mQ{)~wnoOMdq~7Ihb{f5IiA%4ecb)$abeag<^SP6$ zxtVY<{nU|T;?z|{gPbQ`W*lkZrec`lCGJ(}l~kP^9K3SZeEhq-BQduhZhKx<1GDe4 zreguWWQwsEQPk7~P%JIYs}Uw{zbr$^#4aeFEFK;m#npcxc;bqO7B6FGrz73y zLJPG8=;u>|z%gTad3}9EF=INxyYTb^Ogl;?V z;r$~xjB#m6^ZJJ(dc@zc>+_)4t(zL@Cuo5Xi*)?bgB>4iCBMp+?jnxT7SjfLE&36i z(Az8ptoTzU*UQLmdF}6Hd7C7RE~Jfh`r71WO!d?C?KUxqT6{^#>KJ=@zf>jsIXYDOwPc8T2dV99W*Ktb+ z9h6!6tu*$`q3et}`vMb=&o5aFyn0(em30gjoDFN%)Zg3ZSwE7zsZUIM_DNY%S0%tyn}RHIxGIH?%y59S>F}tqDAcQa0)*vcHFPFMM5=?Tz2*Ty=X!jHosCkGNMeZG(2GIT=hRV zJIChC0(MKs>9}Ltwr$%spV;bj(6MdXwrzK8+j`>DZ`DklnyK?;<{#{Dd+&R#bzMm9 zCsaQu+x|!pnU^F{&-3uzDTdMv`_yf~-C)HBJRjG@O`TrP|T7WeN1PF?17_*Y>iuZvU8> zPl;gl$7utOXmE&OY?TQ#;X@ak6r2Xr>EG^4W)k||@7-0d9J=bJx_F9JF+e~I>AfGt zzRi9fd_b!9WAi>&e}Go~S$d~|N%p+tGRNFeQi`{Zyowr7hP;lW!ayP-CnNYkSeO+P zYphEt!Q-8$R$;0Q<@dNU>A~|X6X^8=>E?L72{geSBWh!QP59nWf@^(ai@>}6v%AiK z(wxsiO^1u-7DD^o_{f3r7X^s^m&uVii?aITbNm=AJm=rA8TK*7J+jFeg^EVH4QpBy znMzHED1lRZ7gJ)uYYu5f*l!_K3{3z`JiwEu0$;%wx2EZr?Q|&X410e;$`KAhoEq5{ zXUC#hrt1i4Y)|<>SRQXp4*#zzQ=9j4d}+G#PI6Rv5smvx=xRx3DjtRI{2~9ZX=CWM z_j4a+7>CR41Ts#&Rj)%gq51hcB6`*4=(j5@BDN`9r$Jj<|3}&ZT+V%xFx}(o174(? z_{UDb_NNlNKkC99)8iikP|>mI;#tTb1m4y^N=%QlQ%D{u{5P$(<$|&v(|UJHb#^Fq z#6P_pV@r(`n~jGy_XW*D#9|V@D?*%&uN+uOZL#2ZR{Q!Kkv#|Y+?8uv@q;55G`UdR zlI)+uedX$+SI)?zdZ%Hy+udzmP1&yvM^;4L+nd`GcaQ+-cPCL(KR+x;(*h8dVrUR; zDqqt3%~;E7_&uxeHGq20U)}n?ri?XKm_);5#Wo3vx{KQ;fU#B`-5K|i7P2+^125%) z2jQvO8C?S2M0fA6v)?Y{gwMO5Y{uVamX_zzytIBV2bAge6${Qv3QLEYCkMu)qg0ZH zA2`akd`b`zlqUx|+Ad{X`3n|V+)N3v0jTkfOK>vna)`0kIasiq#<)407$>!{P?Z4- zSuV+sVf^>bYwfk~B`+gF|L>e(iM zJsLUFrAtw4d?SuEp5>1y@cSf;U-Ej~ZrT!(VX}DNbS-+YSu<6_&`4;6RQ)`bD<>Sw zn(A6MhmJgKvYLAtFVM#ulXsX*Dn-vZQL`a}%#Qt$aY71XXX0Xckj{pi4VxnmDX6X; z2ryiRF<;MdpexhAt*`9u9a_7h{`}HZQqzNoN)&dome!WG4xbfPHFtvK`Y|zyh~IQJx#Hqka5M-c#6qRo zc3>&4c!<^}!bD4$HoI)&NvvImOnzzi>MeDN{zLMy4ib=%KL=xH?a4q`XHgTXQ zK$EdD{3(Q!yj&r~&FNTDMbbl4IP63hIi}~>L|JEPrCHr%7AUeMd6Zy_m7qYeA!wn=3QzD7;~C0&beO ztp9BYEHjB>8Pi)eG8oXz=yb7g(?#X;l@(+2bHYVge|~GuI12L(V@vuwIT>w|?v<8y zb2|Yy69;Sg6h47NgUxzP3hQgkLsNf~@Eeb((mNZ3ihja1xD<7X%cjun;j7*H;qF!M z%R;QZcAWtW!Wij(9^E|@KX~cB`sT2O&Q7BIcB3ktlu_kRvoOiBWnY`iGC>SMdAcXFgr-u9iTI z5mv<4WqMyx6go>aEuA{@oc!aKsg?+Cc8YE+Zdl>L&~(97xaSY$5vHu^JKo^~3nWTB zlYYR~ZOiS3;gn2hp<=2&0&)-~b9a3a!QQNvqJQuys zm{R1v#>*e_fn7l?FpR}SjQqK+C`*vX|4j%$@9^sXQD!kvW>Kk!a7>Vy zvsY!hV;h5oS|MmnZ%#o`KRg?x47O1@c76r6JcqWwf@mj)DT^9Kuw?mUls+c!au-tPaZyVs#KyJFURIw>HwfvyZ2L_mN4uHrtv+h* zFe$s(_hw^H1ioe|lN90k$2}LA;sxqm_hX~HM+9?dEE$Zxyi`Q@8^fQ%Ur@di*+ZTb zpW&ZXp533tpY5I%6F(Eb*~qPB78hX@BXhr=(u-%UxGvfk+evB&Iw+Mag)yH}e?(_6 z^CgGls6Wyk=OG^kp;Z1QlZcJAHKA@vo6>zMinyoH`vW-K&Pp!W1ZQ!NxzBqg7wRE@ z=6vIO%E4jq&05Ff+tP9=PvQ>oeQLRE_XgritmNZ+y3kq*-3f{fe~PB_KwKE-1418e>07d9O*^l6 ztXas(^XNu&xfYVWuFy7cPNPG8-5jVKi`U%^3psgXHT;l7He5$bmSV;n_6b<$%9r32Tp zN6i2@>Evs=HTL{XsCxXEo)IiOIkS@Gc z)wwLeY$qs7NR!6-#d5gBSilKU{XwbNh~kKJT_Pf;@c!)WyuDp%RSIowqUL2;H@1Db zl>-I#4*Lo;(u=~E-xBuFVV-l87u<+1sFLn5#W*4JED(fe_vZu7X`@7xWHJJ@5KVa4 z5n%q0t9D&^!M@oRW!8kBgZ`0qg3~JpJZpC|x&hvlVh7};DjD)Kp^*R`sqc7QSZ>8cljN=P2R8LXn+>a4*5aLMPnjD zlohe+z{2h%auK9mbMyUtZXT{srRa;)nDZ!hDg&7FB=}8%{EN9-wWpOT% zEes>o&8%dwgh=Vy$GlnMP?(z);zLic?5^K}otnh5hu=9172!W(%&_JKLT`cnj+QSc zR3Lqdo)l$KdoJI};o9{%N?c=Ks*g}aR;Yre!SJ;X&o+xMzus&0(=ojp`*WZo?xjUckSTAkOxVhD;^}zguzz;z4#0 zH~#f$j)>+|eN+{6pRXB|+z;_W%Uwfw8N!^8rs>v3j1sz_xxZwby*=J1g;k9{HOql;(jCTm3Bgh!(R z19KuB^e-;w$c?=6mSs>Bh0upR72y6TG?Yg5M&kQAhW%vhH3$e|>ELh+?*VpXHX;aD zRHr+124iF>F+9AFJn<^n@^Nog3p2l0tRplL++qLvpgvRm5k{-^>3+E|E_UUo-+4KY z&IV>3&>QaqeIboDF_MObrgXU2{pxUsNz6EwH+{T|07|74D&31ZssYI8Z( zVVnQ$s}nB?36lxwx7)?FwU9)mnu@Vg3sY=n@}Opy-k-+I;?umZHQ~-jf1NL)m6M_b=RK2gz)7Mkw==lwS3&*j*B?V1*z}G#436g@QISE3A-QHT2}wUNs}6hP z(H<%K>UVGKJZ8V2jv=|AgcANlB7cI)?B{Xt=;cPqvYlQGt1*{Zr)EvquY;t3i4_$} zE>}r!f9Pzp30>1NI8;6U4PkV0szL6>>G_p{V<-y%e*9n?RaTwTC`rhHjF`w`@4KRN zOBopcOTP@;;az+FhtKtAVQ8>{1n%6Xy5zHAw^so!OV56fzk(Hu+K3y*=F}8SWvH}; zWT8}@CxW-TJZ!5H#exh7bzC#zCJ*>Qjs8hXvzuD$Zs8zD5_0i%^WeS?PR5-;^Knp{ zLd57t#@GIs3HHrgi)-I9&M(l`#j9sW+3p#YUGl;RN9A}KVszJtnBQ&(J9{C8Sx9@5 zcX1LgEu*A?+hCY(JA6oE6aK?yE~|DJHA_aVAgI?b73&=t=j+#1$6KAO=01(wUg`J0 zyj;d0A46TY7ym6N7N|yNog8@-{&l&NLD5XIm5SD43GlswidSt}VwWrVlj?|#oPq}P z2Gli{-7rcTaHgW43wLLCKX2<>`ma+w`Z^DhCT9vtxyPhKD_fYl=V1+5xxl<1;}ayr zy$Dv}mZe|tsnBRxqj8y&akC2+<_&g)w{G&di74$o!LF%Dk9Qs;ewQFB~eQ( zmKjjXw}BZdzrNHk(#a(@HYNccCqdfPRWu9@1mgz)Cbd)E44;vX+nFEAtNJpLUQ|h{!kBYhc9FMkTQ9XEOI9r1QFg>dXx(&}-#X#0jYU}~DF&I+fHp;{=M&1$)G=*fD zZWzaFdbDg%@38c`=}I?F;Dkf~+NTH<5H&zsZT=S!3k7L;fU(f=J-%W+{L6z!AjE|M zzaw=FNJ(B~!OS^t*SF8&Exr^w0c`6XruTN)j#=-53*J1055|-7AE~XTPH#svydh1j zx%q}s==#3K)O^9q-RR?1GQa{8X3<*FI&%gM%{*w;_qc@3hgg%Qh zoY#LuScK6-OdY(UY7D09#XD!{n=G~;_k4Kj=D%6;8O+B~FmJ0JjCJ^eoGB_{>I9Ja zxHLgWKZ_z;viT0AX zze84Q8F||7-DV!W#;y45sg0yBGF;B0#hc#_-hyj!qZ~?7%C-6Da~epAz;vcYn^Tid z9=CS!9SiSV9e%l)tDB~FWHq}@_U|WSRf`upsNa-r;xd_Xn?Qraneeb7I9U2Q+e~hj z`^-l@!Aa=O!wU7Zyxa%fDE4coelLZas0)2I2XRcr2+tN27_w@n)vJ94*#f&E`11eI z+lzBsLHc>j>H0v*Xl*^~NYaP2%_7%9MGGJ-yU}zm)4}U%dE`m#t@Vx_3&~#DMlm}S zP57YI?JY1&OR)A$BwR3ohl=7hH!{sJ9Y~h9yQTeeXcnTTJ!I=U@~FlbL?O+864#c( zCk5F6hD2EYl&sg$vmJdEyLfm<#N2d`9U+yi3!$zdN4w`(PkR?ep%$>_#0c5@!fa`o zG^K!`&UHrc0~LC;u2kf;>nX3UHm!6FXOn?)`4O*<;l z#tkwE9d~1`CD)F|GdMbF$%hA0du3-iiJRaw=*@e_yY$z&nGW3RvU8gotA3Hz+zyg29S2f{Zk?$JCwfJ$l1V{g##*fllrPw7!rmfBCLZRPq!}=DjIqH?C`_;0PmI85A zAalc{g*(bZ;dmyx(;2~}a6GEj9i($nV!NPLY}!3&(1NuN!D|H1h|FABeK9=d_@>60 zt!E2YjRxHacj_xbYix6qaqr~r<*dFNipm0_M8c}nepHybh?TsZqR^mJt>Otv$YgSl z)&=?(yWXz*yPn@d@~-PI7>5nL#mJ);IouX(ODAqqE*v|WMqebIX%#zWxPYuF*l}G& z*VgUcKI#Gm7I9~51ABR8SyO#|m&hh%G*d}&O7?|+XWISL+i^w|?8tIFn$WdK^VB2* z6|=fAkeDjnb4qLv@CLnD$BCvR=|+{H*VJVf@Q{fFM<+L@~pv!4iRh2)}tXj9i58{~`@0YpivXATsv*f{J$48v_xYk~z-%W6X z@{*_f3CM7m++`=+&Iea~eWJ`LdZTG}2ZUzS_&NOxn9>9B3jrT$Z&pqqMw;5YMqJca zd#1*10+4HlK_l}{aoiUgbYp#r@c+%3Kr(Me)S9RI0R`7n<%WIr!RXSS)`KkgC=%|i096$baZA(tDm=D%WW8=IF zDMG~+%F=q80S|_Z63-F?>zE?|ye(g&gBC25IJKc}JOB48!*&GsYRzE?GxXprp^l2} zw=J=EgyP9?d6|@{)Ub71eS7qE)uL%sS56nOm#l?@$YN< zT7@8h)yPEGtS|cCo}VUZPRV>>+~X>zH$t~y@jO{)Q|_gnF2@XECn*Xv&2d57)EQ$V znIhgIw|S_f5%&rT!z60#z+q8wp!I!S6dH$9-Li3mQw_7#-(YTa?)PuCVZ!1sg8a{` zi#FpM2af734U1Z)l=NTZLf~q_vp2#HTI?Fd#ai_W*~F-3_HyVZ?LAyahtY#}jvwzz z!)~v70;QDRq-yMkq>{2{zg)bc@S8c3)!XsyOpk~~8VSteTzcdK+f04EQD+2ZUeTT( z`=pC=XjgmpR$CEJkuzR-xp3e1sq8L|eQDm*UDW0FlC{i7z>>HIEYDbE|7tPIx+cpL zD4jn#gTo*!=+u{KrF5DSy^oxINqOLwmh&$Vc0aHt_f_=#LA{AhSI*kdG?|HhyBHUf z@c6OO@?#5Tv+uyxJ^Ad{M?_LY`E_wIV}o8ggDD85z~w*DqGpDy}lIN;epmrlO7TYDnn z$grwFlWXFtIB(kk<3MJ-q1EB}nXAfc^x^#^3$OVAGp`A^n zb@jJ{@^0O(ygS>J5W=Wjx*rIuXs#x4^orZ~OJH~2xf(H2PvfCcu`Y~cRn-f0tE#FO zc#mae1HN?LCi^%IRx)p$HcNC*>%{37sT~~ZbeZQY#I@$|LexjQ?VXr=gl9qwJ16Q4 ztY!N+Dx%;lI#POq{*B9Cfa)(<((0$*)%)X{38-ut>(H9kU?*eK$oR{1HefrnE0enV zn2~K(wbF%kDd2njVVOEZIHIs7KS@3^v$jquk+3Yku;x0|JFncNneSvJ^iBjdY;D( zk8-H@+hd-#S$mXg;zycZAW-^OFZu^l>9UbMyJ5ul{rCI$`dJ)A*I8KieS!3aV1MZY zTrdXh-ZW*^uBLgVvB$~K{D6u}cxAs&*{(V6JmIeJAGT%Qu)7Qt4HnlC%AhBRtpykG zf>1bk!{P52imgmi$8mnUMT`=Q+<>h@><*gNGC~i(ETFdH=zbEe<6KytTf`BFfU8=l zYURGvpk1+TI0z&jHa7ny%C+gpR&D;UY?m;Fr|@R*D!lh_DC?@qkOF6qWWsWTl*NTK zli0oABKpeGE_JrFM8(~opbUj6Ezaxgi1dYL-zgK6Jr_GD#klqpNxXh{Z{*{IFx_ik z#Mm#Wt-ZUxr@6Y0nUNyW=~8vJ-}=OA6-I>ygMs}E+M6ch`S#xDqmt+g_LBf@Xi)k$@ZP`Y=e5bm@!q@X#fS>%_Ywj79EeX;Nm9$sOA|pgYet?gyo}2pyww3sgA3ly$}TJr#{d1JlW5 zCAsyWT_)7dTIo9evVt21no5Kujd$EOhTcis0}G5SiC~$awpO3jV)s^r)%x@kI(0^s z)qwe$#>OQWOg*=mJdClmKHC*tv@q5JQ|rcvM_Kv8i=F&)!2)Gdf!M;FAiWYZ&3Fp* zII3aM(2ZM5I=l^mA2p4?wcG&4h=#Qj2bXj|VeU00GFDUDGoj|A z^I~VAieYw`S~5Q=2|mmJc@aQ1?gfG>Z2L^jpk~ht2<2Q&$jCEJ2*l0G&nl|+=26r$ zLng;a@Q(v8os~yhiW7xfm^;NtrdKuNKqCU0=xRCsjWW@}8-&zJjtS{Iyo~D#_OM>I z!~5TNX>X0c!do|_JixZiKZGnt=MG~za((!%O-J5DSKoaFKIHx^zX;>`B3GMPd>3`Y z`hhs=!TDZ8L;-qN1RU+8P|fnCPv^4%i>2uHb9N980i3icOBCwGkiq(Z@f{8S0;GMN zxeYlW1erqb3X=8o3T;iG?rz{+cY^E$vD?a*Vg!BFU@fE}I4g+Bk2%^-&)19l1gd|XxwsT%qL<}l8*dc9hKr!J6%F=aiu9+dpTxnaN<+7O45;dA#S!QfdzrN$@A^;thMmpI zN+qpaRg*}tbuRN((O;vHxX>i_Jx4FHA!{Bz^?41{+ctgsR@rd=TF5cFgao?8%@Rl` z6$~};bCErs-YtikAlE)57LBA>nCVRYpwSUhihLry)ssB&9{vXsICpS08e<$_a|367R zH`D)>)K`1M=%JoGKP$;u*wWicm(GL*mo0U)idSpep{JT`Ie}w}X``T|kdYa~5fKN( zP4U7Q@4)`SiZIAr+J|+V)Cy z$$7{+$?8YIefV*Fe9YnZ0GOO#sq&voQ>xa>&uSFGM%{ZM`E6Y?IXTUKhrH5w?Ok(T zx@+9tcf^kfez4i!#>|dd`um34_qcpdTd~ca&&z|MQny(*bVIPjVF!iHbh&DcHo3yA znNOtzy|>9~p2SJ30l1BRM-whVQ2tX_@xEWvzrJ`2L{D;okn!y<@ltX*zKV&C-5aXK&bGa>S2zjT$wp5WRU z2(3nW@~JmnM_>u8l1)>FW3yf{dLcTv#_P^jp$109(aO@;ym`G!goFgu;KA$SW^V~X zGA)})HJS8eEh+`FUL0$s6^Un2z2ay~_9@sS}c*$au?m_Y|#4p}fW2_dx&wDd* zUqJ;Ku4V;UrpB-|xPhwV8^BCg18}5k7`xL#LG1m$K9n}s=O$fm+-VuUww74s zb3B#Z@DhBYV&G-1Q{k|_;I()%dkYw?<6bqh#cYAm4W=JBHc_qH(gJzLX~FUV^+DW- zdNpM#c4tJ!S^B92&wKrHeRg1TGg=?-~fjk!Z2d3C$i;#X5oO_2(atZ zFoLUJTm9#@Z9(yY#0_mXu3tS^B~1gKD`caU8@S z9X%{{sceg~>~AOZQxY7(-epsP59MRb|2>1banzSWi?j~z1Sa#J83z20$H}T{cJ&~( z#?$q*KFLXURNr^=tbXO-9(7((!MovT{QH;8`(OOoivp_o7sVUDHwJ1l@0%Q>b-J;Xz9GLCPS-I+e^ge=iQ=J)l71 zLDOGqXY%LL1V%z4i(IJ%jM>-OvfAImLaK0#$#}wRrsMNKZ+fn?Z|zZ6xQ`oSt6|8O%atP*XG9HwrU@3>%R6AcKGiI8byrM$4xsYBcqRA4ll#z-quO7GYP| z{?ZYX$daC|#@3cSBXO0!OVRQR^lrg8Z2U78YgYvZX#klA%f|Ajti!(?3IRUDwp4z! zBsCBg=TIBY?)8@=d@!AJ{723ts^j|~f*Mr4B{xnkFwTxai4~Ft+!Lw?zc{dxRV$cn zV`|d~)d@1TNBs1ft%@y@#7R(mXq1Sir#D*~FLzPz>T-;^8-G>G*nY`9drdC&O(hLw zo61(zEudZ__D~(D2AgVTaTYZT7(YS-op+=)j%6u^2&B=p*D>F^mN^4Ra9&YaUKDxU z&6K`#=;W0~!Qcb!DX6As>>bJSS%%beCV-v;{6`))Ibus@6f;J8aO=Le)H*}~2Q=42 zm$`6gineK0iLYZqNWG_|!$v+QuDNViyEogMcS#`q3rce`3E=ktF7Nr*Tr`*G&K&*< z*2+(f7PuiWd5wuLa@;aNo0W;iHCj6hAT#~h5%P39_}dfnstQhk+u*SP0ES2A!nn2p zi)fyrR6u*=gW^omO(v9HE)5rv@B5Dq9ry~tdGqGWWnNdAcOB;OWGtG`N55SJ@)#Ap zl7AZc93cD2AFh+BxJ?l-dJD(r98yZO3S5F$B)u{|dgf~ZnLEl`Rcq*#Sj5-rJ#pAH ziP)GT2pKSj&MMc0?jy7{t~~7CQ96O)vKLr-sPx(*D~5%z8vQ z0-0WI^QuE;2wp!Q;p-ff;9Q5e%Ho}&-*2!S)Jz7aMifW5x>L0YG5wv|BzcZSuy_PB zn&YB>XllJ)H{+IsmmUjlID(Qz&#p@H?Wp${g&=?^)R{Wgi(dyKU{4|D;^SCO&lOr9 zIBT_Hi|1=Id37>a3zr*JpcrcavM0CaATT$_J3WbR4oVM!v+CL~MLMT@}CucyXI0u~guQ;qtUN@QB9O-iJ<&p=dZvGK# zTGL7poNr~zzxS^`#f!cs%BvY(S)LJ(HTpH0V~D=uEm1I_^G2wX{Hcl71yh?4!mV=} zsXk3jr)+t9g(CLUmQqS&faS077@VVQNzl_f5vg*{jjP?bPmyh99zClFX4|#go_}er zNDi*6q&{kF$5UT86Pki+D1VJrLMEpJ0cUKckEuWw?8)yhNMGz31J}gN>%^YSuJxV> zpPUCJsA>c1PgY+@b^{I z+OA}N1A2ppX1Ac%0hGtIk!tNWLXzOY!o|ASa(3}$E&h-YoJZZ5d#mgBSsx-dH-a3m zFk)Zsg+gr8-aQfY_Y=^`@QMLnUSV*R>7k-}YC~RGl%j#f8ydlS0jr$&qucze>20;s znW3Pu&S>tpL`ZiGsYtHzCT*OyQcEqR0msMUBuV(-F@Iece-F|ZO{fpw9mPYOJP<)C zK|p-qfj;Mw?h=0t274~`-ycsvwZW#SsLMLV?!BnsrH?Tb_OoAS$$Hs$QDOBkb*0Ju z#1TU49DeIeOO2t3S$hHL{Sw$E?EBQlGayV~{duL<^DhmpXsZ`w9Cgkp2W@TwtPBc| z!AyG(JwDhzie5P4&FH%u!_1hSbi`W68kb);Tr4iyhwjR~?5zkAFGj9Rteh{C_*WhN zKx4?v-`V;7r)LE!!9C}(p7AH%PmHY=b#zxtbY(_&d-@Ed9}KAv;%6xJk zVb8Mu=zW$`u9yTS(Z=$Se2KmONJYt+*?IV`YCXSLI4M``XT4nN9>8z8i8G!L7A{mt z(7cPMd=41;5%kE8D5A=(0hOnaL+_!S{DS0W(-Cv05%%co`PfdMl|hd8)|{GDd@^5) zH?WjR!{#MrT|vnJ612=dTZkwm%mHl64%iI_uN6FbM!1+r_CMe}KQ3+52<5D&Dw^?# zcRly8=W=~Il6FZl$8C)lP_*ceBSb1Zx(j*cuT8+dLq>5XgG#Vwcdu(bb01PByQ4U zANuvYeXfC-u5JWmI2BjH!`rQUlfAOg4Bl!1A6I~+N6(V;K#3Jl6xR)!2budxng;;# zc&a5kW$KBt;Q{LAnnBnfE%hpfSv@gb*ff(}G9!Fn6h@xR?B3-nivf`7Ns=MuTcEL) zo1nU#|7s#iEc-nOQWsXBT<0IqU}bl z^${`b17UF;BIA5NhMy&>CoEjcRlT-zUuhF9B;#at6FbPhg<;rD!foD@1k~z*FP0J1 znymzso1*(5Tu>Z0?O8`@cWy}XAePtq@=OjGWxp_Z;7}ul{~+QcGrmo@t8OZUTb63{T72O zZM;OVFMKG)7n2gjBHSFQP=bRaGbGb*WT1Y>B>(R-Xl!tw zkJjoP2pp(~`h0-H9^UCS;x{y;p}=EUS=cy&nDsnh`1xeTHKeETp*`7A%P=3Dg@=p9 z9pI>@t=ZIi1{-KW!FeWU(t8JyV4g#0_yn?Fs<(--UK#R9$Y3rM=5n4E98ERezIh%1!tw=-XFx>~<1Z<;@2 z@5oJE8*RN|$^5y|sW%wRGtLA(%vaqAtu?urRsQOb40y4SrlR&@jTgQ{!h7 zlzhANTk?lGNFKm1uLZ5-wD|yW_0)xbd^16<}==Z z%2rzxDI$(Nz%$JLoh&z44c5z5g71P#s;1g*G=;d{6DmnX?4I1L;;vlGKJf#1RQIT6 z#-$Rf9TWvcBJmf#-KT=L+n{)j8&l*aCOSUOI>pU}ox{ylv<(vO5|C1VhtQ?-kCIV9 z&b6lT515aJ!AIRMJU72@_M~_X(GOYR=D$*P$;!Lq!10m#JpC@#ucN>77nE;_#ar9$ zkr3S?j%$8RdE;tw-PiCmdO>n+o^L4j1Azw@-zAR$`*VvOAy{>p20iv0flGkQe{M)i zKbqYq_*wE3#lZpsMIaa09%PO@jnNw6HShzvEJ*j(y9I|C4YU+yLpeZs_UC5GPVevC z7p2JMH&UN{U#Dnt7^ygf5*YHZ>n6S@p{tLwvljcx0xmkf{g5?nkba0(2;`~~yzN4026%txWNdjtT7za|Rl zgF-hYd}7Bgc`XH*U*sJ<4#3#5X6<9pUX6t9aVeE>i?pKQ>vzoQ+`F~%MA-Ch@qLFA zGpmcpnPx@d05kaxcM*ZRyI7Y>Q$|f!R>%H;U#oqLUj-`l8l%}-oJ2ha0fkePx!9oc zFRh{y?IISY%!WQFi|V*!Niu_daG6{+pzVk!mF%=%1lH(g7Z0cuRBm!symsgvbndMy zwDR)Fi$yPdIZPfIE_~fUF+S1_{XQH?KAY*%ND&k5bvF)V|0g}^zw)P{5$tVmFVCln z^(*Y{Y9ncdpQGQ}WEEkioU>6oukN%?g^2%^d>sNPn?&d+ECA&_5$K9*z5A}rni}XY z`V4SRS3%BdfdU4_IjigHRqp)&rubhnR?HiAobFZK{+Qv1Vir7wZuNVG(Hn$wRq*p_ zYafmFXzk32B$91_OY^-&2A<38Sh7pHAo&yiSeX*Uupza)TPtsH)VIkYo#CCF@wd$s zh}`!Y-n*B)Mr2D|2@Z;5a7OG;kK3P7C4_;?aF$ui8ffWS&)V-DK&fb}t}9BiJK=Bt zSzRc~2!gTx17_Q@+$bWRr%<>>eAZ0T8H|RXM6`Hg(CeQIJbU0(FOHa*l$bPUh9e_- zEu`wP>a*k#Bu$E$TaLI6mHZV_d|R>#><==d3l7UI*@l&1^RkN7nC5(;@6B7!;uS9e zQT;c+ke=Y4@A&&TZ0O7$&U=6*QbDTao@p7|pV1u>d0ZgDr0oSRx@~G6bl71KIiJ1PA^>BP#NCNiL@X3U1O7k;&e^%(uv&?0RoWC}%g0wXkA- zgty&C1Zb}Ee26Bt;pz>nJ&qht>}V~n7{~7Qt}C`#gKg=;gn*7j0P3W5y0KRT8>?VK zL!(z2g$;PJ^^*@wY%T%eQXB1!`+Mr+RMN7K#SdEUk6i|`(4bziMkII^ue_CeT6*|y z(%7)V{l@2uu2kE(92k$c2mA>j-PTqpBoaT3e@E*IZxkZ1cGm0eYi;(kI-2SJd;J+t zI0@ZqI|*IOv`B0bu?bd;;%TqvG032x4`VKFM{WLqZ*xJ5cXi`gz%$qX+HZw&>&6_C ze{IsMwB!Bd*6t7+rv4d27l3ZY%L4CxYK2@zT=6I>Lwm1Q328xU4?l#yEpKVe zCOn-e-~CH9_{?@tv8wI!Yw}r@ppG2B=d?lsj}u!!GDN00KR>%+yQgMm+rZkRO|iQ& z)z^;^cgRA^?GgE!va`O^dro{6Nedv%`{~jRT&$k=s}OV;K=HIpBg36)w#d9|Mcevqe-W&!U9YGsIZlTo zv~h=#%+$x7c8bD7AHnh~@2YPsp&_jw=%kZ$MCy0E#(xn=+9Lz^L@49HxS3^bI5UD_ z4rJYU-C0EfG1xd z+i%M@M;aehr-wU3Gjl~x+VGnHmZ1$sq3DS!!&GN*!mxrU5B|oiWAPj%GK$-#E}e@A z0@LLUmY2@!Z%l@MFhKhPhRn7q;H$je`d*7iFQpCD76i07e>&oL^|~qcacB?zzM)4R ziX%Y&e$GvLh+qZFS=Cq$mkVZwfXkT=TKjw7v1sY)dF9&OGXYPAP8N(7#vT$(qrHl~ zUU?j@eH0)Ig z$1g6e^o%CD_>)pHv$Enjg$}AVom)*`veZQwj6H_0tJ*HKebRB%>!81$%Iuq$9YQ+V zv=bArQS7KgD5RN=c~Ua*S{nDWrVMqMt1?1i&-K$wd8=^7I8Ar6d$N7T7XGz;9IIr@ zMJ#i2g8;5J`|dQP(IQNhtWkT!*wr|wzueNnPKDXw9(oQvd+vAw7VlsJPvfDY*EQ}y zWbJ|}(INzsD4b~5z2s;IyALpd=dXamUHp9$sT+VXa{0QaLpm7=n?3>=TNqs&FQ?Oh ze;v`6b^2~4`5fRh%JkOmhSdiuks*N7PR$J<3viIsp)Fp_{O7s1Wv!NdnV)9dn>by zB9##lAxRpPjI6SvqD}THAtXr@mG^#*d7e}KfA9bIzW?L%IL~uG_jTRl`d;I{p8K5h ziC#_eXzlF&VIlwF?nNmvp*glxEu}1jXDp#rcsn;fslk4}e zyMHg8A#L`0)4Z(pq_mZ}Nf<`V%*m+v*?y-OQd`n_KZ08O!FA8uxz6Z~ez~inJH&oz zl&$mIgg9mgOQ1i#f}cNHSN!h7Q@P3{HrwWPcCz@LyVO4H{(g<~@I>GH?0qK=juYm7IBLxu0QY8Pnc}lvV8oa-!a{3dC_BEwRs(x3-z4YEu4p&Mn*;Vs))H= z(fMpG!$(T&yqc}ksL(sTyz)4^kd}@24}QJf**bo)c|?*lL*H7S;~h`7JEY9Pb)UV|ytfu3 zdS^1a53u=0i89@>IS@B4R7hq^HSpeg9gQOP$jLZ)pEz5*m!D9rdQ#H=L1y|)WiWT$ zGnLK_m$v4&>iu%C(yMMmjYInbu5UqPp&Ww!uu(IIuT{cp zrKe$Mx7}aaExD|NW#6s6nm*Sre}AF$_Hb%>7U7$4x!$(G8{Goy5(`-?z)x9ak+<+} zJuz%rz!RdltnEoy*tHv{)fgmwcb?2svRCrxM*5B29U_`@)Spmej^Zn_4|{I4A${2) z7xN{p#fguY0U_d2(uRh+ErUOH^w+Jb;X> zy7>5hxvTd3GlP*Kh!tm+8Ck!5@;#|UQ?_ICAnDcj_)u0Mryzc3hnY5)jTVHem6vAL zJTy5v^#ReQrIMYTDKV{T^7D!O7H&i_=?A@$YN)-2?eV-rS!4CiQqDJs>m=z+f+EtG z9{(ac@8rS69J4L6RB0CD4N;ET#LiT9=Qg&eZ9MjH(wai;u#%W*>5;C&CcuK%^iYIs+C|(0UuK6?sIl4GH%Bc z!!FW!`MZ{VuP1+s3mqH0DlLPJ-*dKFJ3T{#L7@CuZ=(zU;F|L~%uMoTnuzM`^2}$J z>B{3{znq_$S@uFSl0AYX70AcDjV>6u>jcNMTdf9R*SDzIO24SK#})Hvx#Y+ z(}b`DbZEk00ei?#VK?$U%<<3kn?5ntoOMV-XFja@`rxp;!-YqCFJX(-!7o5z%1wP& z5AVTx{rbVc9eaISzNi3Nb$l><{Vq9ErORE4a@;~(`oS_-?tuO09-Y6w>6CzDn)L%Y zf$)gflULA1a=pin{CwuXEhjnDn`U-LnZNaBP5S-Mrmp(;tTRQ8F2C5{7k=eH{(i}$ z{4BaVt8MB}X$-jLJBnx;?v`gluLd#BHzRtu;fe&MQWgpZC=IzXv)Za1DRVFP&%C$1T+29o; zZuZGirT6}Bm)xI*@6vx12+8p_U)s(taZi?;!*gK3_mFA%aU1!d9Ay)t;J2sp7+D>$ zOXqV38(Xq&m|TpRc(X1Acd$P@dE*s3k(0V7KUA+ZV~0K-FS^ZgjUuy&8OLYgJ0~wF z4GTd(xc9JH)QtB|i1+ymD#IcL>vGn*G3_(sz7sskzj{sEsf=o)w|sX_cqd;_( zS9kJzwW-<0JD2oSMfrZ5>ZoRX%VxG7b*Xy|s@nD~gW0MyzD@z*HICJCW}94$?WPY?g*zu{ONu)9IP0z^3Y>$~UH~Kn-zF&#{ak^D`OMv5`oA&dcKYW|+ zy?@75qsHyzYud_Mu|4wdN{*%g=qz!vJtZJG!U*3$uxZn0ZZnyUK4MXGL zj(58E>SHopeahtwDk2S%x1T+|I%Y)eD64u&exsj^g6i>UT%$>xy63nT?z{iU9Zu&9 zTyLUFHJtUV^irfh`!?45xgI~rGVJWY-k{g*&sv-RShe5vA>YG6_7p{~t5G?<0$)c1 zEz%^vT8GASF}5jnMc>=my{u88jjr-} zAr-K~EkLGdgyX_q&Z7xF);$+`hy>v?%o#6z*$NR|u?*Pqb16}2oyUKC+a*Y~eX;}n-a{-XYL>Z$`P?mAq_(=uT#-fqn=t>i-n$>{0Z zcPcDx$49Pde%yGOXWf2}9l1t(^_>JCKKvl;9DQ7Qgw8grE8h9ZbBCs|`uv1Yw5bi_YANfUD03I%K=BW^zZ$h2J<6Pj zw&F@WMQ`%GT#5IvZJC$+Bga|$*k~~3ni)ri`h)N9*U5a`?uK z&`G6xTxZJIJ67h22pEP$)spis+U~f-qw&#CWUKNopB{3a#%*qiD`(w&4(&^k2&}1R z{Sts77G;|};ym;5=B<&nqrHV~GKUkkX2@}T2`1L1M*2LgH0=yLXd^@r1W~LIzc}$g z;W~8|F=f-fdwW8a(5xz6Ud|u8#Ou|y0^O@5eQ{NSE(uri(Kqx@*MlvOB*)vqr_$Cw zw-Qf0Zt1&+U`u8nRqXqq=Q;h!eRnhIeVktN?UB&WIe7XYvUXgHy6Yj4YcRkaI zykbco>)AwPU0F~`cFdL#MQhuRJWVQAPF>cTx8Gxvt8B?P>%Gdmw?E5TR=(@$B}0bm z*Fp{6F$a~s=s2@A>+ytd*c*WpdtPkx#fH%jv4yU;?+mE+AzamcTUwR8t)1Pe0enMK ze*DoM;~3HJq78ffKUm?%kB#La6FS6Yp5_M@H@u#{X3D@kk#W_uQ?p8L&vzYp4GGqg zmTgXfE&F^c%MyGZF~r}v(RHhu>9kJFWbPnGxdMx^>1K^%tzVO3+!!5Q-JTw2weB*0 znJ8!wBDvF$xgaQcOE~|-?|CKNiY%dBf#%)cH2svKC8bmDp{|>=k;BB-6L!Bk^5Xca za|Y{7KG^Ls@ZeOO+@2V*;qn?z#{Se6}<@#|c>ep};SA)`uBkI4z zqtrTTl}s4@_WBt9ip<=pe~Igvh_s$%&7sr%o4E$~d@Oerl@ME&J8C#{`G}XN4Xxzl znSPAe#8{c%B|zvpd9Tcs|9Q#wbByoTTWaQKq`hodc8$MnYws!H9e&{3rMXHp^|xns zgd8jGex zFNdG^RVk%hvN<-Dy{54e=Z@kDxH-AXn(^xn1)r>f{rc_~4hXd*esp$0hNuL#xQpt3 zJz(T56{~z#z(X?ijZ4BQF)yz#x6dm}nT|Ydf34o!#o{-n67n&`IHYRpjB9@;lJ~9r zV7}_cuE!q&FLv*9IddT^dp9<^dvuBq#ZudoyrSy!4C&j?DpRIJ*8X%UQ)y1N+IA^K z_l~rZ7n|e+TsNv7UK48)#_8+G`FL=3U%Y3%NLSAb-O8_*N-ICzzbbuO+{H=qDif|$ zUWSx(YFd%FN><>Tz=5@wcNukZ;(P>4B-iV5^hJ>)-P0d7xJ?>0^m$6Zu1NfPgrs-w z+fny(qNCRBo>B}SuCELhWG=KB9(~GMe-nS!)96uMb9e{ygJi`M#tEC-zH)v#&1GP3 zaYSB$VIbpzNLKIQ&#>uU+^=%hvQlet|E?_dKG|nktKB{^_hj7ppy6?Rm3m3ha-#hQT+e(&>5oFHm0e)tgRa50W?Ii{dy;lXwm`e{b}I~9u~XXDLT8hAa_h$W zG+x@GZJ`2}XgqiLxm6QEcIq~+Fc}l^=gB6lj`0~3Y>TeB5#uHM7ovfO! z1gbP39qCKlPtmpb@JV!)51vGP?7e>A#}i)l(kkWF<{I&sFHX;n$PG6fG(9w~lM_^Bz68Z=%;{ zjq-9#vgFyr!aiN=`i_wG?-95PecP7nduXL=G^b`YB_A-#V2KZuzqap&~^D@$E(6h7_FEK+;oNG2)s^?1M63FCM}=H^^Dl~36JWw-s|Fz9%$s% z#cMjT@m}%a-6TegPGA1h%rA}}KVevRBau6#^n10r@Ciw6g#JBs?zPU?tS=u3UyU=J z=^E1`GmV}GtiO6N=u&z*Mq@0GZyEiTn0&jT*LE?*k{<4QQ;c0cP2bn}DoUfqg4_;m z60Y&Frdx+_H1;Qlb;}(we7hn8*L=m{bV=UKmjT7@EibG}yX4Y%jmoe*$5uqvdhp;4 zY8xCM1(|Ixqf0qq)U%yy=BtR9Z-SbhQG54Tv4V5d6WfS=E@`1vp007sn*jLxC-&@y?-{{nq@7s2&JVhq>Q!Vy}G*;-$DYjNl z;wbsJ)G3{2kk!Z?V^L>0{r!BA%G8%oODR9UpRKxH)qav9A%+IAo-b5M7e98K5tfxX zQJ$!GUW@xj=Cy~rQ{3#d8jGb-ZHzy$?G>lTl-DS*#m|`F9ApJIDKLR ztz0XAOg-`5MfV!K%5j%U*^Mha#hC}5yt;9SZ@ACoR-rDT%`maP>`378 zE6+Xh-knW+5U&}-f_%J3w!0pDSvoLig25aG=tg`*=i$QPJ&qh35_JVWfOU=fFhOtvc0C z9h(ihHVQG_j~!i8{+Tn@D9mv*M7lk9n!ztxp=G9o9M%&j!TmJ&RSJLY8$VelAH5Qt zgc0r?%GpzUMhpF)8RN%wk!wqr>)t3TF=1zK9Z}2*eG%3>aevg1aO`Y=r%Y=0f!Hfo zgq9&P(z11#5Wcdifwu&WTzSRDyt&0HuP@_xqPg9YnIZG`zI1^Vna;uLx#$&aL_`7} zovUTCqIgHA+Qkb2ulS>)(xjhV`}NDyDj?;iVDQIXMBy0ll?G@1jn=m~Cy9JwQ>fc+ zvx!62@}Z@r@H;OoXD#=gWYkKzc%{;pv4l>Utp`IrD_y383F*8ct!5ScIZqXjceV~W z?Gs#kt@u^a@Lx^77NoZpB_&8e79dgX)%%S1vEoaOm*Uu&>lg-!j`C0N)Hv_?|;KG&GsRn!TO@QmK*yJ5fZ4W^REkK`%wFZz$K;X63V)qq^mCf8ePU{7hITu}=w)a7>F%-_Z597SE2SzUyziy<4DFR!(btC} zAClJ#2W1sBGudVx)(_L;5{e1Nt^8We%wtowx$K^>{N&d1%{Q-XQHdT}!!75;R=BHh zCr341nd(lH^E;m@zo>hq)|;?yM5yzLE#vxfBmGw6)0$UapOYvGVffniB=5&=>&QNZ zP}~j4%$kEfZ7&$Ff5w`-F<-j+=G>X2=;5mlFRZ@#+>c~632vG>lU+h^?GdnyE2^`0 zKax`u&2#bTMN!4jJ0ERQLffLORF}Vs3Ra5YAU_Zhy^hS-da$FbqA@gb*#2fHz4gwd z@beou+)k*fJ+G_V^{7G&eWOw|7}wix_bi?Hk>Asvd{g|_Q=OKE$5cG?J4GK|tFLNK zzxlLpHQlEV>%(jdoh44y$nz-0UY9kyt-d8A;JHr^_2YC`b%;TqTU&nOV47>rS~H#< zmHm1vjcqa;Lqau-cNbSGcgvc1-+uioc`d?4L*>o-2F}rDf7_E&S!EHk#ZmFp*Th$=Cae|X<2W8(>IuS5 zSofoj@zIIavlulSa3^adYDa5_FeJv!aExDb%G1h^JKFMMC!7AEBcj_GBN=M!&#`E{ zjyeCbr6sGiA$WMKJ-0M^Am)zWCXuU&=>AXZKRw!Acc;2M{@gwjer$~%U1P{U6Vq`*{^9$YvGAkv$;G1SsOuW6%k~qVmCqt#jY~M|sW=cVxP)#H} zVU7~g6O2?9Ba09kdJ+N$vm3viQD(yp2n{!^;@%;KzR+BQIyzXWwyyBqIljK5R~$r| znU`xvOWc$@XlHI|d_;)r4U;qJSS3fr+kU=XFP#I}GeZMVQM@KxtA>6$lR_3KrojO{wYJBs-%r_ZQs583ntcWG$uuE(?PweI;LY#!g9 z-FNuW4V9IysdZ{km1NCdVk8B+-;Ecv8>sg%*ypeR`A}Yu9CzoOudd3aM}-zzHsXC> zUVa(ag1yA=TK`?a(=sB3!QBXg;E%mBPMUK#xe3eGFNNu8jsma;4@hk=g9|oUF z9@+bJ16kIJzFuB2W$(t~R%0!H{<^}H#kY4aj&BBMZ-+<^Gg=ev$n>bDuK(@(gKUkd zD-TNEyk(TrGs2ygk>VWH=~3;+KV9Dvx9wi_3bCVIF&kYsJ7n;Cd>KC0&F`^mxMAze zwe10P&$+z!7U$%x;*4YV<_{rq$aiYjtV)*KP&~0_=(UG4&OFyy^2Cjf+oujIuRKsK zt+*#6Q`O6h?NanOJ(Hc}+CVkJkXrSCfOP_g?1hup(?7 zIeLJ}SiSS@j2j*g{mF4aM zj)NSd>6}BO;)q|FkIvlQ+CE8_^n)(!RABPB#t4eo@^hL!&e<@v;pcA0Rnf(QlK~|c z3VvdzKAH^UEN>a zm^72*>TPGAD!0!4issQNEib~aZ0>!-DQijxT4f$Qkq-^n;xfasa%ax_w%Yhhl_NgJB4hD7EqLCt!hL?sn?%sE@=tKV9`_5xJEa%S+*;cN+%pav*tr+q6 zxkbUSolorZhrExT+a4QiHAr^wSkb+X2v(wP>sq+Y6TIS%zwAwp9qEoEajr|{oQg>u zv~XVbtw!!+gXVOC_W0HtmCTG4Hev6I6P`+1+&*Jq-_!2j#m3d_CT@FU20tpE|6Q)U z%_{lX-4iGWeo{*+pW!*(bL?Yu{8Xd#`nc?n7xK1H*tH>>29~ zqtxStyWf+w@Ro_Ckw%(Pdl0!vhBnHClZxR(vQ1yGYG3!Qc-;FT(fIIF9&TSY)u5cB z3bQ7KqkEb+@D%X3B7UtOWelmjU!gR9d>m8%BnWwAYtmWkis>p1u5Xsv&(t?_?yzwQ z9BVopA}Mo0uJZd=UDcF3!!mC47gAp{ntn{3;EDC{(#zewRhfI_v%jj^;RiQPrdbD@ z1_`H~s(U`|_iCTDO92bQ$aaRuSFU3G(^O*~iW8-CPrleFZfYdzxXM}8|crAydfXYE|g z*~l5Nw_xAT>E%!4ve7pT?(hfM?H?_w`5gY9JK`ywByW*_xAo5}tJQpN@$KCuE**DH zfWe=$Rpxl)=R`8I$u_KYxk71$ibR}X^3kcyBxUn6)%!-ineTXY55fC#7rv&)`*fWt zVcg|Jp$p5Q9dGZ|Mz4QZ^Y-oKs|Swx;8KURKhss3CerU(7vp#PhgD6>qlfa3^Sfok ziyrTc;Eb4{`x5#39T#WZ+r3YJWGxT%8FR0fuq55$&#^q;zl?!NExfga?rGSe9|7a5 zCQb}BlsRNtrGK{bdd`ZMpLE;+K3~3im_A1xv+po_ZRfG)pPyMRKm4Ev#|n>+ z*tVhEJn~!oD~G#95~H;rGqR0FFZ1~Mt7IduR>H-p#HsJK2FmaK^o(Qnb~rPQUH+7Q zhwY_9npsBcnuvD@%#AJlE5f;tFu6CjAqoyTR}#i6Cf7}sGheSVbJ+8`(92HGEGYmz zk#YS{qW7n$wqpiUQA3Z`70}ImS$k!x%LPwMMhT;P!8>{dY=;L{;$vS#v@jI$cyCp8 zF>gQ~f8)HKd%WfDvXH*JB9g58?svIx>>ZuzH)LPa6M#htXz*XaPiSJ97-SHbY--=6zMr@b6B{ZaMGt5v`6r<%kOk)*N>t`a^bMy8_flY5@k@JktgV(u#1 zjdqnjjZFA)u`;23N4j^R!TQ?cXH+}+nA_7|>g3BaS4*J!Hc2UIakT__30x{ae~!J# zdE$s|%4OLLM-Jjcc+46c(oZ^DlC6{BF z-`*xiEPqK1w7%W^tMvo!1ou?sgUO7<$9~DSij`9J`FSGCR2kIOzi57Gd*grc-N&`& z4+}0zv$nTLGOj=A%-bi`x`rVTlekKK^*(5HTS-Dl>9> z&C_i@YCWRFFXHa+#x7mH9Um1OA^%o?vdf&V>D>`*n)W!(>TdpYb(P2oXP!VrkjP-I zA}@U>+lS<1=QX0^Gd%Ng1K+X}Lzbz~?LUV%ED}NKZ7C5+N*rxNf8@JTETAf#&M-3a zIk1|8I3jELc86N0Yag><#=B{aU4l|brk4teTgD;|GrT#}ruHr6)1HpKCnetZOTRZp zS(VNF5_*=h(U;YWSuKxU>E(euPKL`>qblPpu^oF%FyE5Zo9@UA=5(=?zF@>MuQZit zUs+p~WnUY1*jgZwUwcAqxj_q6Tyj0^mtK(A4Gj@zEBmG|0q=Z9UnLE!?LSs9h>%g!8H zov*S!=XtCMi&;j(2Mu{k)Pqa(6R)O<`vz;?9#B6>;^2-&eg6EUH+no#FGyR%e*3DY zPu?B8*+L%d44!D%xjvP%RZc!we_!k_o_bvWgzzDK3wPh6hpi>^P14TqSW=s#jBs{qXJ!T8c&J##uWX8*6*id+kj(k5_lLwxK@C)W_kbW*2A)uiw8Dd+TQ0kMfG?hb@YPxB{zKIBi{ z9g<_+w>*$1+?Cw?%2r%dH9wqEAYa?R89nr|Wy7bs)EkAL5AF=U5wZVu7E-~D6{p=( z`>iy;@qmi{@ky~Y{HjNjcl&KOwOM;$K=H!r$IPcT2sbQe*T46yKg~MnHOYT3C+%}MluhSOQ3MP^*T%x#+Rcy!`tpgt{QbxKXdIjxgTe4Y$80%t2Gv1>@5w;&;gGWj zH4POH76KOf!3#VJ#fQhwpCS1OXfz*zKwRLA!{PZzSZL&+lm)5{Xh40a9J+$)A}KW> z%BAgrK7e06Ao5`WH5QNI!y*9{=of}a;)BZP`v{#QDYc+8h#$loP_aNYX6r*V&sHRkyIav;X>EOQQFbXX5m`S#?q4PN_I3S1K5!82p110cd|X%(wzl` z#v|Nq>@CPFC@d0TX~O~m%)!Rd!_9cHS&D?_T3x`nk^%+eS~d=3x7`{}4yKN@_(nk! zKnrga>VJf8NPbx4A})yFdLD_;J&ODxT;s76q(j#f!~GUm&Ln__ZRyI-KCT-;XhCDyZ3p@CHE+!SnS>WouxIQ z^ZDz417Zr7zbFA{n;PVhF8u}M(CvR2Pf>$>NkH|xNNR~vE#O&pX(aWhr2=Z!!NFGw zsQ=|cVbNeiVt}kAbU>we0*=bu17`q)G+%$#&dmZ~_Wzuvg&+X}B|r}>Eag}dC_&e= zVL4PA3N+?JAt;QS3#ll}2gsa5wJGh*g;z*mX(87D{XqfD>=~%Bq+d$|BglQt_ZK>c z4(LAgz9isTaAK6@1K>MPH{U<#9XdcbL{Tj0KV`Ik1nt7?{ISMt-~XmIVE(CL54p9! zz#h8&FJZp~=zm^0pqDhXfOkzF2Qw#o+TeviwGe{VR(}}*bo<|qfIvc6xspxY!P3aZ z!_=My4OH38)zq9!_Fl63L4)98p{<2M9D+q^GEVjuzi~yFS^EQ5Tfp;w;Ed*$GNAYK z$ez~<2$8co2t^xEJ?M&3pK7tcNH>Q;zzZ_;(5NW?7lX4o&86rjq>Dfgp>yb%*OmDo zjuLv!-JDzh&#N#+ts#{I2WSE?g^oEDn(H#?)SMDSN>5R|Ipv2Mf*OX(=Y}_T2Cb|p zCISb-Gf+mU0m>k1sOH=~N_Q!P23(+b3|PWK1BKqf-yc<-sWR zpw%^mVQ?SP3h1D8fBpix0d)fMJPVxx9e~c~p$owpVlof!`SN)h=pJ+qDIs(Y?o$#D z3p7AADEwycE%ku2Ji&q*4g59+yhHW=tQZvTfXlyA3^3746$3+Yt$$RE+1vk8F{r~j z5*A@@<7)2VU};bG{^R2Ruevmw>|NR`>TED20ZhsN{xy9p13qYLxEqB>^X*0xKq3_+ zT?iPAF+#!K)XI$y%Yu-0GbcN`Lxn5|SySizWGG)TdkLkUp?eS|3t~3ZlyH!#mJhUd+eLF%K;e&8Qm?QKMDhL^b6T$)^i*QDe z5o!oaggQbV;fk`mRQ7gLxB zCr2{E-OCB#Yzi`*P*QXDjFP57n7Z$v%&UTpJsDCNia}jW3{kB5KM~0vvz@cz0Cr$E z_!KlB2_$9+Xu@x#fdkcLqBKy%KS={a`VZ2Orjo}|ibV7gs&i5?0CJH-xGa&) zA%wzjvk*B_?AjAWZ=b=gr1a5K;s1H?W(lJS)FBJF|ecIiUUC%D}MnUm)jCaQOpDsKEin zVc^s23lD-Iu>2Ej{5DrM=R$x7K@p)~8G1;u01A*$nDZc@a49G#mkXc(lz#vP2|V4A z_MCGbARhw^n5p-yE1A7o>Rc!#3(jR8EwheAb-}UBx)nG+79ESy5_hs_p#Ff2e}aKO zIGs5Q1H%I3fM!j`5_2&pZE7h}GOmkKq~vt|i4^~wA(|5 zXaGoMiGpLm<$^2$X700 zu42{~(TEU&1LaxhLLfmYnKcn`(@rt+v$ss$|6s?V3b zVm|OVgMh~UM#^X)t|d~2E*GVY|C7d|u>Vxbvr!*B%J@%)98%Q9*bi>V=i`Y#s4EBv z{~9^`UyFWG;D0dUP%ya!1OMD^Q!6_>)Lil?V<8;`31@aM$YS*Wr{(o525=NjhvI&) zti&OIg8@poz8LpImx~wxkKz7by7K>=pf&I^0uf#hjUj?u3spVn0tKswL}D=DVJ=lY zG>EK;AY%!=7TP6YP|yyDrDb3oD3F$-DnpY9Xb_-Nm4OTf4K134qwF|Z$`6bU>_(%e zg~m(MKako652vZxfX0D_(ISz+uYhC?RU6=Ul1MaVV6z8&ycjGR2Wtb3#)9Vr)cl|} z2rzkoX~ELY3my%U8`OQlU@<5dEocJ`*56e1Abub@0xQE|Y32p+gU<`#hlL_D=ru1( zAPwk2KCFyH069OZGLYlJLVMt#*E}uYhr_|<3W*{Sa3F?XS`P_igrmVY76;{0m(~OP z2uN5NL<^rQBuMaq$8yxP7%UD15Y%O8ED`LOpeloC;W9^JfQ(@Ez4M;@``bUDk zxeI#D&jCbBBXiIf5^Nk0Kd`%liWZH=p`d+|)cml}UJh6p0sR|(V7*IS5AcIhpKw|X z4L`7R3_hoze*{{*0Bpd<0n8=|YyzQf0}J{LYZve%(&7c=Okwkk1hg0!Hjr2%3d&zW zulacf{Ak(*<0ZiBL9}3p3>7UBhXTq^T?X-k_XY4H;^6WCv@{sP;R(=oM(Y0IkhFNg zkw~z4LE`X48Xd$Vi6HAq!;cm(coY^^4+&^N{)37Zi3fTFn**@%7DbB}V29xH0JJnR z2VI8iImC|^FL*56ZXf|Il$%^SSCE;cwXrxfw4PX64~@p-;Bx@cqG|X6RfWk7^bZZ! zRltt`$0?G42V$pg7YRHl*y~8$7Yq(qKv)?XPlR@9E$uTz3-`ZB0B5+(0sX^}VB#as&KGG%`nnSQLf>6pDa@+g%hIiHF+=U|eY8T`*oew2ySf( zzoUig0&t)N0uBD~KqS=d0)A-t8Umt);{XIXSa>`R#`_!lOai6UZ9uee9YkU9z+h3= z1N=bL1uFv!3%Ct~XrVpER5HhcsF0Q)Wt-E|dSJYGI1a#GXqwmz1tMj*+(7?m*8yO0 z1&`YyTDY!4)|3dtDd2~rnFBNl3>ZE(5|U;Pz>Z-WUjg{R^&AZrYb02^C_oEef1q$c zmM~0${?W$I7$jJM!1{;7V`%gj#5CaZFH|yu_|eAv!2H4W1JJ^CAB6|bkyd{RSQsrB zFK`yr?LxFPIs>`__W_`P1X>>t)D4D76nNMG#|DakgtiL8$NQU@5J{xLE}(_Sguo<% zke7xZi6;KT0P(_nC`3zRp9v%oNzn3x>p2<&IScA~z#33K`mt#{u|(pn@q!?hNNa}(7+O67vkIFlKud!68A`&@`UL__J_0;2M$)Vo04trGlzW#-( z(aaSV2U0(!hMgEiE1g~Nh`7;PEcucGmwfAD&s3?7?-B`laN7(Y-3_xor94hzpM zL1pmx1%&808vO-j@O3Q+a)5%s+66lUY36{0A<~Qkz#eX6L1+dR5paHZfFhbQ4BY>M zyfRot!0UmO%o196S5vSt$`yQ^lnBI-LmQRBP aJh*mqH+6NV56p`I literal 572128 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