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 | 150 +- 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, 53820 insertions(+), 30782 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 f6ce0b924..3268ef268 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 f6ce0b924..000000000 --- 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 000000000..d2d81b302 --- /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 000000000..87b78d7cc --- /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 000000000..998fd72b6 --- /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 121135fe5..b5b377d63 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 7b0a5d7ba..bfc83c380 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 141a689ba..703bc0bd3 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 f2d7826a0..9f0cac676 100644 --- a/autom4te.cache/requests +++ b/autom4te.cache/requests @@ -15,96 +15,96 @@ 'configure.in' ], { - 'AC_HEADER_DIRENT' => 1, - 'AC_PROG_CC' => 1, + 'AC_STRUCT_TM' => 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_CANONICAL_SYSTEM' => 1, + 'm4_pattern_forbid' => 1, + 'AC_FUNC_OBSTACK' => 1, + 'AC_PROG_LEX' => 1, 'AC_FUNC_GETMNTENT' => 1, - 'AC_PROG_CPP' => 1, + 'AC_FUNC_REALLOC' => 1, + 'AC_FUNC_MEMCMP' => 1, + 'AC_FUNC_GETPGRP' => 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, - 'm4_pattern_allow' => 1, - 'AC_PROG_YACC' => 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_CHECK_TYPES' => 1, - 'AC_PROG_CXX' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AC_TYPE_UID_T' => 1, + 'AC_FUNC_MALLOC' => 1, 'AC_HEADER_MAJOR' => 1, - 'AC_CHECK_FUNCS' => 1, + 'AC_FUNC_MBRTOWC' => 1, + 'AC_PROG_CPP' => 1, + 'AC_FUNC_UTIME_NULL' => 1, + 'AC_DECL_SYS_SIGLIST' => 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, + '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_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_PROG_YACC' => 1, 'AC_FUNC_STRNLEN' => 1, - 'm4_include' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - 'AC_FUNC_STRERROR_R' => 1, - 'AC_CANONICAL_SYSTEM' => 1, - 'AC_CHECK_LIB' => 1, - 'AC_STRUCT_ST_BLOCKS' => 1, - 'AC_PATH_X' => 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_FUNC_MEMCMP' => 1, + 'AC_PROG_CC' => 1, 'include' => 1, - 'AC_C_VOLATILE' => 1, + 'AC_CHECK_MEMBERS' => 1, + 'AC_PROG_INSTALL' => 1, + 'AC_FUNC_ERROR_AT_LINE' => 1, 'AM_GNU_GETTEXT' => 1, - 'AC_DECL_SYS_SIGLIST' => 1, + 'AC_FUNC_STRTOD' => 1, + 'AC_HEADER_STDC' => 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_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_GETPGRP' => 1, - 'AC_TYPE_OFF_T' => 1, - 'AC_FUNC_UTIME_NULL' => 1, - 'AC_TYPE_SIZE_T' => 1, + 'AC_CHECK_LIB' => 1, + 'AC_FUNC_WAIT3' => 1, + 'AC_PROG_MAKE_SET' => 1, 'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AC_FUNC_FORK' => 1, - 'AC_TYPE_UID_T' => 1, - 'AC_HEADER_SYS_WAIT' => 1, - 'AC_HEADER_STDC' => 1, - 'AC_C_CONST' => 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 64b184d2e..542a0a617 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 6a4963ad4..6e8c81410 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 c17e547be..c87991a76 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 0f293d397..50a942f87 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 000000000..f0f3d1b6b --- /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 000000000..1cff3c8ef --- /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 000000000..1cff3c8ef --- /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 000000000..828ec966b --- /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 2cfb65473..c19bc7be9 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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 z
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�v-ay+4qy_zL=Kmg?4j| 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%0AS!wM9d;+r+4YR{nOC6&FJ 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℘M~H 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%0AwOi1R?SBkMTF67~U`k@aU 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 doHU}MG|nzYPAd3 literal 572128 zc-oBHQ{{~=Wn z5u;_KV}>FfyN)Y_Vk2N6us5=T;^Co}F|{*yu^?do$3}@>%+kii)QNyz%*N2gRK(QS z-o%uT56aoa$<)vm$|HM5OWS#C6xDC7Zar)|IX4~q`f!(TqV=-Ag>=kl(~L$Q93&0J z2qE9G;hN_e{W$J9@VDXY8g?HkF-69F^I90cg@@KA=v3AVns;Neg%DT2kP-m48lp*zLVQjKTm8F54L+G%s`Ptkhl8FDyQIBexh*lB6yo8 z+7c@U#NW~J=lkYx#>vsuv#%vLM~fOjJ!`zs@>*K_kC*0&&5-Y9h?tdoRx((DAM4!J z4qmW+%Afw<+eRzd$?DD54Yl~fOOYmfkZ)MG2`-}K%V;qfdw_*;m2>}8dgaL^7TK|Z z^tT*~nNwOzkyf&-(p^dAHe8gH+OR<^>h+r_+WLX8xn)%>` ze&115&5hN3H9hvP&IyIuUev5!66^$5U*KQ1#0z4dq&EUA`I_0l&riiAeq!Ix8 z2*;D_(+KMq&wWo8DKSM}!>@QI+>mJjf?#SewH7q%#T66M{t8cB+e2OKqa z=8luS6Es9n_jBA#c+nP8`mD~qAf#ORkA_RKGUM1Nu#-9yHvPRY5j@xq9uLI?n;yDi zr~F9Q%1Jo6<%+N6mp=R;#`mNCo#RHZWVOnMiYcX11sF;z9EY$|_R77T z$Ve321V-W{SlmI}4gMAJMq;vwGkg}3k6vKOEB?+-2e1;;;~C-GQcD5fIUuXGfaKUJ zVJz5n9N=wfdwEarMxt<8t*j(5OK{LVk)lV&a(FdsLa^LJx0QfWjd+^EPNK4WuS6aK zW`QC~qyi+&Xkm1$6{6a`z=imX})?nE<;1TFSnnpy6zk$I6r@GDjS;af2VP%_14B`b;%0Tx51sR*D&| zw5=&XG|}6>JCiW8QjKB7JBAT9c}A?(T+w@7g2wc-SlHoQrgw6bXg!{>6{+Tuqc)Bo>^(tgnak~7wO)YvFoBFS{dD3d z=~=TTtw>Nl2_We;cVv^@_$3NYiv!#%zq(>}Jc*sH2fC1!kK!}B8W~=DEf6B$m zufY@I1o0PuE3Y;KZT%UpgLep*WtMw;+Vy&MdGz(V15(cqSE$3P0KrfCR+<47Ea_pu zmRgreL32+Yz^@|G(wla8=f~M($f{wcv5@jBSq+#0bnr6oV2#*~!fNtC>~ymY!?@6C zozTlDBu&f-!GlPEe#o5HFy6Uf4<8&he1F!v3~1% z^Yd6YLfS|yLajJ@tXIOnS32P<`BUJ&nf{gwNQ|bdR_Y7gFF9cfG|M7^ROsA84$s$k zAFGr%@Jaej`#N%m1`DDxQ$EZzP(Ws5Y$QUDjfCFcWeGj5b#lFO#9t?j@eW=0FCgSd z5Ti�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
|ZB`LEu5{{|X{Uy9UubCk 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 PP8oXl-Q!*uKlJ|rRX3XX diff --git a/doc/bash.ps b/doc/bash.ps index 2c086e6ed..f26862203 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 zc-mc*d2mfv9LMuL=id8X?z_uNl!!(|twAE2m!gOzQU-|;Y8gvLLPCm;SZf_irZg&^ z$qluS3Ze~O;@8^7SZkYFMlDHEl2NHD#i+eEuH{bef9Lc0o_o&uou#m}(buJomNwMl zBV*#*MYWBNS?uTM2XE(s#`*nr@W7EvybdI&kxSO+EyKL8ZuOj$JNvWAx6AOftc3Bg>iRoE6S>wlfVGal@V#2U4dG@=j*C8Z1>$Lsbbh-q4J%_WqjlNZr>n=>>3pB^BkD2 z;;3)O=@}}fS}3Eu$e&$#mkB zM1v|&;X;@NzxV?g{_NHZx^y2-4QuK5R|r?JnOrI>)N#%l^=b$cbd05&Em=n=w${KP zV`et{h=#dg{#^d(^^OVe@kwIS2=cOin#PhrtIR@&kna~W6k zQ}&|7MH%;7veq=)%a+LSx5E3%%y7~gR;AzqMHI6sGTZvl`njnRRD4b^53>6zj@a_y zXIY{PMB^*iUJ!3a z71Xww-Oc%O89gXDmWv#9EE6@KhteVsFLoh>JYDz@g>`;mQ$P3N5lD~9d8UTFHnXgnKb6sh@*eSU8L96~2vxu0hh@y75?L6bVY1D1 z4Hj}WT%?oD1ebzk?@f^$C-`FxxjG0*s&$~=bXnL_XrZGX?HDA;x^>-xj57;_V7ikj zz>RrycdBqgF#WXtkd`L>D_@#vNHnYF6xWS2JN{bM;xzOBZy0sMpT;_Qm&`q2z zqrS~3$zp|q)pUD^xLd~dcP7L*P%4U4F-nwWj4iq~K~(X>|83YT@r;5Jy1z(_4aATC z*F#r}!&Ka%y<5dI{+Rb(lc{g|Bb7Gp7b^vfwMx3~kO&x&&76877CX?_m*l<=AKP=|xs zjF$H6Y}9kZ1pVmKDN?B$d+9~4G{%j?7Ti-P-O$k5SW{&7%rFkP9G_69&C&r4Cw7t4 zFc8NqHte{R;WnSV!VsO9z8qexR-!~bjRuJ5f2}E5}Z}RtkVms cKiIjs7b@xKCTCi-8Ek&ZSq&+OT{FM`0NqO1a{vGU delta 1965 zc-l>rdr(wW9LN2hbMM{V`&>{{6iK8~5Oi^IK{O>z9Zf@1%U3ER_-IHoHGGXlgE><^ z&`mE|K1(pMG#B<)nwkT?CM(eiE$~^CQe&7}YNg#}4e$PUKA-RX-QW4`xo25fTv1tE zVXVv7rCX2mWREx1zk751su7>^W^F6|4rD|my*fF$%Ze?_S0jJgnZa{sE`o?sQ(~qm6)_~`fPvy?CEo+&z#}+cJU;>CuHX4X3d`CpZiMT(DT_@b8@o% z|3AQZ0!v!x@51{Cp<;oT`8<&^9{9!Ckc10a8cqeaeZ5FSK`7SB%m|`= zU`$Pki`5{&>TYScWD{L)tWt0$aOmFODmFLqIQmP$6byUY zkr|14n_AN!ZUgC5JQ9OcEU}q{EDY1|EiIgZA2f`$nZiZz80b!i-T~KbEj$)nk2V@U zq_!o{4BTxLWQiJs1)bFH2+CFb^Ds{OY4mns4-KtFt%5|G$+?0Y7rWx36W8I?QTkAo zyV*4rWprO+By}@1Os_=rZem9L@;dJOIZiXOkwj?+@j+dtW3pro1vjB!@!Gl zdpyfBaK>i*xy-Ae2OZ60$p(tUd$G*pD$bJ6&%Tn;vMC-*=^NS4DlSoMDa(^tX)~KT zRn8vOjQPtq{n4!1^5v@{BL<#JNik>DG7otwSU^LSEgW6N1}LbY$+c{(ioQ1U=M}a> z#s*q)gFPi9+h*?n%PM3PQ-zc7QnA%$N?Y=^lK!0i)!ogANU=K=MDyzkVr|(^I`Ma9 zjG}&CE^>4TZ+McAA6L+c68iFSp?0v5wKgsIDD8ii2VIy#b4K%-21bMnHJUclc%^P_ z;lgV?NyC9A6GMFq_)Jy*&EAeL)Q-n=6Bp@bAs2M4dNAru{8`x=^~8^Ou7=(Z8r{U( z1&NQ=P)cJed7X;1hk|BT@wqZ$=xPn0rsJ5+yj9Qd%1EaCTRdLIq$U$h=kN1MS%2H! zQfgyMbWs-Kbi8THrbY=%b^J&NI|_=5jSo%9J+I)x4!Yk<7^wY!CL14FFjz=1@C0oe zBgn>s&zp`;6WX|qmG*b0dBO*x{d{4WibLTFRxXOpEfHpDSVlwq!blOF$ujd=;0)& z`lypbtdUVgLZsMF!jECNxV4xsqGK>dTqxl}nC*E?-0H+Q8kHpORFD#eX+6XU#X9Z}q z>fRQ;k*EyA;TyyW8gA3>9pXtBR+0rDvHm$KIw1ZeATKwDO|p)2)#mxh9f~ZQ!Z z)$vkS)tX!*O!rCE3hF4Lue47_LkN0#1vNfx}~Mj@@gD@8?MemK;iIBF#L%@dK1 zZ0pNOZtmza1a5QIL~A+Bw3ab+bE0EXjJ4HKi!GKydlx%W24Nlje$>&Bfp6%d(>W*= l2Pq-LSr^4JTof_ZxqS#4Xm7DIE7=N0pLNzliene7-+yaI!&LwP diff --git a/doc/bashref.html b/doc/bashref.html index e71130a38..0189bd46e 100644 --- a/doc/bashref.html +++ b/doc/bashref.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. @@ -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 264ebdfb8..4f7b4ae7b 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 d3718386f..a6b031acf 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(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 636 y Fd(rl_deprep_t)o(er)o(m_f)o(un)o(cti)o(on)7 +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 b54c096cb..b5c2d1cb0 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 8b1658294..30f7d9064 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 f4ec8c77b..380e3345b 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 114fdd074..15ab423d8 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 b1dfd4869..b8e0863ed 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 08f7ef0ed..4fa21f57e 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 9d08ef50d..0dc63018c 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 zc-k$IZ%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~Mc8Q3pV34J|;~~^rVFE3z1UpR74)JsuvB;i(s6Hc^ delta 553 zc-lL2mbK*!>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 e073421a6..14643e561 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 95140153f..0ead58789 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 1aa77787a..6055fbe79 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 50c6b1745..80958ec65 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 01f9a4dc1..a5870c905 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 eb65adcfe..dd3249da6 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 91f6d9611..000000000 --- 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 000000000..8b1638454 --- /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 b52aa0033..000000000 --- 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 000000000..b4d3ee74b --- /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 c93b52887..000000000 --- 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 000000000..c6164b792 --- /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 154f7f810..000000000 --- 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 000000000..439ceedeb --- /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 f8182c999..000000000 --- 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 000000000..6fea2aeaa --- /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 479d9c3e2..4ccbf669a 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 27817afa8..000000000 --- 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 000000000..023388d96 --- /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 000000000..011930b36 --- /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 857f13ad1..000000000 --- a/tests/? +++ /dev/null @@ -1 +0,0 @@ -$ diff --git a/tests/cprint.right.save1 b/tests/cprint.right.save1 new file mode 100644 index 000000000..6b711b8c5 --- /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 000000000..4a218c301 --- /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 000000000..c1f1e1991 --- /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 000000000..4b3bf2b82 --- /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 000000000..16b325fae --- /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 -- 2.47.3