From 8d4634252f0a1c2f1fd8cb64da2bff49c42d83fb Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Mon, 12 Dec 2011 22:36:21 -0500 Subject: [PATCH] bash-4.2 stray file cleanup --- CHANGES-4.0-beta2 | 32 - CHANGES-4.1 | 283 - COPYING.v2 | 347 - NEWS-3.0 | 196 - NEWS-4.0 | 138 - NEWS-4.1 | 105 - ddd1 | 135 - doc/b.html | 15448 ------------------------------- fdprintf.c | 66 - lib/readline/copyright-comment | 12 - lib/readline/copyright-history | 12 - parse.y.yacc | 5726 ------------ tests/run-histexpand.debug | 4 - 13 files changed, 22504 deletions(-) delete mode 100644 CHANGES-4.0-beta2 delete mode 100644 CHANGES-4.1 delete mode 100644 COPYING.v2 delete mode 100644 NEWS-3.0 delete mode 100644 NEWS-4.0 delete mode 100644 NEWS-4.1 delete mode 100644 ddd1 delete mode 100644 doc/b.html delete mode 100644 fdprintf.c delete mode 100644 lib/readline/copyright-comment delete mode 100644 lib/readline/copyright-history delete mode 100644 parse.y.yacc delete mode 100644 tests/run-histexpand.debug diff --git a/CHANGES-4.0-beta2 b/CHANGES-4.0-beta2 deleted file mode 100644 index d5dfa7300..000000000 --- a/CHANGES-4.0-beta2 +++ /dev/null @@ -1,32 +0,0 @@ -This document details the changes between this version, bash-4.0-beta2, -and the previous version, bash-4.0-alpha. - -1. Changes to Bash - -a. Fixed a bug that caused failed word expansions to set $? but not - PIPESTATUS. - -b. Changed filename completion to quote the tilde in a filename with a - leading tilde that exists in the current directory. - -c. Fixed a bug that caused a file descriptor leak when performing - redirections attached to a compound command. - -d. Fixed a bug that caused expansions of $@ and $* to not exit the shell if - the -u option was enabled and there were no posititional parameters. - -e. Fixed a bug that resulted in bash not terminating immediately if a - terminating signal was received while performing output. - -f. Fixed a bug that caused the shell to crash after creating 256 process - substitutions during word completion. - -2. Changes to Readline - -a. Fixed a bug that caused redisplay errors when using prompts with invisible - characters and numeric arguments to a command in a multibyte locale. - -b. Fixed a bug that caused redisplay errors when using prompts with invisible - characters spanning more than two physical screen lines. - ------------------------------------------------------------------------------- diff --git a/CHANGES-4.1 b/CHANGES-4.1 deleted file mode 100644 index 1df77582c..000000000 --- a/CHANGES-4.1 +++ /dev/null @@ -1,283 +0,0 @@ -This document details the changes between this version, bash-4.1-alpha, -and the previous version, bash-4.0-release. - -1. Changes to Bash - -a. Fixed bugs in the parser involving new parsing of the commands contained - in command substitution when the substitution is read. - -b. Fixed a bug that caused the shell to dump core when performing programmable - completion using a shell function. - -c. Fixed a bug in `mapfile' that caused it to invoke callbacks at the wrong - time. - -d. Fixed a bug that caused the shell to dump core when listing jobs in the - `exit' builtin. - -e. Fixed several bugs encountered when reading subscripts in associative - array assignments and expansions. - -f. Fixed a bug that under some circumstances caused an associative array to - be converted to an indexed array. - -g. Fixed a bug that caused syntax errors and SIGINT interrupts to not set - $? to a value > 128. - -h. Fixed a bug that caused the shell to remove FIFOs associated with process - substitution inside shell functions. - -i. Fixed a bug that caused terminal attributes to not be reset when the - `read' builtin timed out. - -j. Fixed a bug in brace expansion that caused unwanted zero padding of the - expanded terms. - -k. Fixed a bug that prevented the |& construct from working as intended when - used with a simple command with additional redirections. - -l. Fixed a bug with the case statment ;& terminator that caused the shell to - dereference a NULL pointer. - -m. Fixed a bug that caused assignment statements or redirections preceding - a simple command name to inhibit alias expansion. - -n. Fixed the behavior of `set -u' to conform to the latest Posix interpretation: - every expansion of an unset variable except $@ and $* will cause the - shell to exit. - -o. Fixed a bug that caused double-quoted expansions of $* inside word - expansions like ${x#$*} to not expand properly when $IFS is empty. - -p. Fixed a bug that caused traps to set $LINENO to the wrong value when they - execute. - -q. Fixed a bug that caused off-by-one errors when computing history lines in - the `fc' builtin. - -r. Fixed a bug that caused some terminating signals to not exit the shell - quickly enough, forcing the kernel to send the signal (e.g., SIGSEGV) - multiple times. - -s. Fixed a bug that caused the shell to attempt to add empty lines to the - history list when reading here documents. - -t. Made some internal changes that dramatically speeds up sequential indexed - array access. - -u. Fixed a bug that caused the shell to write past the end of a string when - completing a double-quoted string ending in a backslash. - -v. Fixed a bug that caused the shell to replace too many characters when a - pattern match was null in a ${foo//bar} expansion. - -w. Fixed bugs in the expansion of ** that caused duplicate directory names - and the contents of the current directory to be omitted. - -x. Fixed a bug that caused $? to not be set correctly when referencing an - unset variable with set -u and set -e enabled. - -y. Fixed a bug caused by executing an external program from the DEBUG trap - while a pipeline was running. The effect was to disturb the pipeline - state, occasionally causing it to hang. - -z. Fixed a bug that caused the ** glob expansion to dump core if it - encountered an unsearchable directory. - -aa. Fixed a bug that caused `command -v' and `command -V' to not honor the - path set by the -p option. - -bb. Fixed a bug that caused brace expansion to take place too soon in some - compound array assignments. - -cc. Fixed a bug that caused programmable completion functions' changes to - READLINE_POINT to not be reflected back to readline. - -dd. Fixed a bug that caused the shell to dump core if a trap was executed - during a shell assignment statement. - -ee. Fixed an off-by-one error when computing the number of positional - parameters for the ${@:0:n} expansion. - -ff. Fixed a problem with setting COMP_CWORD for programmable completion - functions that could leave it set to -1. - -gg. Fixed a bug that caused the ERR trap to be triggered in some cases where - `set -e' would not have caused the shell to exit. - -hh. Fixed a bug that caused changes made by `compopt' to not persist past the - completion function in which compopt was executed. - -ii. Fixed a bug that caused the list of hostname completions to not be cleared - when HOSTNAME was unset. - -jj. Fixed a bug that caused variable expansion in here documents to look in - any temporary environment. - -kk. Bash and readline can now convert file names between precomposed and - decomposed Unicode on Mac OS X ("keyboard" and file system forms, - respectively). This affects filename completion (using new - rl_filename_rewrite_hook), globbing, and readline redisplay. - -ll. The ERR and EXIT traps now see a non-zero value for $? when a parser - error after set -e has been enabled causes the shell to exit. - -mm. Fixed a bug that in brace expansion that caused zero-prefixed terms to - not contain the correct number of digits. - -nn. Fixed a bug that caused the shell to free non-allocated memory when - unsetting an associative array which had had a value implicitly assigned - to index "0". - -oo. Fixed a memory leak in the ${!prefix@} expansion. - -pp. Fixed a bug that caused printf to not correctly report all write errors. - -qq. Fixed a bug that caused single and double quotes to act as delimiters - when splitting a command line into words for programmable completion. - -rr. Fixed a bug that caused ** globbing that caused **/path/* to match every - directory, not just those matching `path'. - -ss. Fixed a bug that caused the shell to dump core when running `help' without - arguments if the terminal width was fewer than 7 characters. - -2. Changes to Readline - -a. The SIGWINCH signal handler now avoids calling the redisplay code if - one arrives while in the middle of redisplay. - -b. Changes to the timeout code to make sure that timeout values greater - than one second are handled better. - -c. Fixed a bug in the redisplay code that was triggered by a prompt - containing invisible characters exactly the width of the screen. - -d. Fixed a bug in the redisplay code encountered when running in horizontal - scroll mode. - -e. Fixed a bug that prevented menu completion from properly completing - filenames. - -f. Fixed a redisplay bug caused by a multibyte character causing a line to - wrap. - -g. Fixed a bug that caused key sequences of two characters to not be - recognized when a longer sequence identical in the first two characters - was bound. - -h. Fixed a bug that caused history expansion to be attempted on $'...' - single-quoted strings. - -i. Fixed a bug that caused incorrect redisplay when the prompt contained - multibyte characters in an `invisible' sequence bracketed by \[ and - \]. - -j. Fixed a bug that caused history expansion to short-circuit after - encountering a multibyte character. - -3. New Features in Bash - -a. Here-documents within $(...) command substitutions may once more be - delimited by the closing right paren, instead of requiring a newline. - -b. Bash's file status checks (executable, readable, etc.) now take file - system ACLs into account on file systems that support them. - -c. Bash now passes environment variables with names that are not valid - shell variable names through into the environment passed to child - processes. - -d. The `execute-unix-command' readline function now attempts to clear and - reuse the current line rather than move to a new one after the command - executes. - -e. `printf -v' can now assign values to array indices. - -f. New `complete -E' and `compopt -E' options that work on the "empty" - completion: completion attempted on an empty command line. - -g. New complete/compgen/compopt -D option to define a `default' completion: - a completion to be invoked on command for which no completion has been - defined. If this function returns 124, programmable completion is - attempted again, allowing a user to dynamically build a set of completions - as completion is attempted by having the default completion function - install individual completion functions each time it is invoked. - -h. When displaying associative arrays, subscripts are now quoted. - -i. Changes to dabbrev-expand to make it more `emacs-like': no space appended - after matches, completions are not sorted, and most recent history entries - are presented first. - -j. The [[ and (( commands are now subject to the setting of `set -e' and the - ERR trap. - -k. The source/. builtin now removes NUL bytes from the file before attempting - to parse commands. - -l. There is a new configuration option (in config-top.h) that forces bash to - forward all history entries to syslog. - -m. A new variable $BASHOPTS to export shell options settable using `shopt' to - child processes. - -n. There is a new confgure option that forces the extglob option to be - enabled by default. - -o. New variable $BASH_XTRACEFD; when set to an integer bash will write xtrace - output to that file descriptor. - -p. If the optional left-hand-side of a redirection is of the form {var}, the - shell assigns the file descriptor used to $var or uses $var as the file - descriptor to move or close, depending on the redirection operator. - -q. The < and > operators to the [[ conditional command now do string - comparison according to the current locale. - -r. Programmable completion now uses the completion for `b' instead of `a' - when completion is attempted on a line like: a $(b c. - -s. Force extglob on temporarily when parsing the pattern argument to - the == and != operators to the [[ command, for compatibility. - -t. Changed the behavior of interrupting the wait builtin when a SIGCHLD is - received and a trap on SIGCHLD is set to be Posix-mode only. - -u. The read builtin has a new `-N nchars' option, which reads exactly NCHARS - characters, ignoring delimiters like newline. - -4. New Features in Readline - -a. New bindable function: menu-complete-backward. - -b. In the vi insertion keymap, C-n is now bound to menu-complete by default, - and C-p to menu-complete-backward. - -c. When in vi command mode, repeatedly hitting ESC now does nothing, even - when ESC introduces a bound key sequence. This is closer to how - historical vi behaves. - -d. New bindable function: skip-csi-sequence. Can be used as a default to - consume key sequences generated by keys like Home and End without having - to bind all keys. - -e. New application-settable function: rl_filename_rewrite_hook. Can be used - to rewite or modify filenames read from the file system before they are - compared to the word to be completed. - -f. New bindable variable: skip-completed-text, active when completing in the - middle of a word. If enabled, it means that characters in the completion - that match characters in the remainder of the word are "skipped" rather - than inserted into the line. - -g. The pre-readline-6.0 version of menu completion is available as - "old-menu-complete" for users who do not like the readline-6.0 version. - -h. New bindable variable: echo-control-characters. If enabled, and the - tty ECHOCTL bit is set, controls the echoing of characters corresponding - to keyboard-generated signals. - -i. New bindable variable: enable-meta-key. Controls whether or not readline - sends the smm/rmm sequences if the terminal indicates it has a meta key - that enables eight-bit characters. diff --git a/COPYING.v2 b/COPYING.v2 deleted file mode 100644 index 2b940a412..000000000 --- a/COPYING.v2 +++ /dev/null @@ -1,347 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -The Free Software Foundation has exempted Bash from the requirement of -Paragraph 2c of the General Public License. This is to say, there is -no requirement for Bash to print a notice when it is started -interactively in the usual way. We made this exception because users -and standards expect shells not to print such messages. This -exception applies to any program that serves as a shell and that is -based primarily on Bash as opposed to other GNU software. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/NEWS-3.0 b/NEWS-3.0 deleted file mode 100644 index 46a5073a1..000000000 --- a/NEWS-3.0 +++ /dev/null @@ -1,196 +0,0 @@ -This is a terse description of the new features added to bash-3.0 since -the release of bash-2.05b. As always, the manual page (doc/bash.1) is -the place to look for complete descriptions. - -1. New Features in Bash - -a. ANSI string expansion now implements the \x{hexdigits} escape. - -b. There is a new loadable `strftime' builtin. - -c. New variable, COMP_WORDBREAKS, which controls the readline completer's - idea of word break characters. - -d. The `type' builtin no longer reports on aliases unless alias expansion - will actually be performed. - -e. HISTCONTROL is now a colon-separated list of values, which permits - more extensibility and backwards compatibility. - -f. HISTCONTROL may now include the `erasedups' option, which causes all lines - matching a line being added to be removed from the history list. - -g. `configure' has a new `--enable-multibyte' argument that permits multibyte - character support to be disabled even on systems that support it. - -h. New variables to support the bash debugger: BASH_ARGC, BASH_ARGV, - BASH_SOURCE, BASH_LINENO, BASH_SUBSHELL, BASH_EXECUTION_STRING, - BASH_COMMAND - -i. FUNCNAME has been changed to support the debugger: it's now an array - variable. - -j. for, case, select, arithmetic commands now keep line number information - for the debugger. - -k. There is a new `RETURN' trap executed when a function or sourced script - returns (not inherited child processes; inherited by command substitution - if function tracing is enabled and the debugger is active). - -l. New invocation option: --debugger. Enables debugging and turns on new - `extdebug' shell option. - -m. New `functrace' and `errtrace' options to `set -o' cause DEBUG and ERR - traps, respectively, to be inherited by shell functions. Equivalent to - `set -T' and `set -E' respectively. The `functrace' option also controls - whether or not the DEBUG trap is inherited by sourced scripts. - -n. The DEBUG trap is run before binding the variable and running the action - list in a `for' command, binding the selection variable and running the - query in a `select' command, and before attempting a match in a `case' - command. - -o. New `--enable-debugger' option to `configure' to compile in the debugger - support code. - -p. `declare -F' now prints out extra line number and source file information - if the `extdebug' option is set. - -q. If `extdebug' is enabled, a non-zero return value from a DEBUG trap causes - the next command to be skipped, and a return value of 2 while in a - function or sourced script forces a `return'. - -r. New `caller' builtin to provide a call stack for the bash debugger. - -s. The DEBUG trap is run just before the first command in a function body is - executed, for the debugger. - -t. `for', `select', and `case' command heads are printed when `set -x' is - enabled. - -u. There is a new {x..y} brace expansion, which is shorthand for {x.x+1, - x+2,...,y}. x and y can be integers or single characters; the sequence - may ascend or descend; the increment is always 1. - -v. New ksh93-like ${!array[@]} expansion, expands to all the keys (indices) - of array. - -w. New `force_fignore' shopt option; if enabled, suffixes specified by - FIGNORE cause words to be ignored when performing word completion even - if they're the only possibilities. - -x. New `gnu_errfmt' shopt option; if enabled, error messages follow the `gnu - style' (filename:lineno:message) format. - -y. New `-o bashdefault' option to complete and compgen; if set, causes the - whole set of bash completions to be performed if the compspec doesn't - result in a match. - -z. New `-o plusdirs' option to complete and compgen; if set, causes directory - name completion to be performed and the results added to the rest of the - possible completions. - -aa. `kill' is available as a builtin even when the shell is built without - job control. - -bb. New HISTTIMEFORMAT variable; value is a format string to pass to - strftime(3). If set and not null, the `history' builtin prints out - timestamp information according to the specified format when displaying - history entries. If set, bash tells the history library to write out - timestamp information when the history file is written. - -cc. The [[ ... ]] command has a new binary `=~' operator that performs - extended regular expression (egrep-like) matching. - -dd. `configure' has a new `--enable-cond-regexp' option (enabled by default) - to enable the =~ operator and regexp matching in [[ ... ]]. - -ee. Subexpressions matched by the =~ operator are placed in the new - BASH_REMATCH array variable. - -ff. New `failglob' option that causes an expansion error when pathname - expansion fails to produce a match. - -gg. New `set -o pipefail' option that causes a pipeline to return a failure - status if any of the processes in the pipeline fail, not just the last - one. - -hh. printf builtin understands two new escape sequences: \" and \?. - -ii. `echo -e' understands two new escape sequences: \" and \?. - -jj. The GNU `gettext' package and libintl have been integrated; the shell's - messages can be translated into different languages. - -kk. The `\W' prompt expansion now abbreviates $HOME as `~', like `\w'. - -ll. The error message printed when bash cannot open a shell script supplied - as argument 1 now includes the name of the shell, to better identify - the error as coming from bash. - -mm. A bug that caused here documents to not work if the directory the shell - used for the temporary files was not writable has been fixed. - -nn. The parameter pattern removal and substitution expansions are now much - faster and more efficient when using multibyte characters. - -oo. Fixed a bug in the `shift' builtin that could cause core dumps when - reporting an out-of-range argument. - -pp. The `jobs', `kill', and `wait' builtins now accept job control notation - even if job control is not enabled. - -qq. The historical behavior of `trap' that allows a missing `action' argument - to cause each specified signal's handling to be reset to its default is - now only supported when `trap' is given a single non-option argument. - -2. New Features in Readline - -a. History expansion has a new `a' modifier equivalent to the `g' modifier - for compatibility with the BSD csh. - -b. History expansion has a new `G' modifier equivalent to the BSD csh `g' - modifier, which performs a substitution once per word. - -c. All non-incremental search operations may now undo the operation of - replacing the current line with the history line. - -d. The text inserted by an `a' command in vi mode can be reinserted with - `.'. - -e. New bindable variable, `show-all-if-unmodified'. If set, the readline - completer will list possible completions immediately if there is more - than one completion and partial completion cannot be performed. - -f. There is a new application-callable `free_history_entry()' function. - -g. History list entries now contain timestamp information; the history file - functions know how to read and write timestamp information associated - with each entry. - -h. Four new key binding functions have been added: - - rl_bind_key_if_unbound() - rl_bind_key_if_unbound_in_map() - rl_bind_keyseq_if_unbound() - rl_bind_keyseq_if_unbound_in_map() - -i. New application variable, rl_completion_quote_character, set to any - quote character readline finds before it calls the application completion - function. - -j. New application variable, rl_completion_suppress_quote, settable by an - application completion function. If set to non-zero, readline does not - attempt to append a closing quote to a completed word. - -k. New application variable, rl_completion_found_quote, set to a non-zero - value if readline determines that the word to be completed is quoted. - Set before readline calls any application completion function. - -l. New function hook, rl_completion_word_break_hook, called when readline - needs to break a line into words when completion is attempted. Allows - the word break characters to vary based on position in the line. - -m. New bindable command: unix-filename-rubout. Does the same thing as - unix-word-rubout, but adds `/' to the set of word delimiters. - diff --git a/NEWS-4.0 b/NEWS-4.0 deleted file mode 100644 index bbde634ab..000000000 --- a/NEWS-4.0 +++ /dev/null @@ -1,138 +0,0 @@ -o When using substring expansion on the positional parameters, a starting - index of 0 now causes $0 to be prefixed to the list. - -o There is a new variable, $BASHPID, which always returns the process id of - the current shell. - -o There is a new `autocd' option that, when enabled, causes bash to attempt - to `cd' to a directory name that is supplied as the first word of a - simple command. - -o There is a new `checkjobs' option that causes the shell to check for and - report any running or stopped jobs at exit. - -o The programmable completion code exports a new COMP_TYPE variable, set to - a character describing the type of completion being attempted. - -o The programmable completion code exports a new COMP_KEY variable, set to - the character that caused the completion to be invoked (e.g., TAB). - -o The programmable completion code now uses the same set of characters as - readline when breaking the command line into a list of words. - -o The block multiplier for the ulimit -c and -f options is now 512 when in - Posix mode, as Posix specifies. - -o Changed the behavior of the read builtin to save any partial input received - in the specified variable when the read builtin times out. This also - results in variables specified as arguments to read to be set to the empty - string when there is no input available. When the read builtin times out, - it returns an exit status greater than 128. - -o The shell now has the notion of a `compatibility level', controlled by - new variables settable by `shopt'. Setting this variable currently - restores the bash-3.1 behavior when processing quoted strings on the rhs - of the `=~' operator to the `[[' command. - -o The `ulimit' builtin now has new -b (socket buffer size) and -T (number - of threads) options. - -o There is a new `compopt' builtin that allows completion functions to modify - completion options for existing completions or the completion currently - being executed. - -o The `read' builtin has a new -i option which inserts text into the reply - buffer when using readline. - -o A new `-E' option to the complete builtin allows control of the default - behavior for completion on an empty line. - -o There is now limited support for completing command name words containing - globbing characters. - -o The `help' builtin now has a new -d option, to display a short description, - and a -m option, to print help information in a man page-like format. - -o There is a new `mapfile' builtin to populate an array with lines from a - given file. - -o If a command is not found, the shell attempts to execute a shell function - named `command_not_found_handle', supplying the command words as the - function arguments. - -o There is a new shell option: `globstar'. When enabled, the globbing code - treats `**' specially -- it matches all directories (and files within - them, when appropriate) recursively. - -o There is a new shell option: `dirspell'. When enabled, the filename - completion code performs spelling correction on directory names during - completion. - -o The `-t' option to the `read' builtin now supports fractional timeout - values. - -o Brace expansion now allows zero-padding of expanded numeric values and - will add the proper number of zeroes to make sure all values contain the - same number of digits. - -o There is a new bash-specific bindable readline function: `dabbrev-expand'. - It uses menu completion on a set of words taken from the history list. - -o The command assigned to a key sequence with `bind -x' now sets two new - variables in the environment of the executed command: READLINE_LINE_BUFFER - and READLINE_POINT. The command can change the current readline line - and cursor position by modifying READLINE_LINE_BUFFER and READLINE_POINT, - respectively. - -o There is a new >>& redirection operator, which appends the standard output - and standard error to the named file. - -o The parser now understands `|&' as a synonym for `2>&1 |', which redirects - the standard error for a command through a pipe. - -o The new `;&' case statement action list terminator causes execution to - continue with the action associated with the next pattern in the - statement rather than terminating the command. - -o The new `;;&' case statement action list terminator causes the shell to - test the next set of patterns after completing execution of the current - action, rather than terminating the command. - -o The shell understands a new variable: PROMPT_DIRTRIM. When set to an - integer value greater than zero, prompt expansion of \w and \W will - retain only that number of trailing pathname components and replace - the intervening characters with `...'. - -o There are new case-modifying word expansions: uppercase (^[^]) and - lowercase (,[,]). They can work on either the first character or - array element, or globally. They accept an optional shell pattern - that determines which characters to modify. There is an optionally- - configured feature to include capitalization operators. - -o The shell provides associative array variables, with the appropriate - support to create, delete, assign values to, and expand them. - -o The `declare' builtin now has new -l (convert value to lowercase upon - assignment) and -u (convert value to uppercase upon assignment) options. - There is an optionally-configurable -c option to capitalize a value at - assignment. - -o There is a new `coproc' reserved word that specifies a coprocess: an - asynchronous command run with two pipes connected to the creating shell. - Coprocs can be named. The input and output file descriptors and the - PID of the coprocess are available to the calling shell in variables - with coproc-specific names. - -o A value of 0 for the -t option to `read' now returns success if there is - input available to be read from the specified file descriptor. - -o CDPATH and GLOBIGNORE are ignored when the shell is running in privileged - mode. - -o New bindable readline functions shell-forward-word and shell-backward-word, - which move forward and backward words delimited by shell metacharacters - and honor shell quoting. - -o New bindable readline functions shell-backward-kill-word and shell-kill-word - which kill words backward and forward, but use the same word boundaries - as shell-forward-word and shell-backward-word. diff --git a/NEWS-4.1 b/NEWS-4.1 deleted file mode 100644 index bb155bf79..000000000 --- a/NEWS-4.1 +++ /dev/null @@ -1,105 +0,0 @@ -o Here-documents within $(...) command substitutions may once more be - delimited by the closing right paren, instead of requiring a newline. - -o Bash's file status checks (executable, readable, etc.) now take file - system ACLs into account on file systems that support them. - -o Bash now passes environment variables with names that are not valid - shell variable names through into the environment passed to child - processes. - -o The `execute-unix-command' readline function now attempts to clear and - reuse the current line rather than move to a new one after the command - executes. - -o `printf -v' can now assign values to array indices. - -o New `complete -E' and `compopt -E' options that work on the "empty" - completion: completion attempted on an empty command line. - -o New complete/compgen/compopt -D option to define a `default' completion: - a completion to be invoked on command for which no completion has been - defined. If this function returns 124, programmable completion is - attempted again, allowing a user to dynamically build a set of completions - as completion is attempted by having the default completion function - install individual completion functions each time it is invoked. - -o When displaying associative arrays, subscripts are now quoted. - -o Changes to dabbrev-expand to make it more `emacs-like': no space appended - after matches, completions are not sorted, and most recent history entries - are presented first. - -o The [[ and (( commands are now subject to the setting of `set -e' and the - ERR trap. - -o The source/. builtin now removes NUL bytes from the file before attempting - to parse commands. - -o There is a new configuration option (in config-top.h) that forces bash to - forward all history entries to syslog. - -o A new variable $BASHOPTS to export shell options settable using `shopt' to - child processes. - -o There is a new confgure option that forces the extglob option to be - enabled by default. - -o New variable $BASH_XTRACEFD; when set to an integer bash will write xtrace - output to that file descriptor. - -o If the optional left-hand-side of a redirection is of the form {var}, the - shell assigns the file descriptor used to $var or uses $var as the file - descriptor to move or close, depending on the redirection operator. - -o The < and > operators to the [[ conditional command now do string - comparison according to the current locale. - -o Programmable completion now uses the completion for `b' instead of `a' - when completion is attempted on a line like: a $(b c. - -o Force extglob on temporarily when parsing the pattern argument to - the == and != operators to the [[ command, for compatibility. - -o Changed the behavior of interrupting the wait builtin when a SIGCHLD is - received and a trap on SIGCHLD is set to be Posix-mode only. - -o The read builtin has a new `-N nchars' option, which reads exactly NCHARS - characters, ignoring delimiters like newline. - -o The mapfile/readarray builtin no longer stores the commands it invokes via - callbacks in the history list. - -o There is a new `compat40' shopt option. - -o The < and > operators to [[ do string comparisons using the current locale - only if the compatibility level is greater than 40 (set to 41 by default). - -o New bindable readline function: menu-complete-backward. - -o In the readline vi-mode insertion keymap, C-n is now bound to menu-complete - by default, and C-p to menu-complete-backward. - -o When in readline vi command mode, repeatedly hitting ESC now does nothing, - even when ESC introduces a bound key sequence. This is closer to how - historical vi behaves. - -o New bindable readline function: skip-csi-sequence. Can be used as a - default to consume key sequences generated by keys like Home and End - without having to bind all keys. - -o New bindable readline variable: skip-completed-text, active when - completing in the middle of a word. If enabled, it means that characters - in the completion that match characters in the remainder of the word are - "skipped" rather than inserted into the line. - -o The pre-readline-6.0 version of menu completion is available as - "old-menu-complete" for users who do not like the readline-6.0 version. - -o New bindable readline variable: echo-control-characters. If enabled, and - the tty ECHOCTL bit is set, controls the echoing of characters - corresponding to keyboard-generated signals. - -o New bindable readline variable: enable-meta-key. Controls whether or not - readline sends the smm/rmm sequences if the terminal indicates it has a - meta key that enables eight-bit characters. diff --git a/ddd1 b/ddd1 deleted file mode 100644 index 44bf7be81..000000000 --- a/ddd1 +++ /dev/null @@ -1,135 +0,0 @@ -*** ../bash-20101015/redir.c 2009-09-17 10:04:18.000000000 -0400 ---- redir.c 2010-11-06 13:38:22.000000000 -0400 -*************** -*** 63,73 **** - - extern int posixly_correct; - extern REDIRECT *redirection_undo_list; - extern REDIRECT *exec_redirection_undo_list; - - /* Static functions defined and used in this file. */ -- static void add_undo_close_redirect __P((int)); - static void add_exec_redirect __P((REDIRECT *)); - static int add_undo_redirect __P((int, enum r_instruction, int)); - static int expandable_redirection_filename __P((REDIRECT *)); - static int stdin_redirection __P((enum r_instruction, int)); ---- 63,74 ---- - - extern int posixly_correct; -+ extern int last_command_exit_value; - extern REDIRECT *redirection_undo_list; - extern REDIRECT *exec_redirection_undo_list; - - /* Static functions defined and used in this file. */ - static void add_exec_redirect __P((REDIRECT *)); - static int add_undo_redirect __P((int, enum r_instruction, int)); -+ static int add_undo_close_redirect __P((int)); - static int expandable_redirection_filename __P((REDIRECT *)); - static int stdin_redirection __P((enum r_instruction, int)); -*************** -*** 94,97 **** ---- 95,105 ---- - static int heredoc_errno; - -+ #define REDIRECTION_ERROR(r, e) \ -+ if ((r) != 0) \ -+ { \ -+ last_command_exit_value = EXECUTION_FAILURE;\ -+ return ((e) == 0 ? EINVAL : (e));\ -+ } -+ - void - redirection_error (temp, error) -*************** -*** 814,820 **** - /* Only setup to undo it if the thing to undo is active. */ - if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1)) -! add_undo_redirect (redirector, ri, -1); - else -! add_undo_close_redirect (redirector); - } - ---- 822,829 ---- - /* Only setup to undo it if the thing to undo is active. */ - if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1)) -! r = add_undo_redirect (redirector, ri, -1); - else -! r = add_undo_close_redirect (redirector); -! REDIRECTION_ERROR (r, errno); - } - -*************** -*** 919,925 **** - /* Only setup to undo it if the thing to undo is active. */ - if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1)) -! add_undo_redirect (redirector, ri, -1); - else -! add_undo_close_redirect (redirector); - } - ---- 928,935 ---- - /* Only setup to undo it if the thing to undo is active. */ - if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1)) -! r = add_undo_redirect (redirector, ri, -1); - else -! r = add_undo_close_redirect (redirector); -! REDIRECTION_ERROR(r, errno); - } - -*************** -*** 973,979 **** - /* Only setup to undo it if the thing to undo is active. */ - if (fcntl (redirector, F_GETFD, 0) != -1) -! add_undo_redirect (redirector, ri, redir_fd); - else -! add_undo_close_redirect (redirector); - } - #if defined (BUFFERED_INPUT) ---- 983,990 ---- - /* Only setup to undo it if the thing to undo is active. */ - if (fcntl (redirector, F_GETFD, 0) != -1) -! r = add_undo_redirect (redirector, ri, redir_fd); - else -! r = add_undo_close_redirect (redirector); -! REDIRECTION_ERROR(r, errno); - } - #if defined (BUFFERED_INPUT) -*************** -*** 1047,1052 **** - } - - if ((flags & RX_UNDOABLE) && (fcntl (redirector, F_GETFD, 0) != -1)) -! add_undo_redirect (redirector, ri, -1); - - #if defined (COPROCESS_SUPPORT) ---- 1058,1065 ---- - } - -+ r = 0; - if ((flags & RX_UNDOABLE) && (fcntl (redirector, F_GETFD, 0) != -1)) -! r = add_undo_redirect (redirector, ri, -1); -! REDIRECTION_ERROR (r, errno); - - #if defined (COPROCESS_SUPPORT) -*************** -*** 1165,1169 **** - /* Set up to close FD when we are finished with the current command - and its redirections. */ -! static void - add_undo_close_redirect (fd) - int fd; ---- 1178,1182 ---- - /* Set up to close FD when we are finished with the current command - and its redirections. */ -! static int - add_undo_close_redirect (fd) - int fd; -*************** -*** 1178,1181 **** ---- 1191,1196 ---- - closer->next = redirection_undo_list; - redirection_undo_list = closer; -+ -+ return 0; - } - diff --git a/doc/b.html b/doc/b.html deleted file mode 100644 index 29b0da6b9..000000000 --- a/doc/b.html +++ /dev/null @@ -1,15448 +0,0 @@ - - - - - -Bash Reference Manual: - - - - - - - - - - - - - - - - - -
[Top][Contents][Index][ ? ]
-

Bash Reference Manual

- -This text is a brief description of the features that are present in -the Bash shell (version 3.2, 30 December 2006). -

- -This is Edition 3.2, last updated 30 December 2006, -of The GNU Bash Reference Manual, -for Bash, Version 3.2. -

- -Bash contains features that appear in other popular shells, and some -features that only appear in Bash. Some of the shells that Bash has -borrowed concepts from are the Bourne Shell (`sh'), the Korn Shell -(`ksh'), and the C-shell (`csh' and its successor, -`tcsh'). The following menu breaks the features up into -categories based upon which one of these other shells inspired the -feature. -

- -This manual is meant as a brief introduction to features found in -Bash. The Bash manual page should be used as the definitive -reference on shell behavior. -

- -

- - - - - - - - - - - - - - -
1. Introduction  An introduction to the shell.
2. Definitions  Some definitions used in the rest of this - manual.
3. Basic Shell Features  The shell "building blocks".
4. Shell Builtin Commands  Commands that are a part of the shell.
5. Shell Variables  Variables used or set by Bash.
6. Bash Features  Features found only in Bash.
7. Job Control  What job control is and how Bash allows you - to use it.
9. Using History Interactively  Command History Expansion
8. Command Line Editing  Chapter describing the command line - editing features.
10. Installing Bash  How to build and install Bash on your system.
A. Reporting Bugs  How to report bugs in Bash.
B. Major Differences From The Bourne Shell  A terse list of the differences - between Bash and historical - versions of /bin/sh.
C. Copying This Manual  Copying this manual.
D. Indexes  Various indexes for this manual.
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
- -

1. Introduction

- -
- - -
1.1 What is Bash?  A short description of Bash.
1.2 What is a shell?  A brief introduction to shells.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.1 What is Bash?

- -

- -Bash is the shell, or command language interpreter, -for the GNU operating system. -The name is an acronym for the `Bourne-Again SHell', -a pun on Stephen Bourne, the author of the direct ancestor of -the current Unix shell sh, -which appeared in the Seventh Edition Bell Labs Research version -of Unix. -

- -Bash is largely compatible with sh and incorporates useful -features from the Korn shell ksh and the C shell csh. -It is intended to be a conformant implementation of the IEEE -POSIX Shell and Tools portion of the IEEE POSIX -specification (IEEE Standard 1003.1). -It offers functional improvements over sh for both interactive and -programming use. -

- -While the GNU operating system provides other shells, including -a version of csh, Bash is the default shell. -Like other GNU software, Bash is quite portable. It currently runs -on nearly every version of Unix and a few other operating systems - -independently-supported ports exist for MS-DOS, OS/2, -and Windows platforms. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

1.2 What is a shell?

- -

- -At its base, a shell is simply a macro processor that executes -commands. The term macro processor means functionality where text -and symbols are expanded to create larger expressions. -

- -A Unix shell is both a command interpreter and a programming -language. As a command interpreter, the shell provides the user -interface to the rich set of GNU utilities. The programming -language features allow these utilities to be combined. -Files containing commands can be created, and become -commands themselves. These new commands have the same status as -system commands in directories such as `/bin', allowing users -or groups to establish custom environments to automate their common -tasks. -

- -Shells may be used interactively or non-interactively. In -interactive mode, they accept input typed from the keyboard. -When executing non-interactively, shells execute commands read -from a file. -

- -A shell allows execution of GNU commands, both synchronously and -asynchronously. -The shell waits for synchronous commands to complete before accepting -more input; asynchronous commands continue to execute in parallel -with the shell while it reads and executes additional commands. -The redirection constructs permit -fine-grained control of the input and output of those commands. -Moreover, the shell allows control over the contents of commands' -environments. -

- -Shells also provide a small set of built-in -commands (builtins) implementing functionality impossible -or inconvenient to obtain via separate utilities. -For example, cd, break, continue, and -exec) cannot be implemented outside of the shell because -they directly manipulate the shell itself. -The history, getopts, kill, or pwd -builtins, among others, could be implemented in separate utilities, -but they are more convenient to use as builtin commands. -All of the shell builtins are described in -subsequent sections. -

- -While executing commands is essential, most of the power (and -complexity) of shells is due to their embedded programming -languages. Like any high-level language, the shell provides -variables, flow control constructs, quoting, and functions. -

- -Shells offer features geared specifically for -interactive use rather than to augment the programming language. -These interactive features include job control, command line -editing, command history and aliases. Each of these features is -described in this manual. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

2. Definitions

- -These definitions are used throughout the remainder of this manual. -

- -

- -
POSIX -
-A family of open system standards based on Unix. Bash -is primarily concerned with the Shell and Utilities portion of the -POSIX 1003.1 standard. -

- -

blank -
A space or tab character. -

- -

builtin -
-A command that is implemented internally by the shell itself, rather -than by an executable program somewhere in the file system. -

- -

control operator -
-A word that performs a control function. It is a newline -or one of the following: -`||', `&&', `&', `;', `;;', -`|', `(', or `)'. -

- -

exit status -
-The value returned by a command to its caller. The value is restricted -to eight bits, so the maximum value is 255. -

- -

field -
-A unit of text that is the result of one of the shell expansions. After -expansion, when executing a command, the resulting fields are used as -the command name and arguments. -

- -

filename -
-A string of characters used to identify a file. -

- -

job -
-A set of processes comprising a pipeline, and any processes descended -from it, that are all in the same process group. -

- -

job control -
-A mechanism by which users can selectively stop (suspend) and restart -(resume) execution of processes. -

- -

metacharacter -
-A character that, when unquoted, separates words. A metacharacter is -a blank or one of the following characters: -`|', `&', `;', `(', `)', `<', or -`>'. -

- -

name -
- -A word consisting solely of letters, numbers, and underscores, -and beginning with a letter or underscore. Names are used as -shell variable and function names. -Also referred to as an identifier. -

- -

operator -
-A control operator or a redirection operator. -See section 3.6 Redirections, for a list of redirection operators. -

- -

process group -
-A collection of related processes each having the same process -group ID. -

- -

process group ID -
-A unique identifier that represents a process group -during its lifetime. -

- -

reserved word -
-A word that has a special meaning to the shell. Most reserved -words introduce shell flow control constructs, such as for and -while. -

- -

return status -
-A synonym for exit status. -

- -

signal -
-A mechanism by which a process may be notified by the kernel -of an event occurring in the system. -

- -

special builtin -
-A shell builtin command that has been classified as special by the -POSIX standard. -

- -

token -
-A sequence of characters considered a single unit by the shell. It is -either a word or an operator. -

- -

word -
-A token that is not an operator. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3. Basic Shell Features

- -

- -Bash is an acronym for `Bourne-Again SHell'. -The Bourne shell is -the traditional Unix shell originally written by Stephen Bourne. -All of the Bourne shell builtin commands are available in Bash, -The rules for evaluation and quoting are taken from the POSIX -specification for the `standard' Unix shell. -

- -This chapter briefly summarizes the shell's `building blocks': -commands, control structures, shell functions, shell parameters, -shell expansions, -redirections, which are a way to direct input and output from -and to named files, and how the shell executes commands. -

- -

- - - - - - - - -
3.1 Shell Syntax  What your input means to the shell.
3.2 Shell Commands  The types of commands you can use.
3.3 Shell Functions  Grouping commands by name.
3.4 Shell Parameters  How the shell stores values.
3.5 Shell Expansions  How Bash expands parameters and the various - expansions available.
3.6 Redirections  A way to control where input and output go.
3.7 Executing Commands  What happens when you run a command.
3.8 Shell Scripts  Executing files of shell commands.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1 Shell Syntax

- -
- - - -
3.1.1 Shell Operation  The basic operation of the shell.
3.1.2 Quoting  How to remove the special meaning from characters.
3.1.3 Comments  How to specify comments.
-

- -When the shell reads input, it proceeds through a -sequence of operations. If the input indicates the beginning of a -comment, the shell ignores the comment symbol (`#'), and the rest -of that line. - -Otherwise, roughly speaking, the shell reads its input and -divides the input into words and operators, employing the quoting rules -to select which meanings to assign various words and characters. -

- -The shell then parses these tokens into commands and other constructs, -removes the special meaning of certain words or characters, expands -others, redirects input and output as needed, executes the specified -command, waits for the command's exit status, and makes that exit status -available for further inspection or processing. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.1 Shell Operation

- -

- -The following is a brief description of the shell's operation when it -reads and executes a command. Basically, the shell does the -following: -

- -

    -
  1. -Reads its input from a file (see section 3.8 Shell Scripts), from a string -supplied as an argument to the `-c' invocation option -(see section 6.1 Invoking Bash), or from the user's terminal. -

    - -

  2. -Breaks the input into words and operators, obeying the quoting rules -described in 3.1.2 Quoting. These tokens are separated by -metacharacters. Alias expansion is performed by this step -(see section 6.6 Aliases). -

    - -

  3. -Parses the tokens into simple and compound commands -(see section 3.2 Shell Commands). -

    - -

  4. -Performs the various shell expansions (see section 3.5 Shell Expansions), breaking -the expanded tokens into lists of filenames (see section 3.5.8 Filename Expansion) -and commands and arguments. -

    - -

  5. -Performs any necessary redirections (see section 3.6 Redirections) and removes -the redirection operators and their operands from the argument list. -

    - -

  6. -Executes the command (see section 3.7 Executing Commands). -

    - -

  7. -Optionally waits for the command to complete and collects its exit -status (see section 3.7.5 Exit Status). -

    - -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2 Quoting

- -
- - - - - -
3.1.2.1 Escape Character  How to remove the special meaning from a single - character.
3.1.2.2 Single Quotes  How to inhibit all interpretation of a sequence - of characters.
3.1.2.3 Double Quotes  How to suppress most of the interpretation of a - sequence of characters.
3.1.2.4 ANSI-C Quoting  How to expand ANSI-C sequences in quoted strings.
3.1.2.5 Locale-Specific Translation  How to translate strings into different languages.
-

- -Quoting 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. -

- -Each of the shell metacharacters (see section 2. Definitions) -has special meaning to the shell and must be quoted if it is to -represent itself. -When the command history expansion facilities are being used -(see section 9.3 History Expansion), the -history expansion character, usually `!', must be quoted -to prevent history expansion. See section 9.1 Bash History Facilities, for -more details concerning history expansion. -

- -There are three quoting mechanisms: the -escape character, single quotes, and double quotes. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2.1 Escape Character

- -A non-quoted backslash `\' is the Bash escape character. -It preserves the literal value of the next character that follows, -with the exception of newline. If a \newline pair -appears, and the backslash itself is not quoted, the \newline -is treated as a line continuation (that is, it is removed from -the input stream and effectively ignored). -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2.2 Single Quotes

- -

- -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. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2.3 Double Quotes

- -

- -Enclosing characters in double quotes (`"') preserves the literal value -of all characters within the quotes, with the exception of -`$', ``', `\', -and, when history expansion is enabled, `!'. -The characters `$' and ``' -retain their special meaning within double quotes (see section 3.5 Shell Expansions). -The backslash retains its special meaning only when followed by one of -the following characters: -`$', ``', `"', `\', or newline. -Within double quotes, backslashes that are followed by one of these -characters are removed. Backslashes preceding characters without a -special meaning are left unmodified. -A double quote may be quoted within double quotes by preceding it with -a backslash. -If enabled, history expansion will be performed unless an `!' -appearing in double quotes is escaped using a backslash. -The backslash preceding the `!' is not removed. -

- -The special parameters `*' and `@' have special meaning -when in double quotes (see section 3.5.3 Shell Parameter Expansion). -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2.4 ANSI-C Quoting

- -

- -Words of the form $'string' are treated specially. The -word expands to string, with backslash-escaped characters replaced -as specified by the ANSI C standard. Backslash escape sequences, if -present, are decoded as follows: -

- -

-
\a -
alert (bell) -
\b -
backspace -
\e -
an escape character (not ANSI C) -
\f -
form feed -
\n -
newline -
\r -
carriage return -
\t -
horizontal tab -
\v -
vertical tab -
\\ -
backslash -
\' -
single quote -
\nnn -
the eight-bit character whose value is the octal value nnn -(one to three digits) -
\xHH -
the eight-bit character whose value is the hexadecimal value HH -(one or two hex digits) -
\cx -
a control-x character -
-

- -The expanded result is single-quoted, as if the dollar sign had not -been present. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.2.5 Locale-Specific Translation

- -

- -A double-quoted string preceded by a dollar sign (`$') will cause -the string to be translated according to the current locale. -If the current locale is C or POSIX, the dollar sign -is ignored. -If the string is translated and replaced, the replacement is -double-quoted. -

- - - - -Some systems use the message catalog selected by the LC_MESSAGES -shell variable. Others create the name of the message catalog from the -value of the TEXTDOMAIN shell variable, possibly adding a -suffix of `.mo'. If you use the TEXTDOMAIN variable, you -may need to set the TEXTDOMAINDIR variable to the location of -the message catalog files. Still others use both variables in this -fashion: -TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.1.3 Comments

- -

- -In a non-interactive shell, or an interactive shell in which the -interactive_comments option to the shopt -builtin is enabled (see section 4.3.2 The Shopt Builtin), -a word beginning with `#' -causes that word and all remaining characters on that line to -be ignored. An interactive shell without the interactive_comments -option enabled does not allow comments. The interactive_comments -option is on by default in interactive shells. -See section 6.3 Interactive Shells, for a description of what makes -a shell interactive. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2 Shell Commands

- -

- -A simple shell command such as echo a b c consists of the command -itself followed by arguments, separated by spaces. -

- -More complex shell commands are composed of simple commands arranged together -in a variety of ways: in a pipeline in which the output of one command -becomes the input of a second, in a loop or conditional construct, or in -some other grouping. -

- -

- - - - -
3.2.1 Simple Commands  The most common type of command.
3.2.2 Pipelines  Connecting the input and output of several - commands.
3.2.3 Lists of Commands  How to execute commands sequentially.
3.2.4 Compound Commands  Shell commands for control flow.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.1 Simple Commands

- -

- -A simple command is the kind of command encountered most often. -It's just a sequence of words separated by blanks, terminated -by one of the shell's control operators (see section 2. Definitions). The -first word generally specifies a command to be executed, with the -rest of the words being that command's arguments. -

- -The return status (see section 3.7.5 Exit Status) of a simple command is -its exit status as provided -by the POSIX 1003.1 waitpid function, or 128+n if -the command was terminated by signal n. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.2 Pipelines

- -

- -A pipeline is a sequence of simple commands separated by -`|'. -

- - - - -The format for a pipeline is -
 
[time [-p]] [!] command1 [| command2 ...]
-

- -The output of each command in the pipeline is connected via a pipe -to the input of the next command. -That is, each command reads the previous command's output. -

- -The reserved word time causes timing statistics -to be printed for the pipeline once it finishes. -The statistics currently consist of elapsed (wall-clock) time and -user and system time consumed by the command's execution. -The `-p' option changes the output format to that specified -by POSIX. -The TIMEFORMAT variable may be set to a format string that -specifies how the timing information should be displayed. -See section 5.2 Bash Variables, for a description of the available formats. -The use of time as a reserved word permits the timing of -shell builtins, shell functions, and pipelines. An external -time command cannot time these easily. -

- -If the pipeline is not executed asynchronously (see section 3.2.3 Lists of Commands), the -shell waits for all commands in the pipeline to complete. -

- -Each command in a pipeline is executed in its own subshell -(see section 3.7.3 Command Execution Environment). The exit -status of a pipeline is the exit status of the last command in the -pipeline, unless the pipefail option is enabled -(see section 4.3.1 The Set Builtin). -If pipefail is enabled, the pipeline's return status is the -value of the last (rightmost) command to exit with a non-zero status, -or zero if all commands exit successfully. -If the reserved word `!' precedes the pipeline, the -exit status is the logical negation of the exit status as described -above. -The shell waits for all commands in the pipeline to terminate before -returning a value. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.3 Lists of Commands

- -

- -A list is a sequence of one or more pipelines separated by one -of the operators `;', `&', `&&', or `||', -and optionally terminated by one of `;', `&', or a -newline. -

- -Of these list operators, `&&' and `||' -have equal precedence, followed by `;' and `&', -which have equal precedence. -

- -A sequence of one or more newlines may appear in a list -to delimit commands, equivalent to a semicolon. -

- -If a command is terminated by the control operator `&', -the shell executes the command asynchronously in a subshell. -This is known as executing the command in the background. -The shell does not wait for the command to finish, and the return -status is 0 (true). -When job control is not active (see section 7. Job Control), -the standard input for asynchronous commands, in the absence of any -explicit redirections, is redirected from /dev/null. -

- -Commands separated by a `;' 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. -

- -The control operators `&&' and `||' -denote AND lists and OR lists, respectively. -An AND list has the form -
 
command1 && command2
-

- -command2 is executed if, and only if, command1 -returns an exit status of zero. -

- -An OR list has the form -
 
command1 || command2
-

- -command2 is executed if, and only if, 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. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.4 Compound Commands

- -

- -

- - - -
3.2.4.1 Looping Constructs  Shell commands for iterative action.
3.2.4.2 Conditional Constructs  Shell commands for conditional execution.
3.2.4.3 Grouping Commands  Ways to group commands.
-

- -Compound commands are the shell programming constructs. -Each construct begins with a reserved word or control operator and is -terminated by a corresponding reserved word or operator. -Any redirections (see section 3.6 Redirections) associated with a compound command -apply to all commands within that compound command unless explicitly overridden. -

- -Bash provides looping constructs, conditional commands, and mechanisms -to group commands and execute them as a unit. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.4.1 Looping Constructs

- -

- -Bash supports the following looping constructs. -

- -Note that wherever a `;' appears in the description of a -command's syntax, it may be replaced with one or more newlines. -

- -

-
until -
- - -The syntax of the until command is: -
 
until test-commands; do consequent-commands; done
-
Execute consequent-commands as long as -test-commands has an exit status which is not zero. -The return status is the exit status of the last command executed -in consequent-commands, or zero if none was executed. -

- -

while -
-The syntax of the while command is: -
 
while test-commands; do consequent-commands; done
-

- -Execute consequent-commands as long as -test-commands has an exit status of zero. -The return status is the exit status of the last command executed -in consequent-commands, or zero if none was executed. -

- -

for -
-The syntax of the for command is: -

- -
 
for name [in words ...]; do commands; done
-
Expand words, and execute commands once for each member -in the resultant list, with name bound to the current member. -If `in words' is not present, the for command -executes the commands once for each positional parameter that is -set, as if `in "$@"' had been specified -(see section 3.4.2 Special Parameters). -The return status is the exit status of the last command that executes. -If there are no items in the expansion of words, no commands are -executed, and the return status is zero. -

- -An alternate form of the for command is also supported: -

- -
 
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
-
First, the arithmetic expression expr1 is evaluated according -to the rules described below (see section 6.5 Shell Arithmetic). -The arithmetic expression expr2 is then evaluated repeatedly -until it evaluates to zero. -Each time expr2 evaluates to a non-zero value, commands are -executed and the arithmetic expression expr3 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 list -that is executed, or false if any of the expressions is invalid. -

- -

-

- -The break and continue builtins (see section 4.1 Bourne Shell Builtins) -may be used to control loop execution. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.4.2 Conditional Constructs

- -

- -

-
if -
- - - - -The syntax of the if command is: -

- -
 
if test-commands; then
-  consequent-commands;
-[elif more-test-commands; then
-  more-consequents;]
-[else alternate-consequents;]
-fi
-

- -The test-commands list is executed, and if its return status is zero, -the consequent-commands list is executed. -If test-commands returns a non-zero status, each elif list -is executed in turn, and if its exit status is zero, -the corresponding more-consequents is executed and the -command completes. -If `else alternate-consequents' is present, and -the final command in the final if or elif clause -has a non-zero exit status, then alternate-consequents is executed. -The return status is the exit status of the last command executed, or -zero if no condition tested true. -

- -

case -
- - -The syntax of the case command is: -

- -
 
case word in [ [(] pattern [| pattern]...) command-list ;;]... esac
-

- -case will selectively execute the command-list corresponding to -the first pattern that matches word. -If the shell option nocasematch -(see the description of shopt in 4.3.2 The Shopt Builtin) -is enabled, the match is performed without regard to the case -of alphabetic characters. -The `|' is used to separate multiple patterns, and the `)' -operator terminates a pattern list. -A list of patterns and an associated command-list is known -as a clause. Each clause must be terminated with `;;'. -The word undergoes tilde expansion, parameter expansion, command -substitution, arithmetic expansion, and quote removal before matching is -attempted. Each pattern undergoes tilde expansion, parameter -expansion, command substitution, and arithmetic expansion. -

- -There may be an arbitrary number of case clauses, each terminated -by a `;;'. The first pattern that matches determines the -command-list that is executed. -

- -Here is an example using case in a script that could be used to -describe one interesting feature of an animal: -

- -
 
echo -n "Enter the name of an animal: "
-read ANIMAL
-echo -n "The $ANIMAL has "
-case $ANIMAL in
-  horse | dog | cat) echo -n "four";;
-  man | kangaroo ) echo -n "two";;
-  *) echo -n "an unknown number of";;
-esac
-echo " legs."
-

- -The return status is zero if no pattern is matched. Otherwise, the -return status is the exit status of the command-list executed. -

- -

select -
-

- -The select construct allows the easy generation of menus. -It has almost the same syntax as the for command: -

- -
 
select name [in words ...]; do commands; done
-

- -The list of words following in is expanded, generating a list -of items. The set of expanded words is printed on the standard -error output stream, each preceded by a number. If the -`in words' is omitted, the positional parameters are printed, -as if `in "$@"' had been specified. -The PS3 prompt is then displayed and a line is read from the -standard input. -If the line consists of a number corresponding to one of the displayed -words, then the value of name is set to that word. -If the line is empty, the words and prompt are displayed again. -If EOF is read, the select command completes. -Any other value read causes name to be set to null. -The line read is saved in the variable REPLY. -

- -The commands are executed after each selection until a -break command is executed, at which -point the select command completes. -

- -Here is an example that allows the user to pick a filename from the -current directory, and displays the name and index of the file -selected. -

- -
 
select fname in *;
-do
-	echo you picked $fname \($REPLY\)
-	break;
-done
-

- -

((...)) -
 
(( expression ))
-

- -The arithmetic expression is evaluated according to the rules -described below (see section 6.5 Shell Arithmetic). -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 -
 
let "expression"
-
See section 4.2 Bash Builtin Commands, for a full description of the let builtin. -

- -

[[...]] -
- -
 
[[ expression ]]
-

- -Return a status of 0 or 1 depending on the evaluation of -the conditional expression expression. -Expressions are composed of the primaries described below in -6.4 Bash Conditional Expressions. -Word splitting and filename expansion are not performed on the words -between the `[[' and `]]'; tilde expansion, parameter and -variable expansion, arithmetic expansion, command substitution, process -substitution, and quote removal are performed. -Conditional operators such as `-f' must be unquoted to be recognized -as primaries. -

- -When the `==' and `!=' operators are used, the string to the -right of the operator is considered a pattern and matched according -to the rules described below in 3.5.8.1 Pattern Matching. -If the shell option nocasematch -(see the description of shopt in 4.3.2 The Shopt Builtin) -is enabled, the match is performed without regard to the case -of alphabetic characters. -The return value is 0 if the string matches (`==') or does not -match (`!=')the pattern, and 1 otherwise. -Any part of the pattern may be quoted to force it to be matched as a -string. -

- -An additional binary operator, `=~', is available, with the same -precedence as `==' and `!='. -When it is used, the string to the right of the operator is considered -an extended regular expression and matched accordingly (as in regex3)). -The return value is 0 if the string matches -the pattern, and 1 otherwise. -If the regular expression is syntactically incorrect, the conditional -expression's return value is 2. -If the shell option nocasematch -(see the description of shopt in 4.3.2 The Shopt Builtin) -is enabled, the match is performed without regard to the case -of alphabetic characters. -Substrings matched by parenthesized subexpressions within the regular -expression are saved in the array variable BASH_REMATCH. -The element of BASH_REMATCH with index 0 is the portion of the string -matching the entire regular expression. -The element of BASH_REMATCH with index n is the portion of the -string matching the nth parenthesized subexpression. -

- -Expressions may be combined using the following operators, listed -in decreasing order of precedence: -

- -

-
( expression ) -
Returns the value of expression. -This may be used to override the normal precedence of operators. -

- -

! expression -
True if expression is false. -

- -

expression1 && expression2 -
True if both expression1 and expression2 are true. -

- -

expression1 || expression2 -
True if either expression1 or expression2 is true. -
-The && and || operators do not evaluate expression2 if the -value of expression1 is sufficient to determine the return -value of the entire conditional expression. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.2.4.3 Grouping Commands

- -

- -Bash provides two ways to group a list of commands to be executed -as a unit. When commands are grouped, redirections may be applied -to the entire command list. For example, the output of all the -commands in the list may be redirected to a single stream. -

- -

-
() -
 
( list )
-

- -Placing a list of commands between parentheses causes a subshell -environment to be created (see section 3.7.3 Command Execution Environment), and each -of the commands in list to be executed in that subshell. Since the -list is executed in a subshell, variable assignments do not remain in -effect after the subshell completes. -

- -

{} -
- -
 
{ list; }
-

- -Placing a list of commands between curly braces causes the list to -be executed in the current shell context. No subshell is created. -The semicolon (or newline) following list is required. -

-

- -In addition to the creation of a subshell, there is a subtle difference -between these two constructs due to historical reasons. The braces -are reserved words, so they must be separated from the list -by blanks. The parentheses are operators, and are -recognized as separate tokens by the shell even if they are not separated -from the list by whitespace. -

- -The exit status of both of these constructs is the exit status of -list. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.3 Shell Functions

- -

- -Shell functions are a way to group commands for later execution -using a single name for the group. They are executed just like -a "regular" command. -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. -Shell functions are executed in the current -shell context; no new process is created to interpret them. -

- -Functions are declared using this syntax: - -
 
[ function ] name () compound-command [ redirections ]
-

- -This defines a shell function named name. The reserved -word function is optional. -If the function reserved -word is supplied, the parentheses are optional. -The body of the function is the compound command -compound-command (see section 3.2.4 Compound Commands). -That command is usually a list enclosed between { and }, but -may be any compound command listed above. -compound-command is executed whenever name is specified as the -name of a command. -Any redirections (see section 3.6 Redirections) associated with the shell function -are performed when the function is executed. -

- -A function definition may be deleted using the `-f' option to the -unset builtin (see section 4.1 Bourne Shell Builtins). -

- -The exit status of a function definition is zero unless a syntax error -occurs or a readonly function with the same name already exists. -When executed, the exit status of a function is the exit status of the -last command executed in the body. -

- -Note that for historical reasons, in the most common usage the curly braces -that surround the body of the function must be separated from the body by -blanks or newlines. -This is because the braces are reserved words and are only recognized -as such when they are separated by whitespace. -Also, when using the braces, the list must be terminated by a semicolon, -a `&', or a newline. -

- -When a function is executed, the arguments to the -function become the positional parameters -during its execution (see section 3.4.1 Positional Parameters). -The special parameter `#' that expands to the number of -positional parameters is updated to reflect the change. -Special parameter 0 is unchanged. -The first element of the 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 DEBUG and RETURN traps -are not inherited unless the function has been given the -trace attribute using the declare builtin or -the -o functrace option has been enabled with -the set builtin, -(in which case all functions inherit the DEBUG and RETURN traps). -See section 4.1 Bourne Shell Builtins, for the description of the -trap builtin. -

- -If the builtin command 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 RETURN trap is executed -before execution resumes. -When a function completes, the values of the -positional parameters and the special parameter `#' -are restored to the values they had prior to the function's -execution. If a numeric argument is given to return, -that is the function's return status; otherwise the function's -return status is the exit status of the last command executed -before the return. -

- -Variables local to the function may be declared with the -local builtin. These variables are visible only to -the function and the commands it invokes. -

- -Function names and definitions may be listed with the -`-f' option to the declare or typeset -builtin commands (see section 4.2 Bash Builtin Commands). -The `-F' option to declare or typeset -will list the function names only -(and optionally the source file and line number, if the extdebug -shell option is enabled). -Functions may be exported so that subshells -automatically have them defined with the -`-f' option to the export builtin -(see section 4.1 Bourne Shell Builtins). -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. -

- -Functions may be recursive. No limit is placed on the number of -recursive calls. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4 Shell Parameters

- -

- -

- - -
3.4.1 Positional Parameters  The shell's command-line arguments.
3.4.2 Special Parameters  Parameters denoted by special characters.
-

- -A parameter is an entity that stores values. -It can be a name, a number, or one of the special characters -listed below. -A variable is a parameter denoted by a name. -A variable has a value and zero or more attributes. -Attributes are assigned using the declare builtin command -(see the description of the declare builtin in 4.2 Bash Builtin Commands). -

- -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 unset builtin command. -

- -A variable may be assigned to by a statement of the form -
 
name=[value]
-
If value -is not given, the variable is assigned the null string. All -values undergo tilde expansion, parameter and variable expansion, -command substitution, arithmetic expansion, and quote -removal (detailed below). If the variable has its integer -attribute set, then value -is evaluated as an arithmetic expression even if the $((...)) -expansion is not used (see section 3.5.5 Arithmetic Expansion). -Word splitting is not performed, with the exception -of "$@" as explained below. -Filename expansion is not performed. -Assignment statements may also appear as arguments to the -alias, -declare, typeset, export, readonly, -and local builtin commands. -

- -In the context where an assignment statement is assigning a value -to a shell variable or array index (see section 6.7 Arrays), the `+=' -operator can be used to -append to or add to the variable's previous value. -When `+=' is applied to a variable for which the integer attribute -has been set, value is evaluated as an arithmetic expression and -added to the variable's current value, which is also evaluated. -When `+=' is applied to an array variable using compound assignment -(see section 6.7 Arrays), the -variable's value is not unset (as it is when using `='), and new -values are appended to the array beginning at one greater than the array's -maximum index. -When applied to a string-valued variable, value is expanded and -appended to the variable's value. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.1 Positional Parameters

- -

- -A 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 set builtin command. -Positional parameter N may be referenced as ${N}, or -as $N when N consists of a single digit. -Positional parameters may not be assigned to with assignment statements. -The set and shift builtins are used to set and -unset them (see section 4. Shell Builtin Commands). -The positional parameters are -temporarily replaced when a shell function is executed -(see section 3.3 Shell Functions). -

- -When a positional parameter consisting of more than a single -digit is expanded, it must be enclosed in braces. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.4.2 Special Parameters

- -

- -The shell treats several parameters specially. These parameters may -only be referenced; assignment to them is not allowed. -

- -

- - -
* -
-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 IFS -special variable. That is, "$*" is equivalent -to "$1c$2c...", where c -is the first character of the value of the IFS -variable. -If IFS is unset, the parameters are separated by spaces. -If IFS is null, the parameters are joined without intervening -separators. -

- - -

@ -
-Expands to the positional parameters, starting from one. When the -expansion occurs within double quotes, each parameter expands to a -separate word. That is, "$@" is equivalent to -"$1" "$2" .... -If the double-quoted expansion occurs within a word, the expansion of -the first parameter is joined with the beginning part of the original -word, and the expansion of the last parameter is joined with the last -part of the original word. -When there are no positional parameters, "$@" and -$@ -expand to nothing (i.e., they are removed). -

- - -

# -
-Expands to the number of positional parameters in decimal. -

- - -

? -
-Expands to the exit status of the most recently executed foreground -pipeline. -

- - -

- -
-(A hyphen.) Expands to the current option flags as specified upon -invocation, by the set -builtin command, or those set by the shell itself -(such as the `-i' option). -

- - -

$ -
-Expands to the process ID of the shell. In a () subshell, it -expands to the process ID of the invoking shell, not the subshell. -

- - -

! -
-Expands to the process ID of the most recently executed background -(asynchronous) command. -

- - -

0 -
-Expands to the name of the shell or shell script. This is set at -shell initialization. If Bash is invoked with a file of commands -(see section 3.8 Shell Scripts), $0 is set to the name of that file. -If Bash is started with the `-c' option (see section 6.1 Invoking Bash), -then $0 is set to the first argument after the string to be -executed, if one is present. Otherwise, it is set -to the filename used to invoke Bash, as given by argument zero. -

- - -

_ -
-(An underscore.) -At shell startup, set to the absolute pathname used to invoke the -shell or shell script being executed as passed in the environment -or argument list. -Subsequently, expands to the last argument to the previous command, -after expansion. -Also set to the full pathname used to invoke each command executed -and placed in the environment exported to that command. -When checking mail, this parameter holds the name of the mail file. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5 Shell Expansions

- -

- -Expansion is performed on the command line after it has been split into -tokens. There are seven kinds of expansion performed: -

    -
  • brace expansion -
  • tilde expansion -
  • parameter and variable expansion -
  • command substitution -
  • arithmetic expansion -
  • word splitting -
  • filename expansion -
-

- -

- - - - - - - - - -
3.5.1 Brace Expansion  Expansion of expressions within braces.
3.5.2 Tilde Expansion  Expansion of the ~ character.
3.5.3 Shell Parameter Expansion  How Bash expands variables to their values.
3.5.4 Command Substitution  Using the output of a command as an argument.
3.5.5 Arithmetic Expansion  How to use arithmetic in shell expansions.
3.5.6 Process Substitution  A way to write and read to and from a - command.
3.5.7 Word Splitting  How the results of expansion are split into separate - arguments.
3.5.8 Filename Expansion  A shorthand for specifying filenames matching patterns.
3.5.9 Quote Removal  How and when quote characters are removed from - words.
-

- -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 filename -expansion. -

- -On systems that can support it, there is an additional expansion -available: process substitution. This is performed at the -same time as parameter, variable, and arithmetic expansion and -command substitution. -

- -Only brace expansion, word splitting, and filename 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 -"$@" (see section 3.4.2 Special Parameters) and "${name[@]}" -(see section 6.7 Arrays). -

- -After all expansions, quote removal (see section 3.5.9 Quote Removal) -is performed. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.1 Brace Expansion

- -

- -Brace expansion is a mechanism by which arbitrary strings may be generated. -This mechanism is similar to -filename expansion (see section 3.5.8 Filename Expansion), -but the file names generated need not exist. -Patterns to be brace expanded take the form of an optional preamble, -followed by either a series of comma-separated strings or a seqeunce expression -between a pair of braces, -followed by an optional 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. -

- -Brace expansions may be nested. -The results of each expanded string are not sorted; left to right order -is preserved. -For example, -
 
bash$ echo a{d,c,b}e
-ade ace abe
-

- -A sequence expression takes the form {x..y}, -where x and y are either integers or single characters. -When integers are supplied, the expression expands to each number between -x and y, inclusive. -When characters are supplied, the expression expands to each character -lexicographically between x and y, inclusive. Note that -both x and y must be of the same type. -

- -Brace expansion is performed before any other expansions, -and any characters special to other expansions are preserved -in the result. It is strictly textual. Bash -does not apply any syntactic interpretation to the context of the -expansion or the text between the braces. -To avoid conflicts with parameter expansion, the string `${' -is not considered eligible for brace expansion. -

- -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 { or `,' may be quoted with a backslash to prevent its -being considered part of a brace expression. -To avoid conflicts with parameter expansion, the string `${' -is not considered eligible for brace expansion. -

- -This construct is typically used as shorthand when the common -prefix of the strings to be generated is longer than in the -above example: -
 
mkdir /usr/local/src/bash/{old,new,dist,bugs}
-
or -
 
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.2 Tilde Expansion

- -

- -If a word begins with an unquoted tilde character (`~'), all of the -characters up to the first unquoted slash (or all characters, -if there is no unquoted slash) are considered a tilde-prefix. -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 login name. -If this login name is the null string, the tilde is replaced with the -value of the HOME shell variable. -If 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. -

- -If the tilde-prefix is `~+', the value of -the shell variable PWD replaces the tilde-prefix. -If the tilde-prefix is `~-', the value of the shell variable -OLDPWD, if it is set, is substituted. -

- -If the characters following the tilde in the tilde-prefix consist of a -number N, 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 dirs builtin invoked with the characters following tilde -in the tilde-prefix as an argument (see section 6.8 The Directory Stack). -If the tilde-prefix, sans the tilde, consists of a number without a -leading `+' or `-', `+' is assumed. -

- -If the login name is invalid, or the tilde expansion fails, the word is -left unchanged. -

- -Each variable assignment is checked for unquoted tilde-prefixes immediately -following a `:' or the first `='. -In these cases, tilde expansion is also performed. -Consequently, one may use file names with tildes in assignments to -PATH, MAILPATH, and CDPATH, -and the shell assigns the expanded value. -

- -The following table shows how Bash treats unquoted tilde-prefixes: -

- -

-
~ -
The value of $HOME -
~/foo -
`$HOME/foo' -

- -

~fred/foo -
The subdirectory foo of the home directory of the user -fred -

- -

~+/foo -
`$PWD/foo' -

- -

~-/foo -
`${OLDPWD-'~-'}/foo' -

- -

~N -
The string that would be displayed by `dirs +N' -

- -

~+N -
The string that would be displayed by `dirs +N' -

- -

~-N -
The string that would be displayed by `dirs -N' -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.3 Shell Parameter Expansion

- -

- -The `$' 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. -

- -When braces are used, the matching ending brace is the first `}' -not escaped by a backslash or within a quoted string, and not within an -embedded arithmetic expansion, command substitution, or parameter -expansion. -

- -The basic form of parameter expansion is ${parameter}. -The value of parameter is substituted. The braces are required -when parameter -is a positional parameter with more than one digit, -or when parameter -is followed by a character that is not to be -interpreted as part of its name. -

- -If the first character of parameter is an exclamation point, -a level of variable indirection is introduced. -Bash uses the value of the variable formed from the rest of -parameter 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 parameter itself. -This is known as indirect expansion. -The exceptions to this are the expansions of ${!prefix*} -and ${!name[@]} -described below. -The exclamation point must immediately follow the left brace in order to -introduce indirection. -

- -In each of the cases below, word is subject to tilde expansion, -parameter expansion, command substitution, and arithmetic expansion. -

- -When not performing substring expansion, Bash tests for a parameter -that is unset or null; omitting the colon results in a test only for a -parameter that is unset. Put another way, if the colon is included, -the operator tests for both existence and that the value is not null; -if the colon is omitted, the operator tests only for existence. -

- -

- -
${parameter:-word} -
If parameter is unset or null, the expansion of -word is substituted. Otherwise, the value of -parameter is substituted. -

- -

${parameter:=word} -
If parameter -is unset or null, the expansion of word -is assigned to parameter. -The value of parameter is then substituted. -Positional parameters and special parameters may not be assigned to -in this way. -

- -

${parameter:?word} -
If parameter -is null or unset, the expansion of word (or a message -to that effect if word -is not present) is written to the standard error and the shell, if it -is not interactive, exits. Otherwise, the value of parameter is -substituted. -

- -

${parameter:+word} -
If parameter -is null or unset, nothing is substituted, otherwise the expansion of -word is substituted. -

- -

${parameter:offset} -
${parameter:offset:length} -
Expands to up to length characters of parameter -starting at the character specified by offset. -If length is omitted, expands to the substring of -parameter starting at the character specified by offset. -length and offset are arithmetic expressions -(see section 6.5 Shell Arithmetic). -This is referred to as Substring Expansion. -

- -length must evaluate to a number greater than or equal to zero. -If offset evaluates to a number less than zero, the value -is used as an offset from the end of the value of parameter. -If parameter is `@', the result is length positional -parameters beginning at offset. -If parameter is an array name indexed by `@' or `*', -the result is the length -members of the array beginning with ${parameter[offset]}. -A negative offset is taken relative to one greater than the maximum -index of the specified array. -Note that a negative offset must be separated from the colon by at least -one space to avoid being confused with the `:-' expansion. -Substring indexing is zero-based unless the positional parameters -are used, in which case the indexing starts at 1 by default. -If offset is 0, and the positional parameters are used, $@ is -prefixed to the list. -

- -

${!prefix*} -
${!prefix@} -
Expands to the names of variables whose names begin with prefix, -separated by the first character of the IFS special variable. -When `@' is used and the expansion appears within double quotes, each -variable name expands to a separate word. -

- -

${!name[@]} -
${!name[*]} -
If name is an array variable, expands to the list of array indices -(keys) assigned in name. -If name is not an array, expands to 0 if name is set and null -otherwise. -When `@' is used and the expansion appears within double quotes, each -key expands to a separate word. -

- -

${#parameter} -
The length in characters of the expanded value of parameter is -substituted. -If parameter is `*' or `@', the value substituted -is the number of positional parameters. -If parameter is an array name subscripted by `*' or `@', -the value substituted is the number of elements in the array. -

- -

${parameter#word} -
${parameter##word} -
The word -is expanded to produce a pattern just as in filename -expansion (see section 3.5.8 Filename Expansion). If the pattern matches -the beginning of the expanded value of parameter, -then the result of the expansion is the expanded value of parameter -with the shortest matching pattern (the `#' case) or the -longest matching pattern (the `##' case) deleted. -If parameter is `@' or `*', -the pattern removal operation is applied to each positional -parameter in turn, and the expansion is the resultant list. -If parameter is an array variable subscripted with -`@' or `*', -the pattern removal operation is applied to each member of the -array in turn, and the expansion is the resultant list. -

- -

${parameter%word} -
${parameter%%word} -
The word is expanded to produce a pattern just as in -filename expansion. -If the pattern matches a trailing portion of the expanded value of -parameter, then the result of the expansion is the value of -parameter with the shortest matching pattern (the `%' case) -or the longest matching pattern (the `%%' case) deleted. -If parameter is `@' or `*', -the pattern removal operation is applied to each positional -parameter in turn, and the expansion is the resultant list. -If parameter -is an array variable subscripted with `@' or `*', -the pattern removal operation is applied to each member of the -array in turn, and the expansion is the resultant list. -

- -

${parameter/pattern/string} -

- -The pattern is expanded to produce a pattern just as in -filename expansion. -Parameter is expanded and the longest match of pattern -against its value is replaced with string. -If pattern begins with `/', all matches of pattern are -replaced with string. Normally only the first match is replaced. -If pattern begins with `#', it must match at the beginning -of the expanded value of parameter. -If pattern begins with `%', it must match at the end -of the expanded value of parameter. -If string is null, matches of pattern are deleted -and the / following pattern may be omitted. -If parameter is `@' or `*', -the substitution operation is applied to each positional -parameter in turn, and the expansion is the resultant list. -If parameter -is an array variable subscripted with `@' or `*', -the substitution operation is applied to each member of the -array in turn, and the expansion is the resultant list. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.4 Command Substitution

- -

- -Command substitution allows the output of a command to replace -the command itself. -Command substitution occurs when a command is enclosed as follows: -
 
$(command)
-
or -
 
`command`
-

- -Bash performs the expansion by executing command 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 $(cat file) can be -replaced by the equivalent but faster $(< file). -

- -When the old-style backquote form of substitution is used, -backslash retains its literal meaning except when followed by -`$', ``', or `\'. -The first backquote not preceded by a backslash terminates the -command substitution. -When using the $(command) form, all characters between -the parentheses make up the command; none are treated specially. -

- -Command substitutions may be nested. To nest when using the backquoted -form, escape the inner backquotes with backslashes. -

- -If the substitution appears within double quotes, word splitting and -filename expansion are not performed on the results. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.5 Arithmetic Expansion

- -

- -Arithmetic expansion allows the evaluation of an arithmetic expression -and the substitution of the result. The format for arithmetic expansion is: -

- -
 
$(( expression ))
-

- -The 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, command -substitution, and quote removal. -Arithmetic expansions may be nested. -

- -The evaluation is performed according to the rules listed below -(see section 6.5 Shell Arithmetic). -If the expression is invalid, Bash prints a message indicating -failure to the standard error and no substitution occurs. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.6 Process Substitution

- -

- -Process substitution is supported on systems that support named -pipes (FIFOs) or the `/dev/fd' method of naming open files. -It takes the form of -
 
<(list)
-
or -
 
>(list)
-
The process list is run with its input or output connected to a -FIFO or some file in `/dev/fd'. The name of this file is -passed as an argument to the current command as the result of the -expansion. If the >(list) form is used, writing to -the file will provide input for list. If the -<(list) form is used, the file passed as an -argument should be read to obtain the output of list. -Note that no space may appear between the < or > -and the left parenthesis, otherwise the construct would be interpreted -as a redirection. -

- -When available, process substitution is performed simultaneously with -parameter and variable expansion, command substitution, and arithmetic -expansion. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.7 Word Splitting

- -

- -The shell scans the results of parameter expansion, command substitution, -and arithmetic expansion that did not occur within double quotes for -word splitting. -

- -The shell treats each character of $IFS as a delimiter, and splits -the results of the other expansions into words on these characters. -If IFS is unset, or its value is exactly <space><tab><newline>, -the default, then sequences of - <space>, <tab>, and <newline> -at the beginning and end of the results of the previous -expansions are ignored, and any sequence of IFS -characters not at the beginning or end serves to delimit words. -If IFS has a value other than the default, then sequences of -the whitespace characters space and tab -are ignored at the beginning and end of the -word, as long as the whitespace character is in the -value of IFS (an IFS whitespace character). -Any character in IFS that is not IFS -whitespace, along with any adjacent IFS -whitespace characters, delimits a field. A sequence of IFS -whitespace characters is also treated as a delimiter. -If the value of IFS is null, no word splitting occurs. -

- -Explicit null arguments ("" or ") 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. -

- -Note that if no expansion occurs, no splitting -is performed. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.8 Filename Expansion

- -
- -
3.5.8.1 Pattern Matching  How the shell matches patterns.
- - - - -

- -After word splitting, unless the `-f' option has been set -(see section 4.3.1 The Set Builtin), Bash scans each word for the characters -`*', `?', and `['. -If one of these characters appears, then the word is -regarded as a 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 nullglob is disabled, the word is left -unchanged. -If the nullglob option is set, and no matches are found, the word -is removed. -If the failglob shell option is set, and no matches are found, -an error message is printed and the command is not executed. -If the shell option nocaseglob is enabled, the match is performed -without regard to the case of alphabetic characters. -

- -When a pattern is used for filename generation, the character `.' -at the start of a filename or immediately following a slash -must be matched explicitly, unless the shell option dotglob is set. -When matching a file name, the slash character must always be -matched explicitly. -In other cases, the `.' character is not treated specially. -

- -See the description of shopt in 4.3.2 The Shopt Builtin, -for a description of the nocaseglob, nullglob, -failglob, and dotglob options. -

- -The GLOBIGNORE -shell variable may be used to restrict the set of filenames matching a -pattern. If GLOBIGNORE -is set, each matching filename that also matches one of the patterns in -GLOBIGNORE is removed from the list of matches. The filenames -`.' and `..' -are always ignored when GLOBIGNORE -is set and not null. -However, setting GLOBIGNORE to a non-null value has the effect of -enabling the dotglob -shell option, so all other filenames beginning with a -`.' will match. -To get the old behavior of ignoring filenames beginning with a -`.', make `.*' one of the patterns in GLOBIGNORE. -The dotglob option is disabled when GLOBIGNORE -is unset. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.8.1 Pattern Matching

- -

- -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. -

- -The special pattern characters have the following meanings: -

-
* -
Matches any string, including the null string. -
? -
Matches any single character. -
[...] -
Matches any one of the enclosed characters. A pair of characters -separated by a hyphen denotes a range expression; -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 -`[' is a `!' or a `^' -then any character not enclosed is matched. A `-' -may be matched by including it as the first or last character -in the set. A `]' may be matched by including it as the first -character in the set. -The sorting order of characters in range expressions is determined by -the current locale and the value of the LC_COLLATE shell variable, -if set. -

- -For example, in the default C locale, `[a-dx-z]' is equivalent to -`[abcdxyz]'. Many locales sort characters in dictionary order, and in -these locales `[a-dx-z]' is typically not equivalent to `[abcdxyz]'; -it might be equivalent to `[aBbCcDdxXyYz]', for example. To obtain -the traditional interpretation of ranges in bracket expressions, you can -force the use of the C locale by setting the LC_COLLATE or -LC_ALL environment variable to the value `C'. -

- -Within `[' and `]', character classes can be specified -using the syntax -[:class:], where class is one of the -following classes defined in the POSIX standard: -
 
alnum   alpha   ascii   blank   cntrl   digit   graph   lower
-print   punct   space   upper   word    xdigit
-
A character class matches any character belonging to that class. -The word character class matches letters, digits, and the character -`_'. -

- -Within `[' and `]', an equivalence class can be -specified using the syntax [=c=], which -matches all characters with the same collation weight (as defined -by the current locale) as the character c. -

- -Within `[' and `]', the syntax [.symbol.] -matches the collating symbol symbol. -

-

- -If the extglob shell option is enabled using the shopt -builtin, several extended pattern matching operators are recognized. -In the following description, a pattern-list is a list of one -or more patterns separated by a `|'. -Composite patterns may be formed using one or more of the following -sub-patterns: -

- -

-
?(pattern-list) -
Matches zero or one occurrence of the given patterns. -

- -

*(pattern-list) -
Matches zero or more occurrences of the given patterns. -

- -

+(pattern-list) -
Matches one or more occurrences of the given patterns. -

- -

@(pattern-list) -
Matches one of the given patterns. -

- -

!(pattern-list) -
Matches anything except one of the given patterns. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.5.9 Quote Removal

- -

- -After the preceding expansions, all unquoted occurrences of the -characters `\', `'', and `"' that did not -result from one of the above expansions are removed. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6 Redirections

- -

- -Before a command is executed, its input and output -may be 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 -simple command or may follow a command. -Redirections are processed in the order they appear, from -left to right. -

- -In the following descriptions, if the file descriptor number is -omitted, and the first character of the redirection operator is -`<', the redirection refers to the standard input (file -descriptor 0). If the first character of the redirection operator -is `>', the redirection refers to the standard output (file -descriptor 1). -

- -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, filename expansion, and word splitting. -If it expands to more than one word, Bash reports an error. -

- -Note that the order of redirections is significant. For example, -the command -
 
ls > dirlist 2>&1
-
directs both standard output (file descriptor 1) and standard error -(file descriptor 2) to the file dirlist, while the command -
 
ls 2>&1 > dirlist
-
directs only the standard output to file dirlist, -because the standard error was duplicated as standard output -before the standard output was redirected to dirlist. -

- -Bash handles several filenames specially when they are used in -redirections, as described in the following table: -

- -

-
/dev/fd/fd -
If fd is a valid integer, file descriptor fd is duplicated. -

- -

/dev/stdin -
File descriptor 0 is duplicated. -

- -

/dev/stdout -
File descriptor 1 is duplicated. -

- -

/dev/stderr -
File descriptor 2 is duplicated. -

- -

/dev/tcp/host/port -
If host is a valid hostname or Internet address, and port -is an integer port number or service name, Bash attempts to open a TCP -connection to the corresponding socket. -

- -

/dev/udp/host/port -
If host is a valid hostname or Internet address, and port -is an integer port number or service name, Bash attempts to open a UDP -connection to the corresponding socket. -

- -

-

- -A failure to open or create a file causes the redirection to fail. -

- -Redirections using file descriptors greater than 9 should be used with -care, as they may conflict with file descriptors the shell uses -internally. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.1 Redirecting Input

- -Redirection of input causes the file whose name results from -the expansion of word -to be opened for reading on file descriptor n, -or the standard input (file descriptor 0) if n -is not specified. -

- -The general format for redirecting input is: -
 
[n]<word
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.2 Redirecting Output

- -Redirection of output causes the file whose name results from -the expansion of word -to be opened for writing on file descriptor n, -or the standard output (file descriptor 1) if n -is not specified. If the file does not exist it is created; -if it does exist it is truncated to zero size. -

- -The general format for redirecting output is: -
 
[n]>[|]word
-

- -If the redirection operator is `>', and the noclobber -option to the set builtin has been enabled, the redirection -will fail if the file whose name results from the expansion of -word exists and is a regular file. -If the redirection operator is `>|', or the redirection operator is -`>' and the noclobber option is not enabled, the redirection -is attempted even if the file named by word exists. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.3 Appending Redirected Output

- -Redirection of output in this fashion -causes the file whose name results from -the expansion of word -to be opened for appending on file descriptor n, -or the standard output (file descriptor 1) if n -is not specified. If the file does not exist it is created. -

- -The general format for appending output is: -
 
[n]>>word
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.4 Redirecting Standard Output and Standard Error

- -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 word with this construct. -

- -There are two formats for redirecting standard output and -standard error: -
 
&>word
-
and -
 
>&word
-
Of the two forms, the first is preferred. -This is semantically equivalent to -
 
>word 2>&1
-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.5 Here Documents

- -This type of redirection instructs the shell to read input from the -current source until a line containing only 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. -

- -The format of here-documents is: -
 
<<[-]word
-        here-document
-delimiter
-

- -No parameter expansion, command substitution, arithmetic expansion, -or filename expansion is performed on -word. If any characters in word are quoted, the -delimiter is the result of quote removal on word, -and the lines in the here-document are not expanded. -If word 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 \newline is ignored, and `\' -must be used to quote the characters -`\', `$', and ``'. -

- -If the redirection operator is `<<-', -then all leading tab characters are stripped from input lines and the -line containing delimiter. -This allows here-documents within shell scripts to be indented in a -natural fashion. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.6 Here Strings

- -A variant of here documents, the format is: -
 
<<< word
-

- -The word is expanded and supplied to the command on its standard -input. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.7 Duplicating File Descriptors

- -The redirection operator -
 
[n]<&word
-
is used to duplicate input file descriptors. -If word -expands to one or more digits, the file descriptor denoted by n -is made to be a copy of that file descriptor. -If the digits in word do not specify a file descriptor open for -input, a redirection error occurs. -If word -evaluates to `-', file descriptor n is closed. If -n is not specified, the standard input (file descriptor 0) is used. -

- -The operator -
 
[n]>&word
-
is used similarly to duplicate output file descriptors. If -n is not specified, the standard output (file descriptor 1) is used. -If the digits in word do not specify a file descriptor open for -output, a redirection error occurs. -As a special case, if n is omitted, and word does not -expand to one or more digits, the standard output and standard -error are redirected as described previously. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.8 Moving File Descriptors

- -The redirection operator -
 
[n]<&digit-
-
moves the file descriptor digit to file descriptor n, -or the standard input (file descriptor 0) if n is not specified. -digit is closed after being duplicated to n. -

- -Similarly, the redirection operator -
 
[n]>&digit-
-
moves the file descriptor digit to file descriptor n, -or the standard output (file descriptor 1) if n is not specified. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.6.9 Opening File Descriptors for Reading and Writing

- -The redirection operator -
 
[n]<>word
-
causes the file whose name is the expansion of word -to be opened for both reading and writing on file descriptor -n, or on file descriptor 0 if n -is not specified. If the file does not exist, it is created. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7 Executing Commands

- -

- -

- - - - - - -
3.7.1 Simple Command Expansion  How Bash expands simple commands before - executing them.
3.7.2 Command Search and Execution  How Bash finds commands and runs them.
3.7.3 Command Execution Environment  The environment in which Bash - executes commands that are not - shell builtins.
3.7.4 Environment  The environment given to a command.
3.7.5 Exit Status  The status returned by commands and how Bash - interprets it.
3.7.6 Signals  What happens when Bash or a command it runs - receives a signal.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.1 Simple Command Expansion

- -

- -When a simple command is executed, the shell performs the following -expansions, assignments, and redirections, from left to right. -

- -

    -
  1. -The words that the parser has marked as variable assignments (those -preceding the command name) and redirections are saved for later -processing. -

    - -

  2. -The words that are not variable assignments or redirections are -expanded (see section 3.5 Shell Expansions). -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. -

    - -

  3. -Redirections are performed as described above (see section 3.6 Redirections). -

    - -

  4. -The text after the `=' in each variable assignment undergoes tilde -expansion, parameter expansion, command substitution, arithmetic expansion, -and quote removal before being assigned to the variable. -
-

- -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. -

- -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. -

- -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. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.2 Command Search and 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. -

- -

    -
  1. -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 in 3.3 Shell Functions. -

    - -

  2. -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. -

    - -

  3. -If the name is neither a shell function nor a builtin, -and contains no slashes, Bash searches each element of -$PATH for a directory containing an executable file -by that name. Bash uses a hash table to remember the full -pathnames of executable files to avoid multiple PATH searches -(see the description of hash in 4.1 Bourne Shell Builtins). -A full search of the directories in $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. -

    - -

  4. -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 supplied, if any. -

    - -

  5. -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 -shell script and the shell executes it as described in -3.8 Shell Scripts. -

    - -

  6. -If the command was not begun asynchronously, the shell waits for -the command to complete and collects its exit status. -

    - -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.3 Command Execution Environment

- -

- -The shell has an execution environment, which consists of the -following: -

- -

    -
  • -open files inherited by the shell at invocation, as modified by -redirections supplied to the exec builtin -

    - -

  • -the current working directory as set by cd, pushd, or -popd, or inherited by the shell at invocation -

    - -

  • -the file creation mode mask as set by umask or inherited from -the shell's parent -

    - -

  • -current traps set by trap -

    - -

  • -shell parameters that are set by variable assignment or with set -or inherited from the shell's parent in the environment -

    - -

  • -shell functions defined during execution or inherited from the shell's -parent in the environment -

    - -

  • -options enabled at invocation (either by default or with command-line -arguments) or by set -

    - -

  • -options enabled by shopt (see section 4.3.2 The Shopt Builtin) -

    - -

  • -shell aliases defined with alias (see section 6.6 Aliases) -

    - -

  • -various process IDs, including those of background jobs -(see section 3.2.3 Lists of Commands), the value of $$, and the value of -$PPID -

    - -

-

- -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. -

- -

    -
  • -the shell's open files, plus any modifications and additions specified -by redirections to the command -

    - -

  • -the current working directory -

    - -

  • -the file creation mode mask -

    - -

  • -shell variables and functions marked for export, along with variables -exported for the command, passed in the environment (see section 3.7.4 Environment) -

    - -

  • -traps caught by the shell are reset to the values inherited from the -shell's parent, and traps ignored by the shell are ignored -

    - -

-

- -A command invoked in this separate environment cannot affect the -shell's execution environment. -

- -Command substitution, commands grouped with parentheses, -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. -

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

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.4 Environment

- -

- -When a program is invoked it is given an array of strings -called the environment. -This is a list of name-value pairs, of the form name=value. -

- -Bash 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 export -to child processes. Executed commands inherit the environment. -The export and `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 unset and `export -n' -commands, plus any additions via the export and -`declare -x' commands. -

- -The environment for any simple command -or function may be augmented temporarily by prefixing it with -parameter assignments, as described in 3.4 Shell Parameters. -These assignment statements affect only the environment seen -by that command. -

- -If the `-k' option is set (see section 4.3.1 The Set Builtin), then all -parameter assignments are placed in the environment for a command, -not just those that precede the command name. -

- -When Bash invokes an external command, the variable `$_' -is set to the full path name of the command and passed to that -command in its environment. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.5 Exit Status

- -

- -For the shell's purposes, a command which exits with a -zero exit status has succeeded. -A non-zero exit status indicates failure. -This seemingly counter-intuitive scheme is used so there -is one well-defined way to indicate success and a variety of -ways to indicate various failure modes. -When a command terminates on a fatal signal whose number is N, -Bash uses the value 128+N as the exit status. -

- -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. -

- -If a command fails because of an error during expansion or redirection, -the exit status is greater than zero. -

- -The exit status is used by the Bash conditional commands -(see section 3.2.4.2 Conditional Constructs) and some of the list -constructs (see section 3.2.3 Lists of Commands). -

- -All of the Bash builtins return an exit status of zero if they succeed -and a non-zero status on failure, so they may be used by the -conditional and list constructs. -All builtins return an exit status of 2 to indicate incorrect usage. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.7.6 Signals

- -

- -When Bash is interactive, in the absence of any traps, it ignores -SIGTERM (so that `kill 0' does not kill an interactive shell), -and SIGINT -is caught and handled (so that the wait builtin is interruptible). -When Bash receives a SIGINT, it breaks out of any executing loops. -In all cases, Bash ignores SIGQUIT. -If job control is in effect (see section 7. Job Control), Bash -ignores SIGTTIN, SIGTTOU, and SIGTSTP. -

- -Non-builtin commands started by Bash have signal handlers set to the -values inherited by the shell from its parent. -When job control is not in effect, asynchronous commands -ignore SIGINT and SIGQUIT in addition to these inherited -handlers. -Commands run as a result of -command substitution ignore the keyboard-generated job control signals -SIGTTIN, SIGTTOU, and SIGTSTP. -

- -The shell exits by default upon receipt of a SIGHUP. -Before exiting, an interactive shell resends the SIGHUP to -all jobs, running or stopped. -Stopped jobs are sent SIGCONT to ensure that they receive -the SIGHUP. -To prevent the shell from sending the SIGHUP signal to a -particular job, it should be removed -from the jobs table with the disown -builtin (see section 7.2 Job Control Builtins) or marked -to not receive SIGHUP using disown -h. -

- -If the huponexit shell option has been set with shopt -(see section 4.3.2 The Shopt Builtin), Bash sends a SIGHUP to all jobs when -an interactive login shell exits. -

- -If Bash is waiting for a command to complete and receives a signal -for which a trap has been set, the trap will not be executed until -the command completes. -When Bash is waiting for an asynchronous -command via the wait builtin, the reception of a signal for -which a trap has been set will cause the wait builtin to return -immediately with an exit status greater than 128, immediately after -which the trap is executed. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

3.8 Shell Scripts

- -

- -A shell script is a text file containing shell commands. When such -a file is used as the first non-option argument when invoking Bash, -and neither the `-c' nor `-s' option is supplied -(see section 6.1 Invoking Bash), -Bash reads and executes commands from the file, then exits. This -mode of operation creates a non-interactive shell. The shell first -searches for the file in the current directory, and looks in the -directories in $PATH if not found there. -

- -When Bash runs -a shell script, it sets the special parameter 0 to the name -of the file, rather than the name of the shell, and the positional -parameters are set to the remaining arguments, if any are given. -If no additional arguments are supplied, the positional parameters -are unset. -

- -A shell script may be made executable by using the chmod command -to turn on the execute bit. When Bash finds such a file while -searching the $PATH for a command, it spawns a subshell to -execute it. In other words, executing -
 
filename arguments
-
is equivalent to executing -
 
bash filename arguments
-

- -if filename is an executable shell script. -This subshell reinitializes itself, so that the effect is as if a -new shell had been invoked to interpret the script, with the -exception that the locations of commands remembered by the parent -(see the description of hash in 4.1 Bourne Shell Builtins) -are retained by the child. -

- -Most versions of Unix make this a part of the operating system's command -execution mechanism. If the first line of a script begins with -the two characters `#!', the remainder of the line specifies -an interpreter for the program. -Thus, you can specify Bash, awk, Perl, or some other -interpreter and write the rest of the script file in that language. -

- -The arguments to the interpreter -consist of a single optional argument following the interpreter -name on the first line of the script file, followed by the name of -the script file, followed by the rest of the arguments. Bash -will perform this action on operating systems that do not handle it -themselves. Note that some older versions of Unix limit the interpreter -name and argument to a maximum of 32 characters. -

- -Bash scripts often begin with #! /bin/bash (assuming that -Bash has been installed in `/bin'), since this ensures that -Bash will be used to interpret the script, even if it is executed -under another shell. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4. Shell Builtin Commands

- -

- -

- - - - -
4.1 Bourne Shell Builtins  Builtin commands inherited from the Bourne - Shell.
4.2 Bash Builtin Commands  Table of builtins specific to Bash.
4.3 Modifying Shell Behavior  Builtins to modify shell attributes and - optional behavior.
4.4 Special Builtins  Builtin commands classified specially by - POSIX.
-

- -Builtin commands are contained within the shell itself. -When the name of a builtin command is used as the first word of -a simple command (see section 3.2.1 Simple Commands), the shell executes -the command directly, without invoking another program. -Builtin commands are necessary to implement functionality impossible -or inconvenient to obtain with separate utilities. -

- -This section briefly describes the builtins which Bash inherits from -the Bourne Shell, as well as the builtin commands which are unique -to or have been extended in Bash. -

- -Several builtin commands are described in other chapters: builtin -commands which provide the Bash interface to the job control -facilities (see section 7.2 Job Control Builtins), the directory stack -(see section 6.8.1 Directory Stack Builtins), the command history -(see section 9.2 Bash History Builtins), and the programmable completion -facilities (see section 8.7 Programmable Completion Builtins). -

- -Many of the builtins have been extended by POSIX or Bash. -

- -Unless otherwise noted, each builtin command documented as accepting -options preceded by `-' accepts `--' -to signify the end of the options. -For example, the :, true, false, and test -builtins do not accept options. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.1 Bourne Shell Builtins

- -

- -The following shell builtin commands are inherited from the Bourne Shell. -These commands are implemented as specified by the POSIX standard. -

- -

-
: (a colon) -
-
 
: [arguments]
-
Do nothing beyond expanding arguments and performing redirections. -The return status is zero. -

- -

. (a period) -
-
 
. filename [arguments]
-
Read and execute commands from the filename argument in the -current shell context. If filename does not contain a slash, -the PATH variable is used to find filename. -When Bash is not in POSIX mode, the current directory is searched -if filename is not found in $PATH. -If any arguments are supplied, they become the positional -parameters when filename is executed. Otherwise the positional -parameters are unchanged. -The return status is the exit status of the last command executed, or -zero if no commands are executed. If filename is not found, or -cannot be read, the return status is non-zero. -This builtin is equivalent to source. -

- -

break -
-
 
break [n]
-
Exit from a for, while, until, or select loop. -If n is supplied, the nth enclosing loop is exited. -n must be greater than or equal to 1. -The return status is zero unless n is not greater than or equal to 1. -

- -

cd -
-
 
cd [-L|-P] [directory]
-
Change the current working directory to directory. -If directory is not given, the value of the HOME shell -variable is used. -If the shell variable CDPATH exists, it is used as a search path. -If directory begins with a slash, CDPATH is not used. -

- -The `-P' option means to not follow symbolic links; symbolic -links are followed by default or with the `-L' option. -If directory is `-', it is equivalent to $OLDPWD. -

- -If a non-empty directory name from CDPATH is used, or if -`-' is the first argument, and the directory change is -successful, the absolute pathname of the new working directory is -written to the standard output. -

- -The return status is zero if the directory is successfully changed, -non-zero otherwise. -

- -

continue -
-
 
continue [n]
-
Resume the next iteration of an enclosing for, while, -until, or select loop. -If n is supplied, the execution of the nth enclosing loop -is resumed. -n must be greater than or equal to 1. -The return status is zero unless n is not greater than or equal to 1. -

- -

eval -
-
 
eval [arguments]
-
The arguments are concatenated together into a single command, which is -then read and executed, and its exit status returned as the exit status -of eval. -If there are no arguments or only empty arguments, the return status is -zero. -

- -

exec -
-
 
exec [-cl] [-a name] [command [arguments]]
-
If command -is supplied, it replaces the shell without creating a new process. -If the `-l' option is supplied, the shell places a dash at the -beginning of the zeroth argument passed to command. -This is what the login program does. -The `-c' option causes command to be executed with an empty -environment. -If `-a' is supplied, the shell passes name as the zeroth -argument to command. -If no command is specified, redirections may be used to affect -the current shell environment. If there are no redirection errors, the -return status is zero; otherwise the return status is non-zero. -

- -

exit -
-
 
exit [n]
-
Exit the shell, returning a status of n to the shell's parent. -If n is omitted, the exit status is that of the last command executed. -Any trap on EXIT is executed before the shell terminates. -

- -

export -
-
 
export [-fn] [-p] [name[=value]]
-
Mark each name to be passed to child processes -in the environment. If the `-f' option is supplied, the names -refer to shell functions; otherwise the names refer to shell variables. -The `-n' option means to no longer mark each name for export. -If no names are supplied, or if the `-p' option is given, a -list of exported names is displayed. -The `-p' option displays output in a form that may be reused as input. -If a variable name is followed by =value, the value of -the variable is set to value. -

- -The return status is zero unless an invalid option is supplied, one of -the names is not a valid shell variable name, or `-f' is supplied -with a name that is not a shell function. -

- -

getopts -
-
 
getopts optstring name [args]
-
getopts is used by shell scripts to parse positional parameters. -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 (`?') may not be -used as option characters. -Each time it is invoked, getopts -places the next option in the shell variable name, initializing -name if it does not exist, -and the index of the next argument to be processed into the -variable OPTIND. -OPTIND is initialized to 1 each time the shell or a shell script -is invoked. -When an option requires an argument, -getopts places that argument into the variable OPTARG. -The shell does not reset OPTIND automatically; it must be manually -reset between multiple calls to getopts within the same shell -invocation if a new set of parameters is to be used. -

- -When the end of options is encountered, getopts exits with a -return value greater than zero. -OPTIND is set to the index of the first non-option argument, -and name is set to `?'. -

- -getopts -normally parses the positional parameters, but if more arguments are -given in args, getopts parses those instead. -

- -getopts can report errors in two ways. If the first character of -optstring is a colon, silent -error reporting is used. In normal operation diagnostic messages -are printed when invalid options or missing option arguments are -encountered. -If the variable OPTERR -is set to 0, no error messages will be displayed, even if the first -character of optstring is not a colon. -

- -If an invalid option is seen, -getopts places `?' into name and, if not silent, -prints an error message and unsets OPTARG. -If getopts is silent, the option character found is placed in -OPTARG and no diagnostic message is printed. -

- -If a required argument is not found, and getopts -is not silent, a question mark (`?') is placed in name, -OPTARG is unset, and a diagnostic message is printed. -If getopts is silent, then a colon (`:') is placed in -name and OPTARG is set to the option character found. -

- -

hash -
-
 
hash [-r] [-p filename] [-dt] [name]
-
Remember the full pathnames of commands specified as name arguments, -so they need not be searched for on subsequent invocations. -The commands are found by searching through the directories listed in -$PATH. -The `-p' option inhibits the path search, and filename is -used as the location of name. -The `-r' option causes the shell to forget all remembered locations. -The `-d' option causes the shell to forget the remembered location -of each name. -If the `-t' option is supplied, the full pathname to which each -name corresponds is printed. If multiple name arguments are -supplied with `-t' the name is printed before the hashed -full pathname. -The `-l' option causes output to be displayed in a format -that may be reused as input. -If no arguments are given, or if only `-l' is supplied, -information about remembered commands is printed. -The return status is zero unless a name is not found or an invalid -option is supplied. -

- -

pwd -
-
 
pwd [-LP]
-
Print the absolute pathname of the current working directory. -If the `-P' option is supplied, the pathname printed will not -contain symbolic links. -If the `-L' option is supplied, the pathname printed may contain -symbolic links. -The return status is zero unless an error is encountered while -determining the name of the current directory or an invalid option -is supplied. -

- -

readonly -
-
 
readonly [-apf] [name[=value]] ...
-
Mark each name as readonly. -The values of these names may not be changed by subsequent assignment. -If the `-f' option is supplied, each name refers to a shell -function. -The `-a' option means each name refers to an array variable. -If no name arguments are given, or if the `-p' -option is supplied, a list of all readonly names is printed. -The `-p' option causes output to be displayed in a format that -may be reused as input. -If a variable name is followed by =value, the value of -the variable is set to value. -The return status is zero unless an invalid option is supplied, one of -the name arguments is not a valid shell variable or function name, -or the `-f' option is supplied with a name that is not a shell function. -

- -

return -
-
 
return [n]
-
Cause a shell function to exit with the return value n. -If n is not supplied, the return value is the exit status of the -last command executed in the function. -This may also be used to terminate execution of a script being executed -with the . (or source) builtin, returning either n or -the exit status of the last command executed within the script as the exit -status of the script. -Any command associated with the RETURN trap is executed -before execution resumes after the function or script. -The return status is non-zero if return is used outside a function -and not during the execution of a script by . or source. -

- -

shift -
-
 
shift [n]
-
Shift the positional parameters to the left by n. -The positional parameters from n+1 ... $# are -renamed to $1 ... $#-n. -Parameters represented by the numbers $# to $#-n+1 -are unset. -n must be a non-negative number less than or equal to $#. -If n is zero or greater than $#, the positional parameters -are not changed. -If n is not supplied, it is assumed to be 1. -The return status is zero unless n is greater than $# or -less than zero, non-zero otherwise. -

- -

test -
[ -
- -Evaluate a conditional expression expr. -Each operator and operand must be a separate argument. -Expressions are composed of the primaries described below in -6.4 Bash Conditional Expressions. -test does not accept any options, nor does it accept and ignore -an argument of `--' as signifying the end of options. -

- -When the [ form is used, the last argument to the command must -be a ]. -

- -Expressions may be combined using the following operators, listed in -decreasing order of precedence. -

- -

-
! expr -
True if expr is false. -

- -

( expr ) -
Returns the value of expr. -This may be used to override the normal precedence of operators. -

- -

expr1 -a expr2 -
True if both expr1 and expr2 are true. -

- -

expr1 -o expr2 -
True if either expr1 or expr2 is true. -
-

- -The test and [ builtins evaluate conditional -expressions using a set of rules based on the number of arguments. -

- -

-
0 arguments -
The expression is false. -

- -

1 argument -
The expression is true if and only if the argument is not null. -

- -

2 arguments -
If the first argument is `!', the expression is true if and -only if the second argument is null. -If the first argument is one of the unary conditional operators -(see section 6.4 Bash Conditional Expressions), the expression -is true if the unary test is true. -If the first argument is not a valid unary operator, the expression is -false. -

- -

3 arguments -
If the second argument is one of the binary conditional -operators (see section 6.4 Bash 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 `!', the value is the negation of -the two-argument test using the second and third arguments. -If the first argument is exactly `(' and the third argument is -exactly `)', the result is the one-argument test of the second -argument. -Otherwise, the expression is false. -The `-a' and `-o' operators are considered binary operators -in this case. -

- -

4 arguments -
If the first argument is `!', 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. -

- -

5 or more arguments -
The expression is parsed and evaluated according to precedence -using the rules listed above. -
-

- -

times -
-
 
times
-
Print out the user and system times used by the shell and its children. -The return status is zero. -

- -

trap -
-
 
trap [-lp] [arg] [sigspec ...]
-
The commands in arg are to be read and executed when the -shell receives signal sigspec. If arg is absent (and -there is a single sigspec) or -equal to `-', each specified signal's disposition is reset -to the value it had when the shell was started. -If arg is the null string, then the signal specified by -each sigspec is ignored by the shell and commands it invokes. -If arg is not present and `-p' has been supplied, -the shell displays the trap commands associated with each sigspec. -If no arguments are supplied, or -only `-p' is given, trap prints the list of commands -associated with each signal number in a form that may be reused as -shell input. -The `-l' option causes the shell to print a list of signal names -and their corresponding numbers. -Each sigspec is either a signal name or a signal number. -Signal names are case insensitive and the SIG prefix is optional. -If a sigspec -is 0 or EXIT, arg is executed when the shell exits. -If a sigspec is DEBUG, the command arg is executed -before every simple command, for command, case command, -select command, every arithmetic for command, and before -the first command executes in a shell function. -Refer to the description of the extglob option to the -shopt builtin (see section 4.3.2 The Shopt Builtin) for details of its -effect on the DEBUG trap. -If a sigspec is ERR, the command arg -is executed whenever a simple command has a non-zero exit status, -subject to the following conditions. -The ERR trap is not executed if the failed command is part of the -command list immediately following an until or while keyword, -part of the test in an if statement, -part of a && or || list, or if the command's return -status is being inverted using !. -These are the same conditions obeyed by the errexit option. -If a sigspec is RETURN, the command arg is executed -each time a shell function or a script executed with the . or -source builtins finishes executing. -

- -Signals ignored upon entry to the shell cannot be trapped or reset. -Trapped signals that are not being ignored are reset to their original -values in a child process when it is created. -

- -The return status is zero unless a sigspec does not specify a -valid signal. -

- -

umask -
-
 
umask [-p] [-S] [mode]
-
Set the shell process's file creation mask to mode. If -mode begins with a digit, it is interpreted as an octal number; -if not, it is interpreted as a symbolic mode mask similar -to that accepted by the chmod command. If mode is -omitted, the current value of the mask is printed. If the `-S' -option is supplied without a mode argument, the mask is printed -in a symbolic format. -If the `-p' option is supplied, and mode -is omitted, the output is in a form that may be reused as input. -The return status is zero if the mode is successfully changed or if -no mode argument is supplied, and non-zero otherwise. -

- -Note that when the mode is interpreted as an octal number, each number -of the umask is subtracted from 7. Thus, a umask of 022 -results in permissions of 755. -

- -

unset -
-
 
unset [-fv] [name]
-
Each variable or function name is removed. -If no options are supplied, or the `-v' option is given, each -name refers to a shell variable. -If the `-f' option is given, the names refer to shell -functions, and the function definition is removed. -Readonly variables and functions may not be unset. -The return status is zero unless a name is readonly. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.2 Bash Builtin Commands

- -

- -This section describes builtin commands which are unique to -or have been extended in Bash. -Some of these commands are specified in the POSIX standard. -

- -

- -
alias -
-
 
alias [-p] [name[=value] ...]
-

- -Without arguments or with the `-p' option, alias prints -the list of aliases on the standard output in a form that allows -them to be reused as input. -If arguments are supplied, an alias is defined for each name -whose value is given. If no value is given, the name -and value of the alias is printed. -Aliases are described in 6.6 Aliases. -

- -

bind -
-
 
bind [-m keymap] [-lpsvPSV]
-bind [-m keymap] [-q function] [-u function] [-r keyseq]
-bind [-m keymap] -f filename
-bind [-m keymap] -x keyseq:shell-command
-bind [-m keymap] keyseq:function-name
-bind readline-command
-

- -Display current Readline (see section 8. Command Line Editing) -key and function bindings, -bind a key sequence to a Readline function or macro, -or set a Readline variable. -Each non-option argument is a command as it would appear in a -Readline initialization file (see section 8.3 Readline Init File), -but each binding or command must be passed as a separate argument; e.g., -`"\C-x\C-r":re-read-init-file'. -Options, if supplied, have the following meanings: -

- -

-
-m keymap -
Use keymap as the keymap to be affected by -the subsequent bindings. Acceptable keymap -names are -emacs, -emacs-standard, -emacs-meta, -emacs-ctlx, -vi, -vi-move, -vi-command, and -vi-insert. -vi is equivalent to vi-command; -emacs is equivalent to emacs-standard. -

- -

-l -
List the names of all Readline functions. -

- -

-p -
Display Readline function names and bindings in such a way that they -can be used as input or in a Readline initialization file. -

- -

-P -
List current Readline function names and bindings. -

- -

-v -
Display Readline variable names and values in such a way that they -can be used as input or in a Readline initialization file. -

- -

-V -
List current Readline variable names and values. -

- -

-s -
Display Readline key sequences bound to macros and the strings they output -in such a way that they can be used as input or in a Readline -initialization file. -

- -

-S -
Display Readline key sequences bound to macros and the strings they output. -

- -

-f filename -
Read key bindings from filename. -

- -

-q function -
Query about which keys invoke the named function. -

- -

-u function -
Unbind all keys bound to the named function. -

- -

-r keyseq -
Remove any current binding for keyseq. -

- -

-x keyseq:shell-command -
Cause shell-command to be executed whenever keyseq is -entered. -

- -

-

- -The return status is zero unless an invalid option is supplied or an -error occurs. -

- -

builtin -
-
 
builtin [shell-builtin [args]]
-
Run a shell builtin, passing it args, and return its exit status. -This is useful when defining a shell function with the same -name as a shell builtin, retaining the functionality of the builtin within -the function. -The return status is non-zero if shell-builtin is not a shell -builtin command. -

- -

caller -
-
 
caller [expr]
-
Returns the context of any active subroutine call (a shell function or -a script executed with the . or source builtins). -

- -Without expr, caller displays the line number and source -filename of the current subroutine call. -If a non-negative integer is supplied as expr, caller -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 expr does not correspond to a valid position in the -call stack. -

- -

command -
-
 
command [-pVv] command [arguments ...]
-
Runs command with arguments ignoring any shell function -named command. -Only shell builtin commands or commands found by searching the -PATH are executed. -If there is a shell function named ls, running `command ls' -within the function will execute the external command ls -instead of calling the function recursively. -The `-p' option means to use a default value for PATH -that is guaranteed to find all of the standard utilities. -The return status in this case is 127 if command cannot be -found or an error occurred, and the exit status of command -otherwise. -

- -If either the `-V' or `-v' option is supplied, a -description of command is printed. The `-v' option -causes a single word indicating the command or file name used to -invoke command to be displayed; the `-V' option produces -a more verbose description. In this case, the return status is -zero if command is found, and non-zero if not. -

- -

declare -
-
 
declare [-afFirtx] [-p] [name[=value] ...]
-

- -Declare variables and give them attributes. If no names -are given, then display the values of variables instead. -

- -The `-p' option will display the attributes and values of each -name. -When `-p' is used, additional options are ignored. -The `-F' option inhibits the display of function definitions; -only the function name and attributes are printed. -If the extdebug shell option is enabled using shopt -(see section 4.3.2 The Shopt Builtin), the source file name and line number where -the function is defined are displayed as well. -`-F' implies `-f'. -The following options can be used to restrict output to variables with -the specified attributes or to give variables attributes: -

- -

-
-a -
Each name is an array variable (see section 6.7 Arrays). -

- -

-f -
Use function names only. -

- -

-i -
The variable is to be treated as -an integer; arithmetic evaluation (see section 6.5 Shell Arithmetic) is -performed when the variable is assigned a value. -

- -

-r -
Make names readonly. These names cannot then be assigned values -by subsequent assignment statements or unset. -

- -

-t -
Give each name the trace attribute. -Traced functions inherit the DEBUG and RETURN traps from -the calling shell. -The trace attribute has no special meaning for variables. -

- -

-x -
Mark each name for export to subsequent commands via -the environment. -
-

- -Using `+' instead of `-' turns off the attribute instead, -with the exceptions that `+a' -may not be used to destroy an array variable and `+r' will not -remove the readonly attribute. -When used in a function, declare makes each name local, -as with the local command. If a variable name is followed by -=value, the value of the variable is set to value. -

- -The return status is zero unless an invalid option is encountered, -an attempt is made to define a function using `-f foo=bar', -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 section 6.7 Arrays), -one of the names 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 `-f'. -

- -

echo -
-
 
echo [-neE] [arg ...]
-
Output the args, separated by spaces, terminated with a -newline. -The return status is always 0. -If `-n' is specified, the trailing newline is suppressed. -If the `-e' option is given, interpretation of the following -backslash-escaped characters is enabled. -The `-E' option disables the interpretation of these escape characters, -even on systems where they are interpreted by default. -The xpg_echo shell option may be used to -dynamically determine whether or not echo expands these -escape characters by default. -echo does not interpret `--' to mean the end of options. -

- -echo interprets the following escape sequences: -

-
\a -
alert (bell) -
\b -
backspace -
\c -
suppress trailing newline -
\e -
escape -
\f -
form feed -
\n -
new line -
\r -
carriage return -
\t -
horizontal tab -
\v -
vertical tab -
\\ -
backslash -
\0nnn -
the eight-bit character whose value is the octal value nnn -(zero to three octal digits) -
\xHH -
the eight-bit character whose value is the hexadecimal value HH -(one or two hex digits) -
-

- -

enable -
-
 
enable [-a] [-dnps] [-f filename] [name ...]
-
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 `-n' is used, the names become disabled. Otherwise -names are enabled. For example, to use the test binary -found via $PATH instead of the shell builtin version, type -`enable -n test'. -

- -If the `-p' option is supplied, or no name arguments appear, -a list of shell builtins is printed. With no other arguments, the list -consists of all enabled shell builtins. -The `-a' option means to list -each builtin with an indication of whether or not it is enabled. -

- -The `-f' option means to load the new builtin command name -from shared object filename, on systems that support dynamic loading. -The `-d' option will delete a builtin loaded with `-f'. -

- -If there are no options, a list of the shell builtins is displayed. -The `-s' option restricts enable to the POSIX special -builtins. If `-s' is used with `-f', the new builtin becomes -a special builtin (see section 4.4 Special Builtins). -

- -The return status is zero unless a name is not a shell builtin -or there is an error loading a new builtin from a shared object. -

- -

help -
-
 
help [-s] [pattern]
-
Display helpful information about builtin commands. -If pattern is specified, help gives detailed help -on all commands matching pattern, otherwise a list of -the builtins is printed. -The `-s' option restricts the information displayed to a short -usage synopsis. -The return status is zero unless no command matches pattern. -

- -

let -
-
 
let expression [expression]
-
The let builtin allows arithmetic to be performed on shell -variables. Each expression is evaluated according to the -rules given below in 6.5 Shell Arithmetic. If the -last expression evaluates to 0, let returns 1; -otherwise 0 is returned. -

- -

local -
-
 
local [option] name[=value] ...
-
For each argument, a local variable named name is created, -and assigned value. -The option can be any of the options accepted by declare. -local can only be used within a function; it makes the variable -name have a visible scope restricted to that function and its -children. The return status is zero unless local is used outside -a function, an invalid name is supplied, or name is a -readonly variable. -

- -

logout -
-
 
logout [n]
-
Exit a login shell, returning a status of n to the shell's -parent. -

- -

printf -
-
 
printf [-v var] format [arguments]
-
Write the formatted arguments to the standard output under the -control of the format. -The format 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 -argument. -In addition to the standard printf(1) formats, `%b' causes -printf to expand backslash escape sequences in the corresponding -argument, -(except that `\c' terminates output, backslashes in -`\'', `\"', and `\?' are not removed, and octal escapes -beginning with `\0' may contain up to four digits), -and `%q' causes printf to output the -corresponding argument in a format that can be reused as shell input. -

- -The `-v' option causes the output to be assigned to the variable -var rather than being printed to the standard output. -

- -The format is reused as necessary to consume all of the arguments. -If the format requires more arguments 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. -

- -

read -
-
 
read [-ers] [-a aname] [-d delim] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-
One line is read from the standard input, or from the file descriptor -fd supplied as an argument to the `-u' option, and the first word -is assigned to the first name, the second word to the second name, -and so on, with leftover words and their intervening separators assigned -to the last name. -If there are fewer words read from the input stream than names, -the remaining names are assigned empty values. -The characters in the value of the IFS variable -are used to split the line into words. -The backslash character `\' may be used to remove any special -meaning for the next character read and for line continuation. -If no names are supplied, the line read is assigned to the -variable REPLY. -The return code is zero, unless end-of-file is encountered, read -times out, or an invalid file descriptor is supplied as the argument to -`-u'. -Options, if supplied, have the following meanings: -

- -

-
-a aname -
The words are assigned to sequential indices of the array variable -aname, starting at 0. -All elements are removed from aname before the assignment. -Other name arguments are ignored. -

- -

-d delim -
The first character of delim is used to terminate the input line, -rather than newline. -

- -

-e -
Readline (see section 8. Command Line Editing) is used to obtain the line. -

- -

-n nchars -
read returns after reading nchars characters rather than -waiting for a complete line of input. -

- -

-p prompt -
Display prompt, without a trailing newline, before attempting -to read any input. -The prompt is displayed only if input is coming from a terminal. -

- -

-r -
If this option is given, 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. -

- -

-s -
Silent mode. If input is coming from a terminal, characters are -not echoed. -

- -

-t timeout -
Cause read to time out and return failure if a complete line of -input is not read within timeout seconds. -This option has no effect if read is not reading input from the -terminal or a pipe. -

- -

-u fd -
Read input from file descriptor fd. -

- -

-

- -

source -
-
 
source filename
-
A synonym for . (see section 4.1 Bourne Shell Builtins). -

- -

type -
-
 
type [-afptP] [name ...]
-
For each name, indicate how it would be interpreted if used as a -command name. -

- -If the `-t' option is used, type prints a single word -which is one of `alias', `function', `builtin', -`file' or `keyword', -if name is an alias, shell function, shell builtin, -disk file, or shell reserved word, respectively. -If the name is not found, then nothing is printed, and -type returns a failure status. -

- -If the `-p' option is used, type either returns the name -of the disk file that would be executed, or nothing if `-t' -would not return `file'. -

- -The `-P' option forces a path search for each name, even if -`-t' would not return `file'. -

- -If a command is hashed, `-p' and `-P' print the hashed value, -not necessarily the file that appears first in $PATH. -

- -If the `-a' option is used, type returns all of the places -that contain an executable named file. -This includes aliases and functions, if and only if the `-p' option -is not also used. -

- -If the `-f' option is used, type does not attempt to find -shell functions, as with the command builtin. -

- -The return status is zero if any of the names are found, non-zero -if none are found. -

- -

typeset -
-
 
typeset [-afFrxi] [-p] [name[=value] ...]
-
The typeset command is supplied for compatibility with the Korn -shell; however, it has been deprecated in favor of the declare -builtin command. -

- -

ulimit -
-
 
ulimit [-acdefilmnpqrstuvxSH] [limit]
-
ulimit provides control over the resources available to processes -started by the shell, on systems that allow such control. If an -option is given, it is interpreted as follows: -
-
-S -
Change and report the soft limit associated with a resource. -

- -

-H -
Change and report the hard limit associated with a resource. -

- -

-a -
All current limits are reported. -

- -

-c -
The maximum size of core files created. -

- -

-d -
The maximum size of a process's data segment. -

- -

-e -
The maximum scheduling priority ("nice"). -

- -

-f -
The maximum size of files written by the shell and its children. -

- -

-i -
The maximum number of pending signals. -

- -

-l -
The maximum size that may be locked into memory. -

- -

-m -
The maximum resident set size. -

- -

-n -
The maximum number of open file descriptors. -

- -

-p -
The pipe buffer size. -

- -

-q -
The maximum number of bytes in POSIX message queues. -

- -

-r -
The maximum real-time scheduling priority. -

- -

-s -
The maximum stack size. -

- -

-t -
The maximum amount of cpu time in seconds. -

- -

-u -
The maximum number of processes available to a single user. -

- -

-v -
The maximum amount of virtual memory available to the process. -

- -

-x -
The maximum number of file locks. -

- -

-

- -If limit is given, it is the new value of the specified resource; -the special limit values hard, soft, and -unlimited stand for the current hard limit, the current soft limit, -and no limit, respectively. -Otherwise, the current value of the soft limit for the specified resource -is printed, unless the `-H' option is supplied. -When setting new limits, if neither `-H' nor `-S' is supplied, -both the hard and soft limits are set. -If no option is given, then `-f' is assumed. Values are in 1024-byte -increments, except for `-t', which is in seconds, `-p', -which is in units of 512-byte blocks, and `-n' and `-u', which -are unscaled values. -

- -The return status is zero unless an invalid option or argument is supplied, -or an error occurs while setting a new limit. -

- -

unalias -
-
 
unalias [-a] [name ... ]
-

- -Remove each name from the list of aliases. If `-a' is -supplied, all aliases are removed. -Aliases are described in 6.6 Aliases. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.3 Modifying Shell Behavior

- - -
- - -
4.3.1 The Set Builtin  Change the values of shell attributes and - positional parameters.
4.3.2 The Shopt Builtin  Modify shell optional behavior.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.3.1 The Set Builtin

- -

- -This builtin is so complicated that it deserves its own section. set -allows you to change the values of shell options and set the positional -parameters, or to display the names and values of shell variables. -

- -

-
set -
-
 
set [--abefhkmnptuvxBCEHPT] [-o option] [argument ...]
-set [+abefhkmnptuvxBCEHPT] [+o option] [argument ...]
-

- -If no options or arguments are supplied, set displays the names -and values of all shell variables and functions, sorted according to the -current locale, in a format that may be reused as input -for setting or resetting the currently-set variables. -Read-only variables cannot be reset. -In POSIX mode, only shell variables are listed. -

- -When options are supplied, they set or unset shell attributes. -Options, if specified, have the following meanings: -

- -

-
-a -
Mark variables and function which are modified or created for export -to the environment of subsequent commands. -

- -

-b -
Cause the status of terminated background jobs to be reported -immediately, rather than before printing the next primary prompt. -

- -

-e -
Exit immediately if a simple command (see section 3.2.1 Simple Commands) exits -with a non-zero status, unless the command that fails is part of the -command list immediately following a while or until keyword, -part of the test in an if statement, -part of a && or || list, -any command in a pipeline but the last, -or if the command's return status is being inverted using !. -A trap on ERR, if set, is executed before the shell exits. -

- -

-f -
Disable file name generation (globbing). -

- -

-h -
Locate and remember (hash) commands as they are looked up for execution. -This option is enabled by default. -

- -

-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. -

- -

-m -
Job control is enabled (see section 7. Job Control). -

- -

-n -
Read commands but do not execute them; this may be used to check a -script for syntax errors. -This option is ignored by interactive shells. -

- -

-o option-name -

- -Set the option corresponding to option-name: -

- -

-
allexport -
Same as -a. -

- -

braceexpand -
Same as -B. -

- -

emacs -
Use an emacs-style line editing interface (see section 8. Command Line Editing). -

- -

errexit -
Same as -e. -

- -

errtrace -
Same as -E. -

- -

functrace -
Same as -T. -

- -

hashall -
Same as -h. -

- -

histexpand -
Same as -H. -

- -

history -
Enable command history, as described in 9.1 Bash History Facilities. -This option is on by default in interactive shells. -

- -

ignoreeof -
An interactive shell will not exit upon reading EOF. -

- -

keyword -
Same as -k. -

- -

monitor -
Same as -m. -

- -

noclobber -
Same as -C. -

- -

noexec -
Same as -n. -

- -

noglob -
Same as -f. -

- -

nolog -
Currently ignored. -

- -

notify -
Same as -b. -

- -

nounset -
Same as -u. -

- -

onecmd -
Same as -t. -

- -

physical -
Same as -P. -

- -

pipefail -
If set, the return value of a pipeline is the value of the last -(rightmost) command to exit with a non-zero status, or zero if all -commands in the pipeline exit successfully. -This option is disabled by default. -

- -

posix -
Change the behavior of Bash where the default operation differs -from the POSIX standard to match the standard -(see section 6.11 Bash POSIX Mode). -This is intended to make Bash behave as a strict superset of that -standard. -

- -

privileged -
Same as -p. -

- -

verbose -
Same as -v. -

- -

vi -
Use a vi-style line editing interface. -

- -

xtrace -
Same as -x. -
-

- -

-p -
Turn on privileged mode. -In this mode, the $BASH_ENV and $ENV files are not -processed, shell functions are not inherited from the environment, -and the 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 -p option is not supplied, these actions -are taken and the effective user id is set to the real user id. -If the -p 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. -

- -

-t -
Exit after reading and executing one command. -

- -

-u -
Treat unset variables as an error when performing parameter expansion. -An error message will be written to the standard error, and a non-interactive -shell will exit. -

- -

-v -
Print shell input lines as they are read. -

- -

-x -
Print a trace of simple commands, for commands, case -commands, select commands, and arithmetic for commands -and their arguments or associated word lists after they are -expanded and before they are executed. The value of the PS4 -variable is expanded and the resultant value is printed before -the command and its expanded arguments. -

- -

-B -
The shell will perform brace expansion (see section 3.5.1 Brace Expansion). -This option is on by default. -

- -

-C -
Prevent output redirection using `>', `>&', and `<>' -from overwriting existing files. -

- -

-E -
If set, any trap on ERR is inherited by shell functions, command -substitutions, and commands executed in a subshell environment. -The ERR trap is normally not inherited in such cases. -

- -

-H -
Enable `!' style history substitution (see section 9.3 History Expansion). -This option is on by default for interactive shells. -

- -

-P -
If set, do not follow symbolic links when performing commands such as -cd which change the current directory. The physical directory -is used instead. By default, Bash follows -the logical chain of directories when performing commands -which change the current directory. -

- -For example, if `/usr/sys' is a symbolic link to `/usr/local/sys' -then: -
 
$ cd /usr/sys; echo $PWD
-/usr/sys
-$ cd ..; pwd
-/usr
-

- -If set -P is on, then: -
 
$ cd /usr/sys; echo $PWD
-/usr/local/sys
-$ cd ..; pwd
-/usr/local
-

- -

-T -
If set, any trap on DEBUG and RETURN are inherited by -shell functions, command substitutions, and commands executed -in a subshell environment. -The DEBUG and RETURN traps are normally not inherited -in such cases. -

- -

-- -
If no arguments follow this option, then the positional parameters are -unset. Otherwise, the positional parameters are set to the -arguments, even if some of them begin with a `-'. -

- -

- -
Signal the end of options, cause all remaining arguments -to be assigned to the positional parameters. The `-x' -and `-v' options are turned off. -If there are no arguments, the positional parameters remain unchanged. -
-

- -Using `+' rather than `-' causes these options to be -turned off. The options can also be used upon invocation of the -shell. The current set of options may be found in $-. -

- -The remaining N arguments are positional parameters and are -assigned, in order, to $1, $2, ... $N. -The special parameter # is set to N. -

- -The return status is always zero unless an invalid option is supplied. -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.3.2 The Shopt Builtin

- -

- -This builtin allows you to change additional shell optional behavior. -

- -

- -
shopt -
-
 
shopt [-pqsu] [-o] [optname ...]
-
Toggle the values of variables controlling optional shell behavior. -With no options, or with the `-p' option, a list of all settable -options is displayed, with an indication of whether or not each is set. -The `-p' option causes output to be displayed in a form that -may be reused as input. -Other options have the following meanings: -

- -

-
-s -
Enable (set) each optname. -

- -

-u -
Disable (unset) each optname. -

- -

-q -
Suppresses normal output; the return status -indicates whether the optname is set or unset. -If multiple optname arguments are given with `-q', -the return status is zero if all optnames are enabled; -non-zero otherwise. -

- -

-o -
Restricts the values of -optname to be those defined for the `-o' option to the -set builtin (see section 4.3.1 The Set Builtin). -
-

- -If either `-s' or `-u' -is used with no optname arguments, the display is limited to -those options which are set or unset, respectively. -

- -Unless otherwise noted, the shopt options are disabled (off) -by default. -

- -The return status when listing options is zero if all optnames -are enabled, non-zero otherwise. When setting or unsetting options, -the return status is zero unless an optname is not a valid shell -option. -

- -The list of shopt options is: -

- -
autocd -
If set, a command name that is the name of a directory is executed as if -it were the argument to the cd command. -This option is only used by interactive shells. -

- -

cdable_vars -
If this is set, an argument to the 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. -

- -

cdspell -
If set, minor errors in the spelling of a directory component in a -cd command will be corrected. -The errors checked for are transposed characters, -a missing character, and a character too many. -If a correction is found, the corrected path is printed, -and the command proceeds. -This option is only used by interactive shells. -

- -

checkhash -
If this is set, Bash 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. -

- -

checkjobs -
If set, Bash lists the status of any stopped and running jobs before -exiting an interactive shell. If any jobs are running, this causes -the exit to be deferred until a second exit is attempted without an -intervening command (see section 7. Job Control). -The shell always postpones exiting if any jobs are stopped. -

- -

checkwinsize -
If set, Bash checks the window size after each command -and, if necessary, updates the values of -LINES and COLUMNS. -

- -

cmdhist -
If set, 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. -

- -

dotglob -
If set, Bash includes filenames beginning with a `.' in -the results of filename expansion. -

- -

execfail -
If this is set, a non-interactive shell will not exit if -it cannot execute the file specified as an argument to the exec -builtin command. An interactive shell does not exit if exec -fails. -

- -

expand_aliases -
If set, aliases are expanded as described below under Aliases, -6.6 Aliases. -This option is enabled by default for interactive shells. -

- -

extdebug -
If set, behavior intended for use by debuggers is enabled: -

- -

    -
  1. -The `-F' option to the declare builtin (see section 4.2 Bash Builtin Commands) -displays the source file name and line number corresponding to each function -name supplied as an argument. -

    - -

  2. -If the command run by the DEBUG trap returns a non-zero value, the -next command is skipped and not executed. -

    - -

  3. -If the command run by the DEBUG trap returns a value of 2, and the -shell is executing in a subroutine (a shell function or a shell script -executed by the . or source builtins), a call to -return is simulated. -

    - -

  4. -BASH_ARGC and BASH_ARGV are updated as described in their -descriptions (see section 5.2 Bash Variables). -

    - -

  5. -Function tracing is enabled: command substitution, shell functions, and -subshells invoked with ( command ) inherit the -DEBUG and RETURN traps. -

    - -

  6. -Error tracing is enabled: command substitution, shell functions, and -subshells invoked with ( command ) inherit the -ERROR trap. -
-

- -

extglob -
If set, the extended pattern matching features described above -(see section 3.5.8.1 Pattern Matching) are enabled. -

- -

extquote -
If set, $'string' and $"string" quoting is -performed within ${parameter} expansions -enclosed in double quotes. This option is enabled by default. -

- -

failglob -
If set, patterns which fail to match filenames during pathname expansion -result in an expansion error. -

- -

force_fignore -
If set, the suffixes specified by the FIGNORE shell variable -cause words to be ignored when performing word completion even if -the ignored words are the only possible completions. -See section 5.2 Bash Variables, for a description of FIGNORE. -This option is enabled by default. -

- -

gnu_errfmt -
If set, shell error messages are written in the standard GNU error -message format. -

- -

histappend -
If set, the history list is appended to the file named by the value -of the HISTFILE -variable when the shell exits, rather than overwriting the file. -

- -

histreedit -
If set, and Readline -is being used, a user is given the opportunity to re-edit a -failed history substitution. -

- -

histverify -
If set, and 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 Readline editing buffer, allowing further modification. -

- -

hostcomplete -
If set, and Readline is being used, Bash will attempt to perform -hostname completion when a word containing a `@' is being -completed (see section 8.4.6 Letting Readline Type For You). This option is enabled -by default. -

- -

huponexit -
If set, Bash will send SIGHUP to all jobs when an interactive -login shell exits (see section 3.7.6 Signals). -

- -

interactive_comments -
Allow a word beginning with `#' -to cause that word and all remaining characters on that -line to be ignored in an interactive shell. -This option is enabled by default. -

- -

lithist -
If enabled, and the cmdhist -option is enabled, multi-line commands are saved to the history with -embedded newlines rather than using semicolon separators where possible. -

- -

login_shell -
The shell sets this option if it is started as a login shell -(see section 6.1 Invoking Bash). -The value may not be changed. -

- -

mailwarn -
If set, and a file that Bash is checking for mail has been -accessed since the last time it was checked, the message -"The mail in mailfile has been read" is displayed. -

- -

no_empty_cmd_completion -
If set, and Readline is being used, Bash will not attempt to search -the PATH for possible completions when completion is attempted -on an empty line. -

- -

nocaseglob -
If set, Bash matches filenames in a case-insensitive fashion when -performing filename expansion. -

- -

nocasematch -
If set, Bash matches patterns in a case-insensitive fashion when -performing matching while executing case or [[ -conditional commands. -

- -

nullglob -
If set, Bash allows filename patterns which match no -files to expand to a null string, rather than themselves. -

- -

progcomp -
If set, the programmable completion facilities -(see section 8.6 Programmable Completion) are enabled. -This option is enabled by default. -

- -

promptvars -
If set, prompt strings undergo -parameter expansion, command substitution, arithmetic -expansion, and quote removal after being expanded -as described below (see section 6.9 Controlling the Prompt). -This option is enabled by default. -

- -

restricted_shell -
The shell sets this option if it is started in restricted mode -(see section 6.10 The Restricted Shell). -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. -

- -

shift_verbose -
If this is set, the shift -builtin prints an error message when the shift count exceeds the -number of positional parameters. -

- -

sourcepath -
If set, the source builtin uses the value of PATH -to find the directory containing the file supplied as an argument. -This option is enabled by default. -

- -

xpg_echo -
If set, the echo builtin expands backslash-escape sequences -by default. -

- -

-

- -The return status when listing options is zero if all optnames -are enabled, non-zero otherwise. -When setting or unsetting options, the return status is zero unless an -optname is not a valid shell option. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

4.4 Special Builtins

- -

- -For historical reasons, the POSIX standard has classified -several builtin commands as special. -When Bash is executing in POSIX mode, the special builtins -differ from other builtin commands in three respects: -

- -

    -
  1. -Special builtins are found before shell functions during command lookup. -

    - -

  2. -If a special builtin returns an error status, a non-interactive shell exits. -

    - -

  3. -Assignment statements preceding the command stay in effect in the shell -environment after the command completes. -
-

- -When Bash is not executing in POSIX mode, these builtins behave no -differently than the rest of the Bash builtin commands. -The Bash POSIX mode is described in 6.11 Bash POSIX Mode. -

- -These are the POSIX special builtins: -
 
break : . continue eval exec exit export readonly return set
-shift trap unset
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5. Shell Variables

- -

- -

- - -
5.1 Bourne Shell Variables  Variables which Bash uses in the same way - as the Bourne Shell.
5.2 Bash Variables  List of variables that exist in Bash.
-

- -This chapter describes the shell variables that Bash uses. -Bash automatically assigns default values to a number of variables. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5.1 Bourne Shell Variables

- -

- -Bash uses certain shell variables in the same way as the Bourne shell. -In some cases, Bash assigns a default value to the variable. -

- -

- - -
CDPATH -
-A colon-separated list of directories used as a search path for -the cd builtin command. -

- - -

HOME -
-The current user's home directory; the default for the cd builtin -command. -The value of this variable is also used by tilde expansion -(see section 3.5.2 Tilde Expansion). -

- - -

IFS -
-A list of characters that separate fields; used when the shell splits -words as part of expansion. -

- - -

MAIL -
-If this parameter is set to a filename and the MAILPATH variable -is not set, Bash informs the user of the arrival of mail in -the specified file. -

- - -

MAILPATH -
-A colon-separated list of filenames which the shell periodically checks -for new mail. -Each list entry can specify the message that is printed when new mail -arrives in the mail file by separating the file name from the message with -a `?'. -When used in the text of the message, $_ expands to the name of -the current mail file. -

- - -

OPTARG -
-The value of the last option argument processed by the getopts builtin. -

- - -

OPTIND -
-The index of the last option argument processed by the getopts builtin. -

- - -

PATH -
-A colon-separated list of directories in which the shell looks for -commands. -A zero-length (null) directory name in the value of PATH indicates the -current directory. -A null directory name may appear as two adjacent colons, or as an initial -or trailing colon. -

- - -

PS1 -
-The primary prompt string. The default value is `\s-\v\$ '. -See section 6.9 Controlling the Prompt, for the complete list of escape -sequences that are expanded before PS1 is displayed. -

- - -

PS2 -
-The secondary prompt string. The default value is `> '. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

5.2 Bash Variables

- -

- -These variables are set or used by Bash, but other shells -do not normally treat them specially. -

- -A few variables used by Bash are described in different chapters: -variables for controlling the job control facilities -(see section 7.3 Job Control Variables). -

- -

- - -
BASH -
-The full pathname used to execute the current instance of Bash. -

- - -

BASHPID -
-Expands to the process id of the current Bash process. -This differs from $$ under certain circumstances, such as subshells -that do not require Bash to be re-initialized. -

- - -

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 . or source) is at the top of the stack. When a -subroutine is executed, the number of parameters passed is pushed onto -BASH_ARGC. -The shell sets BASH_ARGC only when in extended debugging mode -(see 4.3.2 The Shopt Builtin -for a description of the extdebug option to the shopt -builtin). -

- - -

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 BASH_ARGV. -The shell sets BASH_ARGV only when in extended debugging mode -(see 4.3.2 The Shopt Builtin -for a description of the extdebug option to the shopt -builtin). -

- - -

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. -

- - -

BASH_ENV -
-If this variable is set when Bash is invoked to execute a shell -script, its value is expanded and used as the name of a startup file -to read before executing the script. See section 6.2 Bash Startup Files. -

- - -

BASH_EXECUTION_STRING -
-The command argument to the `-c' invocation option. -

- - -

BASH_LINENO -
-An array variable whose members are the line numbers in source files -corresponding to each member of FUNCNAME. -${BASH_LINENO[$i]} is the line number in the source file where -${FUNCNAME[$i]} was called. -The corresponding source file name is ${BASH_SOURCE[$i]}. -Use LINENO to obtain the current line number. -

- - -

BASH_REMATCH -
-An array variable whose members are assigned by the `=~' binary -operator to the [[ conditional command -(see section 3.2.4.2 Conditional Constructs). -The element with index 0 is the portion of the string -matching the entire regular expression. -The element with index n is the portion of the -string matching the nth parenthesized subexpression. -This variable is read-only. -

- - -

BASH_SOURCE -
-An array variable whose members are the source filenames corresponding -to the elements in the FUNCNAME array variable. -

- - -

BASH_SUBSHELL -
-Incremented by one each time a subshell or subshell environment is spawned. -The initial value is 0. -

- - -

BASH_VERSINFO -
-A readonly array variable (see section 6.7 Arrays) -whose members hold version information for this instance of Bash. -The values assigned to the array members are as follows: -

- -

- -
BASH_VERSINFO[0] -
The major version number (the release). -

- -

BASH_VERSINFO[1] -
The minor version number (the version). -

- -

BASH_VERSINFO[2] -
The patch level. -

- -

BASH_VERSINFO[3] -
The build version. -

- -

BASH_VERSINFO[4] -
The release status (e.g., beta1). -

- -

BASH_VERSINFO[5] -
The value of MACHTYPE. -

- -

-

- - -

BASH_VERSION -
-The version number of the current instance of Bash. -

- - -

COLUMNS -
-Used by the select builtin command to determine the terminal width -when printing selection lists. Automatically set upon receipt of a -SIGWINCH. -

- - -

COMP_CWORD -
-An index into ${COMP_WORDS} of the word containing the current -cursor position. -This variable is available only in shell functions invoked by the -programmable completion facilities (see section 8.6 Programmable Completion). -

- - -

COMP_LINE -
-The current command line. -This variable is available only in shell functions and external -commands invoked by the -programmable completion facilities (see section 8.6 Programmable Completion). -

- - -

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 ${#COMP_LINE}. -This variable is available only in shell functions and external -commands invoked by the -programmable completion facilities (see section 8.6 Programmable Completion). -

- - -

COMP_TYPE -
-Set to an integer value corresponding to the type of completion attempted -that caused a completion function to be called: -TAB, for normal completion, -`?', for listing completions after successive tabs, -`!', for listing alternatives on partial word completion, -`@', to list completions if the word is not unmodified, -or -`%', for menu completion. -This variable is available only in shell functions and external -commands invoked by the -programmable completion facilities (see section 8.6 Programmable Completion). -

- - -

COMP_KEY -
-The key (or final key of a key sequence) used to invoke the current -completion function. -

- - -

COMP_WORDBREAKS -
-The set of characters that the Readline library treats as word -separators when performing word completion. -If COMP_WORDBREAKS is unset, it loses its special properties, -even if it is subsequently reset. -

- - -

COMP_WORDS -
-An array variable consisting of the individual -words in the current command line. -The words are split on shell metacharacters as the shell parser would -separate them. -This variable is available only in shell functions invoked by the -programmable completion facilities (see section 8.6 Programmable Completion). -

- - -

COMPREPLY -
-An array variable from which Bash reads the possible completions -generated by a shell function invoked by the programmable completion -facility (see section 8.6 Programmable Completion). -

- - -

DIRSTACK -
-An array variable containing the current contents of the directory stack. -Directories appear in the stack in the order they are displayed by the -dirs builtin. -Assigning to members of this array variable may be used to modify -directories already in the stack, but the pushd and popd -builtins must be used to add and remove directories. -Assignment to this variable will not change the current directory. -If DIRSTACK is unset, it loses its special properties, even if -it is subsequently reset. -

- - -

EMACS -
-If Bash finds this variable in the environment when the shell -starts with value `t', it assumes that the shell is running in an -emacs shell buffer and disables line editing. -

- - -

EUID -
-The numeric effective user id of the current user. This variable -is readonly. -

- - -

FCEDIT -
-The editor used as a default by the `-e' option to the fc -builtin command. -

- - -

FIGNORE -
-A colon-separated list of suffixes to ignore when performing -filename completion. -A file name whose suffix matches one of the entries in -FIGNORE -is excluded from the list of matched file names. A sample -value is `.o:~' -

- - -

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 FUNCNAME have no effect and return an error status. -If FUNCNAME is unset, it loses its special properties, even if -it is subsequently reset. -

- - -

GLOBIGNORE -
-A colon-separated list of patterns defining the set of filenames to -be ignored by filename expansion. -If a filename matched by a filename expansion pattern also matches one -of the patterns in GLOBIGNORE, it is removed from the list -of matches. -

- - -

GROUPS -
-An array variable containing the list of groups of which the current -user is a member. -Assignments to GROUPS have no effect and return an error status. -If GROUPS is unset, it loses its special properties, even if it is -subsequently reset. -

- - -

histchars -
-Up to three characters which control history expansion, quick -substitution, and tokenization (see section 9.3 History Expansion). -The first character is the -history expansion character, that is, the character which signifies the -start of a history expansion, normally `!'. The second character is the -character which signifies `quick substitution' when seen as the first -character on a line, normally `^'. 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, usually `#'. 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. -

- - -

HISTCMD -
-The history number, or index in the history list, of the current -command. If HISTCMD is unset, it loses its special properties, -even if it is subsequently reset. -

- - -

HISTCONTROL -
-A colon-separated list of values controlling how commands are saved on -the history list. -If the list of values includes `ignorespace', lines which begin -with a space character are not saved in the history list. -A value of `ignoredups' causes lines which match the previous -history entry to not be saved. -A value of `ignoreboth' is shorthand for -`ignorespace' and `ignoredups'. -A value of `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 HISTCONTROL 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 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 -HISTCONTROL. -

- - -

HISTFILE -
-The name of the file to which the command history is saved. The -default value is `~/.bash_history'. -

- - -

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, by removing the oldest entries, -to contain no more than that number of lines. -The history file is also truncated to this size after -writing it when an interactive shell exits. -The default value is 500. -

- - -

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 `*' is appended). Each pattern is tested -against the line after the checks specified by HISTCONTROL -are applied. In addition to the normal shell pattern matching -characters, `&' matches the previous history line. `&' -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 -HISTIGNORE. -

- -HISTIGNORE subsumes the function of HISTCONTROL. A -pattern of `&' is identical to ignoredups, and a -pattern of `[ ]*' is identical to ignorespace. -Combining these two patterns, separating them with a colon, -provides the functionality of ignoreboth. -

- - -

HISTSIZE -
-The maximum number of commands to remember on the history list. -The default value is 500. -

- - -

HISTTIMEFORMAT -
-If this variable is set and not null, its value is used as a format string -for strftime to print the time stamp associated with each history -entry displayed by the history builtin. -If this variable is set, time stamps are written to the history file so -they may be preserved across shell sessions. -

- - -

HOSTFILE -
-Contains the name of a file in the same format as `/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, Bash adds the contents of the new file to the -existing list. -If HOSTFILE is set, but has no value, Bash attempts to read -`/etc/hosts' to obtain the list of possible hostname completions. -When HOSTFILE is unset, the hostname list is cleared. -

- - -

HOSTNAME -
-The name of the current host. -

- - -

HOSTTYPE -
-A string describing the machine Bash is running on. -

- - -

IGNOREEOF -
-Controls the action of the shell on receipt of an EOF character -as the sole input. If set, the value denotes the number -of consecutive EOF characters that can be read as the -first character on an input line -before the shell will exit. If the variable exists but does not -have a numeric value (or has no value) then the default is 10. -If the variable does not exist, then EOF signifies the end of -input to the shell. This is only in effect for interactive shells. -

- - -

INPUTRC -
-The name of the Readline initialization file, overriding the default -of `~/.inputrc'. -

- - -

LANG -
-Used to determine the locale category for any category not specifically -selected with a variable starting with LC_. -

- - -

LC_ALL -
-This variable overrides the value of LANG and any other -LC_ variable specifying a locale category. -

- - -

LC_COLLATE -
-This variable determines the collation order used when sorting the -results of filename expansion, and -determines the behavior of range expressions, equivalence classes, -and collating sequences within filename expansion and pattern matching -(see section 3.5.8 Filename Expansion). -

- - -

LC_CTYPE -
-This variable determines the interpretation of characters and the -behavior of character classes within filename expansion and pattern -matching (see section 3.5.8 Filename Expansion). -

- - -

LC_MESSAGES -
-This variable determines the locale used to translate double-quoted -strings preceded by a `$' (see section 3.1.2.5 Locale-Specific Translation). -

- - -

LC_NUMERIC -
-This variable determines the locale category used for number formatting. -

- - -

LINENO -
-The line number in the script or shell function currently executing. -

- - -

LINES -
-Used by the select builtin command to determine the column length -for printing selection lists. Automatically set upon receipt of a -SIGWINCH. -

- - -

MACHTYPE -
-A string that fully describes the system type on which Bash -is executing, in the standard GNU cpu-company-system format. -

- - -

MAILCHECK -
-How often (in seconds) that the shell should check for mail in the -files specified in the MAILPATH or MAIL variables. -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. -

- - -

OLDPWD -
-The previous working directory as set by the cd builtin. -

- - -

OPTERR -
-If set to the value 1, Bash displays error messages -generated by the getopts builtin command. -

- - -

OSTYPE -
-A string describing the operating system Bash is running on. -

- - -

PIPESTATUS -
-An array variable (see section 6.7 Arrays) -containing a list of exit status values from the processes -in the most-recently-executed foreground pipeline (which may -contain only a single command). -

- - -

POSIXLY_CORRECT -
-If this variable is in the environment when bash starts, the shell -enters POSIX mode (see section 6.11 Bash POSIX Mode) before reading the -startup files, as if the `--posix' invocation option had been supplied. -If it is set while the shell is running, bash enables POSIX mode, -as if the command -
 
set -o posix
-
had been executed. -

- - -

PPID -
-The process ID of the shell's parent process. This variable -is readonly. -

- - -

PROMPT_COMMAND -
-If set, the value is interpreted as a command to execute -before the printing of each primary prompt ($PS1). -

- - -

PS3 -
-The value of this variable is used as the prompt for the -select command. If this variable is not set, the -select command prompts with `#? ' -

- - -

PS4 -
-The value is the prompt printed before the command line is echoed -when the `-x' option is set (see section 4.3.1 The Set Builtin). -The first character of PS4 is replicated multiple times, as -necessary, to indicate multiple levels of indirection. -The default is `+ '. -

- - -

PWD -
-The current working directory as set by the cd builtin. -

- - -

RANDOM -
-Each time this parameter is referenced, a random integer -between 0 and 32767 is generated. Assigning a value to this -variable seeds the random number generator. -

- - -

REPLY -
-The default variable for the read builtin. -

- - -

SECONDS -
-This variable expands to the number of seconds since the -shell was started. Assignment to this variable resets -the count to the value assigned, and the expanded value -becomes the value assigned plus the number of seconds -since the assignment. -

- - -

SHELL -
-The full pathname to the shell is kept in this environment variable. -If it is not set when the shell starts, -Bash assigns to it the full pathname of the current user's login shell. -

- - -

SHELLOPTS -
-A colon-separated list of enabled shell options. Each word in -the list is a valid argument for the `-o' option to the -set builtin command (see section 4.3.1 The Set Builtin). -The options appearing in SHELLOPTS are those reported -as `on' by `set -o'. -If this variable is in the environment when Bash -starts up, each shell option in the list will be enabled before -reading any startup files. This variable is readonly. -

- - -

SHLVL -
-Incremented by one each time a new instance of Bash is started. This is -intended to be a count of how deeply your Bash shells are nested. -

- - -

TIMEFORMAT -
-The value of this parameter is used as a format string specifying -how the timing information for pipelines prefixed with the time -reserved word should be displayed. -The `%' 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. -

- -

- -
%% -
A literal `%'. -

- -

%[p][l]R -
The elapsed time in seconds. -

- -

%[p][l]U -
The number of CPU seconds spent in user mode. -

- -

%[p][l]S -
The number of CPU seconds spent in system mode. -

- -

%P -
The CPU percentage, computed as (%U + %S) / %R. -
-

- -The optional p is a digit specifying the precision, 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 p greater than 3 are changed to 3. -If p is not specified, the value 3 is used. -

- -The optional l specifies a longer format, including minutes, of -the form MMmSS.FFs. -The value of p determines whether or not the fraction is included. -

- -If this variable is not set, Bash acts as if it had the value -
 
$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
-
If the value is null, no timing information is displayed. -A trailing newline is added when the format string is displayed. -

- - -

TMOUT -
-If set to a value greater than zero, TMOUT is treated as the -default timeout for the read builtin (see section 4.2 Bash Builtin Commands). -The select command (see section 3.2.4.2 Conditional Constructs) terminates -if input does not arrive after TMOUT 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 when the shell is interactive. -Bash terminates after that number of seconds if input does -not arrive. -

- - -

TMPDIR -
-If set, Bash uses its value as the name of a directory in which -Bash creates temporary files for the shell's use. -

- - -

UID -
-The numeric real user id of the current user. This variable is readonly. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6. Bash Features

- -

- -This section describes features unique to Bash. -

- -

- - - - - - - - - - - -
6.1 Invoking Bash  Command line options that you can give - to Bash.
6.2 Bash Startup Files  When and how Bash executes scripts.
6.3 Interactive Shells  What an interactive shell is.
6.4 Bash Conditional Expressions  Primitives used in composing expressions for - the test builtin.
6.5 Shell Arithmetic  Arithmetic on shell variables.
6.6 Aliases  Substituting one command for another.
6.7 Arrays  Array Variables.
6.8 The Directory Stack  History of visited directories.
6.9 Controlling the Prompt  Controlling the PS1 string.
6.10 The Restricted Shell  A more controlled mode of shell execution.
6.11 Bash POSIX Mode  Making Bash behave more closely to what - the POSIX standard specifies.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.1 Invoking Bash

- -

- -
 
bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] [argument ...]
-bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] -c string [argument ...]
-bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] [argument ...]
-

- -In addition to the single-character shell command-line options -(see section 4.3.1 The Set Builtin), there are several multi-character -options that you can use. These options must appear on the command -line before the single-character options to be recognized. -

- -

-
--debugger -
Arrange for the debugger profile to be executed before the shell -starts. Turns on extended debugging mode (see 4.3.2 The Shopt Builtin -for a description of the extdebug option to the shopt -builtin) and shell function tracing -(see 4.3.1 The Set Builtin for a description of the -o functrace -option). -

- -

--dump-po-strings -
A list of all double-quoted strings preceded by `$' -is printed on the standard output -in the GNU gettext PO (portable object) file format. -Equivalent to `-D' except for the output format. -

- -

--dump-strings -
Equivalent to `-D'. -

- -

--help -
Display a usage message on standard output and exit successfully. -

- -

--init-file filename -
--rcfile filename -
Execute commands from filename (instead of `~/.bashrc') -in an interactive shell. -

- -

--login -
Equivalent to `-l'. -

- -

--noediting -
Do not use the GNU Readline library (see section 8. Command Line Editing) -to read command lines when the shell is interactive. -

- -

--noprofile -
Don't load the system-wide startup file `/etc/profile' -or any of the personal initialization files -`~/.bash_profile', `~/.bash_login', or `~/.profile' -when Bash is invoked as a login shell. -

- -

--norc -
Don't read the `~/.bashrc' initialization file in an -interactive shell. This is on by default if the shell is -invoked as sh. -

- -

--posix -
Change the behavior of Bash where the default operation differs -from the POSIX standard to match the standard. This -is intended to make Bash behave as a strict superset of that -standard. See section 6.11 Bash POSIX Mode, for a description of the Bash -POSIX mode. -

- -

--restricted -
Make the shell a restricted shell (see section 6.10 The Restricted Shell). -

- -

--verbose -
Equivalent to `-v'. Print shell input lines as they're read. -

- -

--version -
Show version information for this instance of -Bash on the standard output and exit successfully. -

- -

-

- -There are several single-character options that may be supplied at -invocation which are not available with the set builtin. -

- -

-
-c string -
Read and execute commands from string after processing the -options, then exit. Any remaining arguments are assigned to the -positional parameters, starting with $0. -

- -

-i -
Force the shell to run interactively. Interactive shells are -described in 6.3 Interactive Shells. -

- -

-l -
Make this shell act as if it had been directly invoked by login. -When the shell is interactive, this is equivalent to starting a -login shell with `exec -l bash'. -When the shell is not interactive, the login shell startup files will -be executed. -`exec bash -l' or `exec bash --login' -will replace the current shell with a Bash login shell. -See section 6.2 Bash Startup Files, for a description of the special behavior -of a login shell. -

- -

-r -
Make the shell a restricted shell (see section 6.10 The Restricted Shell). -

- -

-s -
If this 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. -

- -

-D -
A list of all double-quoted strings preceded by `$' -is printed on the standard output. -These are the strings that -are subject to language translation when the current locale -is not C or POSIX (see section 3.1.2.5 Locale-Specific Translation). -This implies the `-n' option; no commands will be executed. -

- -

[-+]O [shopt_option] -
shopt_option is one of the shell options accepted by the -shopt builtin (see section 4.3.2 The Shopt Builtin). -If shopt_option is present, `-O' sets the value of that option; -`+O' unsets it. -If shopt_option is not supplied, the names and values of the shell -options accepted by shopt are printed on the standard output. -If the invocation option is `+O', the output is displayed in a format -that may be reused as input. -

- -

-- -
A -- signals the end of options and disables further option -processing. -Any arguments after the -- are treated as filenames and arguments. -

- -

-

- - -A login shell is one whose first character of argument zero is -`-', or one invoked with the `--login' option. -

- - -An interactive shell is one started without non-option arguments, -unless `-s' is specified, -without specifying the `-c' option, and whose input and output are both -connected to terminals (as determined by isatty(3)), or one -started with the `-i' option. See section 6.3 Interactive Shells, for more -information. -

- -If arguments remain after option processing, and neither the -`-c' nor the `-s' -option has been supplied, the first argument is assumed to -be the name of a file containing shell commands (see section 3.8 Shell Scripts). -When Bash is invoked in this fashion, $0 -is set to the name of the file, and the positional parameters -are set to the remaining arguments. -Bash reads and executes commands from this file, then exits. -Bash'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. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.2 Bash Startup Files

- -

- -This section describes how Bash executes its startup files. -If any of the files exist but cannot be read, Bash reports an error. -Tildes are expanded in file names as described above under -Tilde Expansion (see section 3.5.2 Tilde Expansion). -

- -Interactive shells are described in 6.3 Interactive Shells. -

- - -

Invoked as an interactive login shell, or with `--login'

- -

- -When Bash is invoked as an interactive login shell, or as a -non-interactive shell with the `--login' option, it first reads and -executes commands from the file `/etc/profile', if that file exists. -After reading that file, it looks for `~/.bash_profile', -`~/.bash_login', and `~/.profile', in that order, and reads -and executes commands from the first one that exists and is readable. -The `--noprofile' option may be used when the shell is started to -inhibit this behavior. -

- -When a login shell exits, Bash reads and executes commands from -the file `~/.bash_logout', if it exists. -

- - -

Invoked as an interactive non-login shell

- -

- -When an interactive shell that is not a login shell is started, Bash -reads and executes commands from `~/.bashrc', if that file exists. -This may be inhibited by using the `--norc' option. -The `--rcfile file' option will force Bash to read and -execute commands from file instead of `~/.bashrc'. -

- -So, typically, your `~/.bash_profile' contains the line -
 
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
-
after (or before) any login-specific initializations. -

- - -

Invoked non-interactively

- -

- -When Bash is started non-interactively, to run a shell script, -for example, it looks for the variable 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. Bash behaves as if the -following command were executed: -
 
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
-
but the value of the PATH variable is not used to search for the -file name. -

- -As noted above, if a non-interactive shell is invoked with the -`--login' option, Bash attempts to read and execute commands from the -login shell startup files. -

- - -

Invoked with name sh

- -

- -If Bash is invoked with the name sh, it tries to mimic the -startup behavior of historical versions of sh as closely as -possible, while conforming to the POSIX standard as well. -

- -When invoked as an interactive login shell, or as a non-interactive -shell with the `--login' option, it first attempts to read -and execute commands from `/etc/profile' and `~/.profile', in -that order. -The `--noprofile' option may be used to inhibit this behavior. -When invoked as an interactive shell with the name sh, Bash -looks for the variable 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 sh does not attempt to read and execute -commands from any other startup files, the `--rcfile' option has -no effect. -A non-interactive shell invoked with the name sh does not attempt -to read any other startup files. -

- -When invoked as sh, Bash enters POSIX mode after -the startup files are read. -

- - -

Invoked in POSIX mode

- -

- -When Bash is started in POSIX mode, as with the -`--posix' command line option, it follows the POSIX standard -for startup files. -In this mode, interactive shells expand the ENV variable -and commands are read and executed from the file whose name is the -expanded value. -No other startup files are read. -

- - -

Invoked by remote shell daemon

- -

- -Bash attempts to determine when it is being run by the remote shell -daemon, usually rshd. If Bash determines it is being run by -rshd, it reads and executes commands from `~/.bashrc', if that -file exists and is readable. -It will not do this if invoked as sh. -The `--norc' option may be used to inhibit this behavior, and the -`--rcfile' option may be used to force another file to be read, but -rshd does not generally invoke the shell with those options or -allow them to be specified. -

- - -

Invoked with unequal effective and real UID/GIDs

- -

- -If Bash is started with the effective user (group) id not equal to the -real user (group) id, and the -p option is not supplied, no startup -files are read, shell functions are not inherited from the environment, -the SHELLOPTS variable, if it appears in the environment, is ignored, -and the effective user id is set to the real user id. -If the -p option is supplied at invocation, the startup behavior is -the same, but the effective user id is not reset. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.3 Interactive Shells

- -

- -

- - - -
6.3.1 What is an Interactive Shell?  What determines whether a shell is Interactive.
6.3.2 Is this Shell Interactive?  How to tell if a shell is interactive.
6.3.3 Interactive Shell Behavior  What changes in a interactive shell?
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.3.1 What is an Interactive Shell?

- -

- -An interactive shell -is one started without non-option arguments, unless `-s' is -specified, without specifying the `-c' option, and -whose input and error output are both -connected to terminals (as determined by isatty(3)), -or one started with the `-i' option. -

- -An interactive shell generally reads from and writes to a user's -terminal. -

- -The `-s' invocation option may be used to set the positional parameters -when an interactive shell is started. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.3.2 Is this Shell Interactive?

- -

- -To determine within a startup script whether or not Bash is -running interactively, -test the value of the `-' special parameter. -It contains i when the shell is interactive. For example: -

- -
 
case "$-" in
-*i*)	echo This shell is interactive ;;
-*)	echo This shell is not interactive ;;
-esac
-

- -Alternatively, startup scripts may examine the variable -PS1; it is unset in non-interactive shells, and set in -interactive shells. Thus: -

- -
 
if [ -z "$PS1" ]; then
-        echo This shell is not interactive
-else
-        echo This shell is interactive
-fi
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.3.3 Interactive Shell Behavior

- -

- -When the shell is running interactively, it changes its behavior in -several ways. -

- -

    -
  1. -Startup files are read and executed as described in 6.2 Bash Startup Files. -

    - -

  2. -Job Control (see section 7. Job Control) is enabled by default. When job -control is in effect, Bash ignores the keyboard-generated job control -signals SIGTTIN, SIGTTOU, and SIGTSTP. -

    - -

  3. -Bash expands and displays PS1 before reading the first line -of a command, and expands and displays PS2 before reading the -second and subsequent lines of a multi-line command. -

    - -

  4. -Bash executes the value of the PROMPT_COMMAND variable as a command -before printing the primary prompt, $PS1 -(see section 5.2 Bash Variables). -

    - -

  5. -Readline (see section 8. Command Line Editing) is used to read commands from -the user's terminal. -

    - -

  6. -Bash inspects the value of the ignoreeof option to set -o -instead of exiting immediately when it receives an EOF on its -standard input when reading a command (see section 4.3.1 The Set Builtin). -

    - -

  7. -Command history (see section 9.1 Bash History Facilities) -and history expansion (see section 9.3 History Expansion) -are enabled by default. -Bash will save the command history to the file named by $HISTFILE -when an interactive shell exits. -

    - -

  8. -Alias expansion (see section 6.6 Aliases) is performed by default. -

    - -

  9. -In the absence of any traps, Bash ignores SIGTERM -(see section 3.7.6 Signals). -

    - -

  10. -In the absence of any traps, SIGINT is caught and handled -((see section 3.7.6 Signals). -SIGINT will interrupt some shell builtins. -

    - -

  11. -An interactive login shell sends a SIGHUP to all jobs on exit -if the huponexit shell option has been enabled (see section 3.7.6 Signals). -

    - -

  12. -The `-n' invocation option is ignored, and `set -n' has -no effect (see section 4.3.1 The Set Builtin). -

    - -

  13. -Bash will check for mail periodically, depending on the values of the -MAIL, MAILPATH, and MAILCHECK shell variables -(see section 5.2 Bash Variables). -

    - -

  14. -Expansion errors due to references to unbound shell variables after -`set -u' has been enabled will not cause the shell to exit -(see section 4.3.1 The Set Builtin). -

    - -

  15. -The shell will not exit on expansion errors caused by var being unset -or null in ${var:?word} expansions -(see section 3.5.3 Shell Parameter Expansion). -

    - -

  16. -Redirection errors encountered by shell builtins will not cause the -shell to exit. -

    - -

  17. -When running in POSIX mode, a special builtin returning an error -status will not cause the shell to exit (see section 6.11 Bash POSIX Mode). -

    - -

  18. -A failed exec will not cause the shell to exit -(see section 4.1 Bourne Shell Builtins). -

    - -

  19. -Parser syntax errors will not cause the shell to exit. -

    - -

  20. -Simple spelling correction for directory arguments to the cd -builtin is enabled by default (see the description of the cdspell -option to the shopt builtin in 4.3.2 The Shopt Builtin). -

    - -

  21. -The shell will check the value of the TMOUT variable and exit -if a command is not read within the specified number of seconds after -printing $PS1 (see section 5.2 Bash Variables). -

    - -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.4 Bash Conditional Expressions

- -

- -Conditional expressions are used by the [[ compound command -and the test and [ builtin commands. -

- -Expressions may be unary or binary. -Unary expressions are often used to examine the status of a file. -There are string operators and numeric comparison operators as well. -If the file argument to one of the primaries is of the form -`/dev/fd/N', then file descriptor N is checked. -If the file argument to one of the primaries is one of -`/dev/stdin', `/dev/stdout', or `/dev/stderr', file -descriptor 0, 1, or 2, respectively, is checked. -

- -Unless otherwise specified, primaries that operate on files follow symbolic -links and operate on the target of the link, rather than the link itself. -

- -

-
-a file -
True if file exists. -

- -

-b file -
True if file exists and is a block special file. -

- -

-c file -
True if file exists and is a character special file. -

- -

-d file -
True if file exists and is a directory. -

- -

-e file -
True if file exists. -

- -

-f file -
True if file exists and is a regular file. -

- -

-g file -
True if file exists and its set-group-id bit is set. -

- -

-h file -
True if file exists and is a symbolic link. -

- -

-k file -
True if file exists and its "sticky" bit is set. -

- -

-p file -
True if file exists and is a named pipe (FIFO). -

- -

-r file -
True if file exists and is readable. -

- -

-s file -
True if file exists and has a size greater than zero. -

- -

-t fd -
True if file descriptor fd is open and refers to a terminal. -

- -

-u file -
True if file exists and its set-user-id bit is set. -

- -

-w file -
True if file exists and is writable. -

- -

-x file -
True if file exists and is executable. -

- -

-O file -
True if file exists and is owned by the effective user id. -

- -

-G file -
True if file exists and is owned by the effective group id. -

- -

-L file -
True if file exists and is a symbolic link. -

- -

-S file -
True if file exists and is a socket. -

- -

-N file -
True if file exists and has been modified since it was last read. -

- -

file1 -nt file2 -
True if file1 is newer (according to modification date) -than file2, or if file1 exists and file2 does not. -

- -

file1 -ot file2 -
True if file1 is older than file2, -or if file2 exists and file1 does not. -

- -

file1 -ef file2 -
True if file1 and file2 refer to the same device and -inode numbers. -

- -

-o optname -
True if shell option optname is enabled. -The list of options appears in the description of the `-o' -option to the set builtin (see section 4.3.1 The Set Builtin). -

- -

-z string -
True if the length of string is zero. -

- -

-n string -
string -
True if the length of string is non-zero. -

- -

string1 == string2 -
True if the strings are equal. -`=' may be used in place of `==' for strict POSIX compliance. -

- -

string1 != string2 -
True if the strings are not equal. -

- -

string1 < string2 -
True if string1 sorts before string2 lexicographically -in the current locale. -

- -

string1 > string2 -
True if string1 sorts after string2 lexicographically -in the current locale. -

- -

arg1 OP arg2 -
OP is one of -`-eq', `-ne', `-lt', `-le', `-gt', or `-ge'. -These arithmetic binary operators return true if arg1 -is equal to, not equal to, less than, less than or equal to, -greater than, or greater than or equal to arg2, -respectively. Arg1 and arg2 -may be positive or negative integers. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.5 Shell Arithmetic

- -

- -The shell allows arithmetic expressions to be evaluated, as one of -the shell expansions or by the let and the `-i' option -to the declare builtins. -

- -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. -

- -

- -
id++ id-- -
variable post-increment and post-decrement -

- -

++id --id -
variable pre-increment and pre-decrement -

- -

- + -
unary minus and plus -

- -

! ~ -
logical and bitwise negation -

- -

** -
exponentiation -

- -

* / % -
multiplication, division, remainder -

- -

+ - -
addition, subtraction -

- -

<< >> -
left and right bitwise shifts -

- -

<= >= < > -
comparison -

- -

== != -
equality and inequality -

- -

& -
bitwise AND -

- -

^ -
bitwise exclusive OR -

- -

| -
bitwise OR -

- -

&& -
logical AND -

- -

|| -
logical OR -

- -

expr ? expr : expr -
conditional operator -

- -

= *= /= %= += -= <<= >>= &= ^= |= -
assignment -

- -

expr1 , expr2 -
comma -
-

- -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 -integer attribute using `declare -i' 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. -

- -Constants with a leading 0 are interpreted as octal numbers. -A leading `0x' or `0X' denotes hexadecimal. Otherwise, -numbers take the form [base#]n, where base -is a decimal number between 2 and 64 representing the arithmetic -base, and n is a number in that base. If base# 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 base is less than or equal to 36, lowercase and uppercase -letters may be used interchangeably to represent numbers between 10 -and 35. -

- -Operators are evaluated in order of precedence. Sub-expressions in -parentheses are evaluated first and may override the precedence -rules above. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.6 Aliases

- -

- -Aliases 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 alias and unalias builtin commands. -

- -The first word of each simple 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 characters `/', `$', ``', `=' and any of the -shell metacharacters or quoting characters listed above may not appear -in an alias name. -The replacement text may contain any valid -shell input, including shell metacharacters. -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 ls to "ls -F", -for instance, and Bash does not try to recursively expand the -replacement text. If the last character of the alias value is a -space or tab character, then the next command word following the -alias is also checked for alias expansion. -

- -Aliases are created and listed with the alias -command, and removed with the unalias command. -

- -There is no mechanism for using arguments in the replacement text, -as in csh. -If arguments are needed, a shell function should be used -(see section 3.3 Shell Functions). -

- -Aliases are not expanded when the shell is not interactive, -unless the expand_aliases shell option is set using -shopt (see section 4.3.2 The Shopt Builtin). -

- -The rules concerning the definition and use of aliases are -somewhat confusing. 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 alias -in compound commands. -

- -For almost every purpose, shell functions are preferred over aliases. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.7 Arrays

- -

- -Bash provides one-dimensional array variables. Any variable may be used as -an array; the 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 zero-based. -

- -An array is created automatically if any variable is assigned to using -the syntax -
 
name[subscript]=value
-

- -The 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 -
 
declare -a name
-
The syntax -
 
declare -a name[subscript]
-
is also accepted; the subscript is ignored. Attributes may be -specified for an array variable using the declare and -readonly builtins. Each attribute applies to all members of -an array. -

- -Arrays are assigned to using compound assignments of the form -
 
name=(value1 ... valuen)
-
where each -value is of the form [[subscript]=]string. If -the optional subscript is 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 declare -builtin. Individual array elements may be assigned to using the -name[subscript]=value syntax introduced above. -

- -Any element of an array may be referenced using -${name[subscript]}. -The braces are required to avoid -conflicts with the shell's filename expansion operators. If the -subscript is `@' or `*', the word expands to all members -of the array name. These subscripts differ only when the word -appears within double quotes. -If the word is double-quoted, -${name[*]} expands to a single word with -the value of each array member separated by the first character of the -IFS variable, and ${name[@]} expands each element of -name to a separate word. When there are no array members, -${name[@]} expands to nothing. -If the double-quoted expansion occurs within a word, the expansion of -the first parameter is joined with the beginning part of the original -word, and the expansion of the last parameter is joined with the last -part of the original word. -This is analogous to the -expansion of the special parameters `@' and `*'. -${#name[subscript]} expands to the length of -${name[subscript]}. -If subscript is `@' or -`*', the expansion is the number of elements in the array. -Referencing an array variable without a subscript is equivalent to -referencing element zero. -

- -The unset builtin is used to destroy arrays. -unset name[subscript] -destroys the array element at index subscript. -Care must be taken to avoid unwanted side effects caused by filename -generation. -unset name, where name is an array, removes the -entire array. A subscript of `*' or `@' also removes the -entire array. -

- -The declare, local, and readonly -builtins each accept a `-a' -option to specify an array. The read -builtin accepts a `-a' -option to assign a list of words read from the standard input -to an array, and can read values from the standard input into -individual array elements. The set and declare -builtins display array values in a way that allows them to be -reused as input. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.8 The Directory Stack

- -

- -

- -
6.8.1 Directory Stack Builtins  Bash builtin commands to manipulate - the directory stack.
-

- -The directory stack is a list of recently-visited directories. The -pushd builtin adds directories to the stack as it changes -the current directory, and the popd builtin removes specified -directories from the stack and changes the current directory to -the directory removed. The dirs builtin displays the contents -of the directory stack. -

- -The contents of the directory stack are also visible -as the value of the DIRSTACK shell variable. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.8.1 Directory Stack Builtins

- -

- -

- -
dirs -
-
 
dirs [+N | -N] [-clpv]
-
Display the list of currently remembered directories. Directories -are added to the list with the pushd command; the -popd command removes directories from the list. -
-
+N -
Displays the Nth directory (counting from the left of the -list printed by dirs when invoked without options), starting -with zero. -
-N -
Displays the Nth directory (counting from the right of the -list printed by dirs when invoked without options), starting -with zero. -
-c -
Clears the directory stack by deleting all of the elements. -
-l -
Produces a longer listing; the default listing format uses a -tilde to denote the home directory. -
-p -
Causes dirs to print the directory stack with one entry per -line. -
-v -
Causes dirs to print the directory stack with one entry per -line, prefixing each entry with its index in the stack. -
-

- -

popd -
-
 
popd [+N | -N] [-n]
-

- -Remove the top entry from the directory stack, and cd -to the new top directory. -When no arguments are given, popd -removes the top directory from the stack and -performs a cd to the new top directory. The -elements are numbered from 0 starting at the first directory listed with -dirs; i.e., popd is equivalent to popd +0. -

-
+N -
Removes the Nth directory (counting from the left of the -list printed by dirs), starting with zero. -
-N -
Removes the Nth directory (counting from the right of the -list printed by dirs), starting with zero. -
-n -
Suppresses the normal change of directory when removing directories -from the stack, so that only the stack is manipulated. -
-

- - -

pushd -
 
pushd [-n] [+N | -N | dir ]
-

- -Save the current directory on the top of the directory stack -and then cd to dir. -With no arguments, pushd exchanges the top two directories. -

- -

-
-n -
Suppresses the normal change of directory when adding directories -to the stack, so that only the stack is manipulated. -
+N -
Brings the Nth directory (counting from the left of the -list printed by dirs, starting with zero) to the top of -the list by rotating the stack. -
-N -
Brings the Nth directory (counting from the right of the -list printed by dirs, starting with zero) to the top of -the list by rotating the stack. -
dir -
Makes the current working directory be the top of the stack, and then -executes the equivalent of `cd dir'. -cds to dir. -
-

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.9 Controlling the Prompt

- -

- -The value of the variable PROMPT_COMMAND is examined just before -Bash prints each primary prompt. If PROMPT_COMMAND is set and -has a non-null value, then the -value is executed just as if it had been typed on the command line. -

- -In addition, the following table describes the special characters which -can appear in the prompt variables: -

- -

-
\a -
A bell character. -
\d -
The date, in "Weekday Month Date" format (e.g., "Tue May 26"). -
\D{format} -
The format is passed to strftime(3) and the result is inserted -into the prompt string; an empty format results in a locale-specific -time representation. The braces are required. -
\e -
An escape character. -
\h -
The hostname, up to the first `.'. -
\H -
The hostname. -
\j -
The number of jobs currently managed by the shell. -
\l -
The basename of the shell's terminal device name. -
\n -
A newline. -
\r -
A carriage return. -
\s -
The name of the shell, the basename of $0 (the portion -following the final slash). -
\t -
The time, in 24-hour HH:MM:SS format. -
\T -
The time, in 12-hour HH:MM:SS format. -
\@ -
The time, in 12-hour am/pm format. -
\A -
The time, in 24-hour HH:MM format. -
\u -
The username of the current user. -
\v -
The version of Bash (e.g., 2.00) -
\V -
The release of Bash, version + patchlevel (e.g., 2.00.0) -
\w -
The current working directory, with $HOME abbreviated with a tilde. -
\W -
The basename of $PWD, with $HOME abbreviated with a tilde. -
\! -
The history number of this command. -
\# -
The command number of this command. -
\$ -
If the effective uid is 0, #, otherwise $. -
\nnn -
The character whose ASCII code is the octal value nnn. -
\\ -
A backslash. -
\[ -
Begin a sequence of non-printing characters. This could be used to -embed a terminal control sequence into the prompt. -
\] -
End a sequence of non-printing characters. -
-

- -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 section 9.1 Bash History Facilities), 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 -promptvars shell option (see section 4.2 Bash Builtin Commands). -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.10 The Restricted Shell

- -

- -If Bash is started with the name rbash, or the -`--restricted' -or -`-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. -A restricted shell behaves identically to bash -with the exception that the following are disallowed or not performed: -

- -

    -
  • -Changing directories with the cd builtin. -
  • -Setting or unsetting the values of the SHELL, PATH, -ENV, or BASH_ENV variables. -
  • -Specifying command names containing slashes. -
  • -Specifying a filename containing a slash as an argument to the . -builtin command. -
  • -Specifying a filename containing a slash as an argument to the `-p' -option to the hash builtin command. -
  • -Importing function definitions from the shell environment at startup. -
  • -Parsing the value of SHELLOPTS from the shell environment at startup. -
  • -Redirecting output using the `>', `>|', `<>', `>&', -`&>', and `>>' redirection operators. -
  • -Using the exec builtin to replace the shell with another command. -
  • -Adding or deleting builtin commands with the -`-f' and `-d' options to the enable builtin. -
  • -Using the enable builtin command to enable disabled shell builtins. -
  • -Specifying the `-p' option to the command builtin. -
  • -Turning off restricted mode with `set +r' or `set +o restricted'. -
-

- -These restrictions are enforced after any startup files are read. -

- -When a command that is found to be a shell script is executed -(see section 3.8 Shell Scripts), rbash turns off any restrictions in -the shell spawned to execute the script. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

6.11 Bash POSIX Mode

- -

- -Starting Bash with the `--posix' command-line option or executing -`set -o posix' while Bash is running will cause Bash to conform more -closely to the POSIX standard by changing the behavior to -match that specified by POSIX in areas where the Bash default differs. -

- -When invoked as sh, Bash enters POSIX mode after reading the -startup files. -

- -The following list is what's changed when `POSIX mode' is in effect: -

- -

    -
  1. -When a command in the hash table no longer exists, Bash will re-search -$PATH to find the new location. This is also available with -`shopt -s checkhash'. -

    - -

  2. -The message printed by the job control code and builtins when a job -exits with a non-zero status is `Done(status)'. -

    - -

  3. -The message printed by the job control code and builtins when a job -is stopped is `Stopped(signame)', where signame is, for -example, SIGTSTP. -

    - -

  4. -The bg builtin uses the required format to describe each job placed -in the background, which does not include an indication of whether the job -is the current or previous job. -

    - -

  5. -Reserved words appearing in a context where reserved words are recognized -do not undergo alias expansion. -

    - -

  6. -The POSIX PS1 and PS2 expansions of `!' to -the history number and `!!' to `!' are enabled, -and parameter expansion is performed on the values of PS1 and -PS2 regardless of the setting of the promptvars option. -

    - -

  7. -The POSIX startup files are executed ($ENV) rather than -the normal Bash files. -

    - -

  8. -Tilde expansion is only performed on assignments preceding a command -name, rather than on all assignment statements on the line. -

    - -

  9. -The default history file is `~/.sh_history' (this is the -default value of $HISTFILE). -

    - -

  10. -The output of `kill -l' prints all the signal names on a single line, -separated by spaces, without the `SIG' prefix. -

    - -

  11. -The kill builtin does not accept signal names with a `SIG' -prefix. -

    - -

  12. -Non-interactive shells exit if filename in . filename -is not found. -

    - -

  13. -Non-interactive shells exit if a syntax error in an arithmetic expansion -results in an invalid expression. -

    - -

  14. -Redirection operators do not perform filename expansion on the word -in the redirection unless the shell is interactive. -

    - -

  15. -Redirection operators do not perform word splitting on the word in the -redirection. -

    - -

  16. -Function names must be valid shell names. That is, they may not -contain characters other than letters, digits, and underscores, and -may not start with a digit. Declaring a function with an invalid name -causes a fatal syntax error in non-interactive shells. -

    - -

  17. -POSIX special builtins are found before shell functions -during command lookup. -

    - -

  18. -If a POSIX special builtin returns an error status, a -non-interactive shell exits. The fatal errors are those listed in -the POSIX standard, and include things like passing incorrect options, -redirection errors, variable assignment errors for assignments preceding -the command name, and so on. -

    - -

  19. -If CDPATH is set, the cd builtin will not implicitly -append the current directory to it. This means that cd will -fail if no valid directory name can be constructed from -any of the entries in $CDPATH, even if the a directory with -the same name as the name given as an argument to cd exists -in the current directory. -

    - -

  20. -A non-interactive shell exits with an error status if a variable -assignment error occurs when no command name follows the assignment -statements. -A variable assignment error occurs, for example, when trying to assign -a value to a readonly variable. -

    - -

  21. -A non-interactive shell exits with an error status if the iteration -variable in a for statement or the selection variable in a -select statement is a readonly variable. -

    - -

  22. -Process substitution is not available. -

    - -

  23. -Assignment statements preceding POSIX special builtins -persist in the shell environment after the builtin completes. -

    - -

  24. -Assignment statements preceding shell function calls persist in the -shell environment after the function returns, as if a POSIX -special builtin command had been executed. -

    - -

  25. -The export and readonly builtin commands display their -output in the format required by POSIX. -

    - -

  26. -The trap builtin displays signal names without the leading -SIG. -

    - -

  27. -The trap builtin doesn't check the first argument for a possible -signal specification and revert the signal handling to the original -disposition if it is, unless that argument consists solely of digits and -is a valid signal number. If users want to reset the handler for a given -signal to the original disposition, they should use `-' as the -first argument. -

    - -

  28. -The . and source builtins do not search the current directory -for the filename argument if it is not found by searching PATH. -

    - -

  29. -Subshells spawned to execute command substitutions inherit the value of -the `-e' option from the parent shell. When not in POSIX mode, -Bash clears the `-e' option in such subshells. -

    - -

  30. -Alias expansion is always enabled, even in non-interactive shells. -

    - -

  31. -When the alias builtin displays alias definitions, it does not -display them with a leading `alias ' unless the `-p' option -is supplied. -

    - -

  32. -When the set builtin is invoked without options, it does not display -shell function names and definitions. -

    - -

  33. -When the set builtin is invoked without options, it displays -variable values without quotes, unless they contain shell metacharacters, -even if the result contains nonprinting characters. -

    - -

  34. -When the cd builtin is invoked in logical mode, and the pathname -constructed from $PWD and the directory name supplied as an argument -does not refer to an existing directory, cd will fail instead of -falling back to physical mode. -

    - -

  35. -When the pwd builtin is supplied the `-P' option, it resets -$PWD to a pathname containing no symlinks. -

    - -

  36. -The pwd builtin verifies that the value it prints is the same as the -current directory, even if it is not asked to check the file system with the -`-P' option. -

    - -

  37. -When listing the history, the fc builtin does not include an -indication of whether or not a history entry has been modified. -

    - -

  38. -The default editor used by fc is ed. -

    - -

  39. -The type and command builtins will not report a non-executable -file as having been found, though the shell will attempt to execute such a -file if it is the only so-named file found in $PATH. -

    - -

  40. -The vi editing mode will invoke the vi editor directly when -the `v' command is run, instead of checking $FCEDIT and -$EDITOR. -

    - -

  41. -When the xpg_echo option is enabled, Bash does not attempt to interpret -any arguments to echo as options. Each argument is displayed, after -escape characters are converted. -

    - -

-

- -There is other POSIX behavior that Bash does not implement by -default even when in POSIX mode. -Specifically: -

- -

    - -
  1. -The fc builtin checks $EDITOR as a program to edit history -entries if FCEDIT is unset, rather than defaulting directly to -ed. fc uses ed if EDITOR is unset. -

    - -

  2. -As noted above, Bash requires the xpg_echo option to be enabled for -the echo builtin to be fully conformant. -

    - -

-

- -Bash can be configured to be POSIX-conformant by default, by specifying -the `--enable-strict-posix-default' to configure when building -(see section 10.8 Optional Features). -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

7. Job Control

- -

- -This chapter discusses what job control is, how it works, and how -Bash allows you to access its facilities. -

- -

- - - -
7.1 Job Control Basics  How job control works.
7.2 Job Control Builtins  Bash builtin commands used to interact - with job control.
7.3 Job Control Variables  Variables Bash uses to customize job - control.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

7.1 Job Control Basics

- -

- -Job control -refers to the ability to selectively stop (suspend) -the execution of processes and continue (resume) -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 Bash. -

- -The shell associates a job with each pipeline. It keeps a -table of currently executing jobs, which may be listed with the -jobs command. When Bash starts a job -asynchronously, it prints a line that looks -like: -
 
[1] 25647
-
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. Bash uses the job abstraction as the -basis for job control. -

- -To facilitate the implementation of the user interface to job -control, the operating system maintains the notion of a current terminal -process group ID. 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 SIGINT. -These processes are said to be in the foreground. 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 SIGTTIN -(SIGTTOU) signal by the terminal driver, which, unless -caught, suspends the process. -

- -If the operating system on which Bash is running supports -job control, Bash contains facilities to use it. Typing the -suspend character (typically `^Z', Control-Z) while a -process is running causes that process to be stopped and returns -control to Bash. Typing the delayed suspend character -(typically `^Y', Control-Y) causes the process to be stopped -when it attempts to read input from the terminal, and control to -be returned to Bash. The user then manipulates the state of -this job, using the bg command to continue it in the -background, the fg command to continue it in the -foreground, or the kill command to kill it. A `^Z' -takes effect immediately, and has the additional side effect of -causing pending output and typeahead to be discarded. -

- -There are a number of ways to refer to a job in the shell. The -character `%' introduces a job name. -

- -Job number n may be referred to as `%n'. -The symbols `%%' and `%+' refer to the shell's notion of the -current job, which is the last job stopped while it was in the foreground -or started in the background. -A single `%' (with no accompanying job specification) also refers -to the current job. -The previous job may be referenced using `%-'. In output -pertaining to jobs (e.g., the output of the jobs command), -the current job is always flagged with a `+', and the -previous job with a `-'. -

- -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, `%ce' refers -to a stopped ce job. Using `%?ce', on the -other hand, refers to any job containing the string `ce' in -its command line. If the prefix or substring matches more than one job, -Bash reports an error. -

- -Simply naming a job can be used to bring it into the foreground: -`%1' is a synonym for `fg %1', bringing job 1 from the -background into the foreground. Similarly, `%1 &' resumes -job 1 in the background, equivalent to `bg %1' -

- -The shell learns immediately whenever a job changes state. -Normally, 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' option to the set builtin is enabled, -Bash reports such changes immediately (see section 4.3.1 The Set Builtin). -Any trap on SIGCHLD is executed for each child process -that exits. -

- -If an attempt to exit Bash is made while jobs are stopped, (or running, if -the checkjobs option is enabled -- see 4.3.2 The Shopt Builtin), the -shell prints a warning message, and if the checkjobs option is -enabled, lists the jobs and their statuses. -The jobs command may then be used to inspect their status. -If a second attempt to exit is made without an intervening command, -Bash does not print another warning, and any stopped jobs are terminated. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

7.2 Job Control Builtins

- -

- -

- -
bg -
-
 
bg [jobspec ...]
-
Resume each suspended job jobspec in the background, as if it -had been started with `&'. -If jobspec is not supplied, the current job is used. -The return status is zero unless it is run when job control is not -enabled, or, when run with job control enabled, any -jobspec was not found or specifies a job -that was started without job control. -

- -

fg -
-
 
fg [jobspec]
-
Resume the job jobspec in the foreground and make it the current job. -If jobspec is not supplied, the current job is used. -The return status is that of the command placed into the foreground, -or non-zero if run when job control is disabled or, when run with -job control enabled, jobspec does not specify a valid job or -jobspec specifies a job that was started without job control. -

- -

jobs -
-
 
jobs [-lnprs] [jobspec]
-jobs -x command [arguments]
-

- -The first form lists the active jobs. The options have the -following meanings: -

- -

-
-l -
List process IDs in addition to the normal information. -

- -

-n -
Display information only about jobs that have changed status since -the user was last notified of their status. -

- -

-p -
List only the process ID of the job's process group leader. -

- -

-r -
Restrict output to running jobs. -

- -

-s -
Restrict output to stopped jobs. -
-

- -If jobspec is given, -output is restricted to information about that job. -If jobspec is not supplied, the status of all jobs is -listed. -

- -If the `-x' option is supplied, jobs replaces any -jobspec found in command or arguments with the -corresponding process group ID, and executes command, -passing it arguments, returning its exit status. -

- -

kill -
-
 
kill [-s sigspec] [-n signum] [-sigspec] jobspec or pid
-kill -l [exit_status]
-
Send a signal specified by sigspec or signum to the process -named by job specification jobspec or process ID pid. -sigspec is either a case-insensitive signal name such as -SIGINT (with or without the SIG prefix) -or a signal number; signum is a signal number. -If sigspec and signum are not present, SIGTERM is used. -The `-l' option lists the signal names. -If any arguments are supplied when `-l' is given, the names of the -signals corresponding to the arguments are listed, and the return status -is zero. -exit_status is a number specifying a signal number or the exit -status of a process terminated by a signal. -The return status is zero if at least one signal was successfully sent, -or non-zero if an error occurs or an invalid option is encountered. -

- -

wait -
-
 
wait [jobspec or pid ...]
-
Wait until the child process specified by each process ID pid -or job specification jobspec exits and return the exit status of the -last command waited for. -If a job spec is given, all processes in the job are waited for. -If no arguments are given, all currently active child processes are -waited for, and the return status is zero. -If neither jobspec nor pid specifies an active child process -of the shell, the return status is 127. -

- -

disown -
-
 
disown [-ar] [-h] [jobspec ...]
-
Without options, each jobspec is removed from the table of -active jobs. -If the `-h' option is given, the job is not removed from the table, -but is marked so that SIGHUP is not sent to the job if the shell -receives a SIGHUP. -If jobspec is not present, and neither the `-a' nor `-r' -option is supplied, the current job is used. -If no jobspec is supplied, the `-a' option means to remove or -mark all jobs; the `-r' option without a jobspec -argument restricts operation to running jobs. -

- -

suspend -
-
 
suspend [-f]
-
Suspend the execution of this shell until it receives a -SIGCONT signal. The `-f' option means to suspend -even if the shell is a login shell. -

- -

-

- -When job control is not active, the kill and wait -builtins do not accept jobspec arguments. They must be -supplied process IDs. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

7.3 Job Control Variables

- -

- -

- - -
auto_resume -
-This variable controls how the shell interacts with the user and -job control. If this variable exists then single word simple -commands without redirections are treated as candidates for resumption -of an existing job. There is no ambiguity allowed; if there is -more than one job beginning with the string typed, then -the most recently accessed job will be selected. -The name of a stopped job, in this context, is the command line -used to start it. If this variable is set to the value `exact', -the string supplied must match the name of a stopped job exactly; -if set to `substring', -the string supplied needs to match a substring of the name of a -stopped job. The `substring' value provides functionality -analogous to the `%?' job ID (see section 7.1 Job Control Basics). -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 `%' job ID. -

- -

-

- - -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8. Command Line Editing

- -

- -This chapter describes the basic features of the GNU -command line editing interface. -Command line editing is provided by the Readline library, which is -used by several different programs, including Bash. -

- -

- - - - - - - -
8.1 Introduction to Line Editing  Notation used in this text.
8.2 Readline Interaction  The minimum set of commands for editing a line.
8.3 Readline Init File  Customizing Readline from a user's view.
8.4 Bindable Readline Commands  A description of most of the Readline commands - available for binding
8.5 Readline vi Mode  A short description of how to make Readline - behave like the vi editor.
8.6 Programmable Completion  How to specify the possible completions for - a specific command.
8.7 Programmable Completion Builtins  Builtin commands to specify how to - complete arguments for a particular command.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.1 Introduction to Line Editing

- -

- -The following paragraphs describe the notation used to represent -keystrokes. -

- -The text C-k is read as `Control-K' and describes the character -produced when the k key is pressed while the Control key -is depressed. -

- -The text M-k is read as `Meta-K' and describes the character -produced when the Meta key (if you have one) is depressed, and the k -key is pressed. -The Meta key is labeled ALT on many keyboards. -On keyboards with two keys labeled ALT (usually to either side of -the space bar), the ALT on the left side is generally set to -work as a Meta key. -The ALT key on the right may also be configured to work as a -Meta key or may be configured as some other modifier, such as a -Compose key for typing accented characters. -

- -If you do not have a Meta or ALT key, or another key working as -a Meta key, the identical keystroke can be generated by typing ESC -first, and then typing k. -Either process is known as metafying the k key. -

- -The text M-C-k is read as `Meta-Control-k' and describes the -character produced by metafying C-k. -

- -In addition, several keys have their own names. Specifically, -DEL, ESC, LFD, SPC, RET, and TAB all -stand for themselves when seen in this text, or in an init file -(see section 8.3 Readline Init File). -If your keyboard lacks a LFD key, typing C-j will -produce the desired character. -The RET key may be labeled Return or Enter on -some keyboards. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2 Readline Interaction

- -

- -Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press RET. You do not have to be at the -end of the line to press RET; the entire line is accepted -regardless of the location of the cursor within the line. -

- -

- - - - - -
8.2.1 Readline Bare Essentials  The least you need to know about Readline.
8.2.2 Readline Movement Commands  Moving about the input line.
8.2.3 Readline Killing Commands  How to delete text, and how to get it back!
8.2.4 Readline Arguments  Giving numeric arguments to commands.
8.2.5 Searching for Commands in the History  Searching through previous lines.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2.1 Readline Bare Essentials

- -

- -In order to enter characters into the line, simply type them. The typed -character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use your -erase character to back up and delete the mistyped character. -

- -Sometimes you may mistype a character, and -not notice the error until you have typed several other characters. In -that case, you can type C-b to move the cursor to the left, and then -correct your mistake. Afterwards, you can move the cursor to the right -with C-f. -

- -When you add text in the middle of a line, you will notice that characters -to the right of the cursor are `pushed over' to make room for the text -that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor are `pulled back' to fill in the -blank space created by the removal of the text. A list of the bare -essentials for editing the text of an input line follows. -

- -

-
C-b -
Move back one character. -
C-f -
Move forward one character. -
DEL or Backspace -
Delete the character to the left of the cursor. -
C-d -
Delete the character underneath the cursor. -
Printing characters -
Insert the character into the line at the cursor. -
C-_ or C-x C-u -
Undo the last editing command. You can undo all the way back to an -empty line. -
-

- -(Depending on your configuration, the Backspace key be set to -delete the character to the left of the cursor and the DEL key set -to delete the character underneath the cursor, like C-d, rather -than the character to the left of the cursor.) -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2.2 Readline Movement Commands

- -

- -The above table describes the most basic keystrokes that you need -in order to do editing of the input line. For your convenience, many -other commands have been added in addition to C-b, C-f, -C-d, and DEL. Here are some commands for moving more rapidly -about the line. -

- -

-
C-a -
Move to the start of the line. -
C-e -
Move to the end of the line. -
M-f -
Move forward a word, where a word is composed of letters and digits. -
M-b -
Move backward a word. -
C-l -
Clear the screen, reprinting the current line at the top. -
-

- -Notice how C-f moves forward a character, while M-f moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2.3 Readline Killing Commands

- -

- - - -

- -Killing text means to delete the text from the line, but to save -it away for later use, usually by yanking (re-inserting) -it back into the line. -(`Cut' and `paste' are more recent jargon for `kill' and `yank'.) -

- -If the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. -

- -When you use a kill command, the text is saved in a kill-ring. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it all. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. - -

- -Here is the list of commands for killing text. -

- -

-
C-k -
Kill the text from the current cursor position to the end of the line. -

- -

M-d -
Kill from the cursor 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 M-f. -

- -

M-DEL -
Kill from the cursor the start of the current word, or, if between -words, to the start of the previous word. -Word boundaries are the same as those used by M-b. -

- -

C-w -
Kill from the cursor to the previous whitespace. This is different than -M-DEL because the word boundaries differ. -

- -

-

- -Here is how to yank the text back into the line. Yanking -means to copy the most-recently-killed text from the kill buffer. -

- -

-
C-y -
Yank the most recently killed text back into the buffer at the cursor. -

- -

M-y -
Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is C-y or M-y. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2.4 Readline Arguments

- -

- -You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the sign of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type `M-- C-k'. -

- -The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' typed is a minus -sign (`-'), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to give -the C-d command an argument of 10, you could type `M-1 0 C-d', -which will delete the next ten characters on the input line. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.2.5 Searching for Commands in the History

- -

- -Readline provides commands for searching through the command history -(see section 9.1 Bash History Facilities) -for lines containing a specified string. -There are two search modes: incremental and non-incremental. -

- -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. -To search backward in the history for a particular string, type -C-r. Typing C-s searches forward through the history. -The characters present in the value of the isearch-terminators variable -are used to terminate an incremental search. -If that variable has not been assigned a value, the ESC and -C-J characters will terminate an incremental search. -C-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. -

- -To find other matching entries in the history list, type C-r or -C-s 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 RET will terminate the search and accept -the line, thereby executing the command from the history list. -A movement command will terminate the search, make the last line found -the current line, and begin editing. -

- -Readline remembers the last incremental search string. If two -C-rs are typed without any intervening characters defining a new -search string, any remembered search string is used. -

- -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. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.3 Readline Init File

- -

- -Although the Readline library comes with a set of Emacs-like -keybindings installed by default, it is possible to use a different set -of keybindings. -Any user can customize programs that use Readline by putting -commands in an inputrc file, conventionally in his home directory. -The name of this -file is taken from the value of the shell variable INPUTRC. If -that variable is unset, the default is `~/.inputrc'. If that -file does not exist or cannot be read, the ultimate default is -`/etc/inputrc'. -

- -When a program which uses the Readline library starts up, the -init file is read, and the key bindings are set. -

- -In addition, the C-x C-r command re-reads this init file, thus -incorporating any changes that you might have made to it. -

- -

- -
8.3.1 Readline Init File Syntax  Syntax for the commands in the inputrc file.
- -
- - -
8.3.2 Conditional Init Constructs  Conditional key bindings in the inputrc file.
- -
- - -
8.3.3 Sample Init File  An example inputrc file.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.3.1 Readline Init File Syntax

- -

- -There are only a few basic constructs allowed in the -Readline init file. Blank lines are ignored. -Lines beginning with a `#' are comments. -Lines beginning with a `$' indicate conditional -constructs (see section 8.3.2 Conditional Init Constructs). Other lines -denote variable settings and key bindings. -

- -

-
Variable Settings -
You can modify the run-time behavior of Readline by -altering the values of variables in Readline -using the set command within the init file. -The syntax is simple: -

- -
 
set variable value
-

- -Here, for example, is how to -change from the default Emacs-like key binding to use -vi line editing commands: -

- -
 
set editing-mode vi
-

- -Variable names and values, where appropriate, are recognized without regard -to case. Unrecognized variable names are ignored. -

- -Boolean variables (those that can be set to on or off) are set to on if -the value is null or empty, on (case-insensitive), or 1. Any other -value results in the variable being set to off. -

- -The bind -V command lists the current Readline variable names -and values. See section 4.2 Bash Builtin Commands. -

- -A great deal of run-time behavior is changeable with the following -variables. -

- - -

- -
bell-style -
-Controls what happens when Readline wants to ring the terminal bell. -If set to `none', Readline never rings the bell. If set to -`visible', Readline uses a visible bell if one is available. -If set to `audible' (the default), Readline attempts to ring -the terminal's bell. -

- -

bind-tty-special-chars -
-If set to `on', Readline attempts to bind the control characters -treated specially by the kernel's terminal driver to their Readline -equivalents. -

- -

comment-begin -
-The string to insert at the beginning of the line when the -insert-comment command is executed. The default value -is "#". -

- -

completion-ignore-case -
If set to `on', Readline performs filename matching and completion -in a case-insensitive fashion. -The default value is `off'. -

- -

completion-query-items -
-The number of possible completions that determines when the user is -asked whether the list of possibilities should be displayed. -If the number of possible completions is greater than this value, -Readline will ask the user whether or not he wishes to view -them; otherwise, they are simply listed. -This variable must be set to an integer value greater than or equal to 0. -A negative value means Readline should never ask. -The default limit is 100. -

- -

convert-meta -
-If set to `on', Readline will convert characters with the -eighth bit set to an ASCII key sequence by stripping the eighth -bit and prefixing an ESC character, converting them to a -meta-prefixed key sequence. The default value is `on'. -

- -

disable-completion -
-If set to `On', Readline will inhibit word completion. -Completion characters will be inserted into the line as if they had -been mapped to self-insert. The default is `off'. -

- -

editing-mode -
-The editing-mode variable controls which default set of -key bindings is used. By default, Readline starts up in Emacs editing -mode, where the keystrokes are most similar to Emacs. This variable can be -set to either `emacs' or `vi'. -

- -

enable-keypad -
-When set to `on', Readline will try to enable the application -keypad when it is called. Some systems need this to enable the -arrow keys. The default is `off'. -

- -

expand-tilde -
-If set to `on', tilde expansion is performed when Readline -attempts word completion. The default is `off'. -

- -

history-preserve-point -
-If set to `on', the history code attempts to place point at the -same location on each history line retrieved with previous-history -or next-history. The default is `off'. -

- -

horizontal-scroll-mode -
-This variable can be set to either `on' or `off'. Setting it -to `on' means that the text of the lines being edited will scroll -horizontally on a single screen line when they are longer than the width -of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to `off'. -

- -

input-meta -
- -If set to `on', Readline will enable eight-bit input (it -will not clear the eighth bit in the characters it reads), -regardless of what the terminal claims it can support. The -default value is `off'. The name meta-flag is a -synonym for this variable. -

- -

isearch-terminators -
-The string of characters that should terminate an incremental search without -subsequently executing the character as a command (see section 8.2.5 Searching for Commands in the History). -If this variable has not been given a value, the characters ESC and -C-J will terminate an incremental search. -

- -

keymap -
-Sets Readline's idea of the current keymap for key binding commands. -Acceptable keymap names are -emacs, -emacs-standard, -emacs-meta, -emacs-ctlx, -vi, -vi-move, -vi-command, and -vi-insert. -vi is equivalent to vi-command; emacs is -equivalent to emacs-standard. The default value is emacs. -The value of the editing-mode variable also affects the -default keymap. -

- -

mark-directories -
If set to `on', completed directory names have a slash -appended. The default is `on'. -

- -

mark-modified-lines -
-This variable, when set to `on', causes Readline to display an -asterisk (`*') at the start of history lines which have been modified. -This variable is `off' by default. -

- -

mark-symlinked-directories -
-If set to `on', completed names which are symbolic links -to directories have a slash appended (subject to the value of -mark-directories). -The default is `off'. -

- -

match-hidden-files -
-This variable, when set to `on', 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. -This variable is `on' by default. -

- -

output-meta -
-If set to `on', Readline will display characters with the -eighth bit set directly rather than as a meta-prefixed escape -sequence. The default is `off'. -

- -

page-completions -
-If set to `on', Readline uses an internal more-like pager -to display a screenful of possible completions at a time. -This variable is `on' by default. -

- -

print-completions-horizontally -
If set to `on', Readline will display completions with matches -sorted horizontally in alphabetical order, rather than down the screen. -The default is `off'. -

- -

show-all-if-ambiguous -
-This alters the default behavior of the completion functions. If -set to `on', -words which have more than one possible completion cause the -matches to be listed immediately instead of ringing the bell. -The default value is `off'. -

- -

show-all-if-unmodified -
-This alters the default behavior of the completion functions in -a fashion similar to show-all-if-ambiguous. -If set to `on', -words which have more than one possible completion without any -possible partial completion (the possible completions don't share -a common prefix) cause the matches to be listed immediately instead -of ringing the bell. -The default value is `off'. -

- -

visible-stats -
-If set to `on', a character denoting a file's type -is appended to the filename when listing possible -completions. The default is `off'. -

- -

-

- -

Key Bindings -
The syntax for controlling key bindings in the init file is -simple. First you need to find the name of the command that you -want to change. The following sections contain tables of the command -name, the default keybinding, if any, and a short description of what -the command does. -

- -Once you know the name of the command, simply place on a line -in the init file the name of the key -you wish to bind the command to, a colon, and then the name of the -command. -There can be no space between the key name and the colon -- that will be -interpreted as part of the key name. -The name of the key can be expressed in different ways, depending on -what you find most comfortable. -

- -In addition to command names, readline allows keys to be bound -to a string that is inserted when the key is pressed (a macro). -

- -The bind -p command displays Readline function names and -bindings in a format that can put directly into an initialization file. -See section 4.2 Bash Builtin Commands. -

- -

-
keyname: function-name or macro -
keyname is the name of a key spelled out in English. For example: -
 
Control-u: universal-argument
-Meta-Rubout: backward-kill-word
-Control-o: "> output"
-

- -In the above example, C-u is bound to the function -universal-argument, -M-DEL is bound to the function backward-kill-word, and -C-o is bound to run the macro -expressed on the right hand side (that is, to insert the text -`> output' into the line). -

- -A number of symbolic character names are recognized while -processing this key binding syntax: -DEL, -ESC, -ESCAPE, -LFD, -NEWLINE, -RET, -RETURN, -RUBOUT, -SPACE, -SPC, -and -TAB. -

- -

"keyseq": function-name or macro -
keyseq differs from keyname above in that strings -denoting an entire key sequence can be specified, by placing -the key sequence in double quotes. Some GNU Emacs style key -escapes can be used, as in the following example, but the -special character names are not recognized. -

- -
 
"\C-u": universal-argument
-"\C-x\C-r": re-read-init-file
-"\e[11~": "Function Key 1"
-

- -In the above example, C-u is again bound to the function -universal-argument (just as it was in the first example), -`C-x C-r' is bound to the function re-read-init-file, -and `ESC [ 1 1 ~' is bound to insert -the text `Function Key 1'. -

- -

-

- -The following GNU Emacs style escape sequences are available when -specifying key sequences: -

- -

-
\C- -
control prefix -
\M- -
meta prefix -
\e -
an escape character -
\\ -
backslash -
\" -
", a double quotation mark -
\' -
', a single quote or apostrophe -
-

- -In addition to the GNU Emacs style escape sequences, a second -set of backslash escapes is available: -

- -

-
\a -
alert (bell) -
\b -
backspace -
\d -
delete -
\f -
form feed -
\n -
newline -
\r -
carriage return -
\t -
horizontal tab -
\v -
vertical tab -
\nnn -
the eight-bit character whose value is the octal value nnn -(one to three digits) -
\xHH -
the eight-bit character whose value is the hexadecimal value HH -(one or two hex digits) -
-

- -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 `''. -For example, the following binding will make `C-x \' -insert a single `\' into the line: -
 
"\C-x\\": "\\"
-

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.3.2 Conditional Init Constructs

- -

- -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. -

- -

-
$if -
The $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. -

- -

-
mode -
The mode= form of the $if directive is used to test -whether Readline is in emacs or vi mode. -This may be used in conjunction -with the `set keymap' command, for instance, to set bindings in -the emacs-standard and emacs-ctlx keymaps only if -Readline is starting out in emacs mode. -

- -

term -
The term= 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 -`=' is tested against both the full name of the terminal and -the portion of the terminal name before the first `-'. This -allows sun to match both sun and sun-cmd, -for instance. -

- -

application -
The application construct is used to include -application-specific settings. Each program using the Readline -library sets the application name, and you 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: -
 
$if Bash
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-$endif
-
-

- -

$endif -
This command, as seen in the previous example, terminates an -$if command. -

- -

$else -
Commands in this branch of the $if directive are executed if -the test fails. -

- -

$include -
This directive takes a single filename as an argument and reads commands -and bindings from that file. -For example, the following directive reads from `/etc/inputrc': -
 
$include /etc/inputrc
-
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.3.3 Sample Init File

- -

- -Here is an example of an inputrc file. This illustrates key -binding, variable assignment, and conditional syntax. -

- -
 
# This file controls the behaviour of line input editing for
-# programs that use the GNU Readline library.  Existing
-# programs include FTP, Bash, and GDB.
-#
-# You can re-read the inputrc file with C-x C-r.
-# Lines beginning with '#' are comments.
-#
-# First, include any systemwide bindings and variable
-# assignments from /etc/Inputrc
-$include /etc/Inputrc
-
-#
-# Set various bindings for emacs mode.
-
-set editing-mode emacs 
-
-$if mode=emacs
-
-Meta-Control-h:	backward-kill-word	Text after the function name is ignored
-
-#
-# Arrow keys in keypad mode
-#
-#"\M-OD":        backward-char
-#"\M-OC":        forward-char
-#"\M-OA":        previous-history
-#"\M-OB":        next-history
-#
-# Arrow keys in ANSI mode
-#
-"\M-[D":        backward-char
-"\M-[C":        forward-char
-"\M-[A":        previous-history
-"\M-[B":        next-history
-#
-# Arrow keys in 8 bit keypad mode
-#
-#"\M-\C-OD":       backward-char
-#"\M-\C-OC":       forward-char
-#"\M-\C-OA":       previous-history
-#"\M-\C-OB":       next-history
-#
-# Arrow keys in 8 bit ANSI mode
-#
-#"\M-\C-[D":       backward-char
-#"\M-\C-[C":       forward-char
-#"\M-\C-[A":       previous-history
-#"\M-\C-[B":       next-history
-
-C-q: quoted-insert
-
-$endif
-
-# An old-style binding.  This happens to be the default.
-TAB: complete
-
-# Macros that are convenient for shell interaction
-$if Bash
-# edit the path
-"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
-# prepare to type a quoted word --
-# insert open and close double quotes
-# and move to just after the open quote
-"\C-x\"": "\"\"\C-b"
-# insert a backslash (testing backslash escapes
-# in sequences and macros)
-"\C-x\\": "\\"
-# Quote the current or previous word
-"\C-xq": "\eb\"\ef\""
-# Add a binding to refresh the line, which is unbound
-"\C-xr": redraw-current-line
-# Edit variable on current line.
-"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
-$endif
-
-# use a visible bell if one is available
-set bell-style visible
-
-# don't strip characters to 7 bits when reading
-set input-meta on
-
-# allow iso-latin1 characters to be inserted rather
-# than converted to prefix-meta sequences
-set convert-meta off
-
-# display characters with the eighth bit set directly
-# rather than as meta-prefixed characters
-set output-meta on
-
-# if there are more than 150 possible completions for
-# a word, ask the user if he wants to see all of them
-set completion-query-items 150
-
-# For FTP
-$if Ftp
-"\C-xg": "get \M-?"
-"\C-xt": "put \M-?"
-"\M-.": yank-last-arg
-$endif
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4 Bindable Readline Commands

- -

- -

- - - - - - - - -
8.4.1 Commands For Moving  Moving about the line.
8.4.2 Commands For Manipulating The History  Getting at previous lines.
8.4.3 Commands For Changing Text  Commands for changing text.
8.4.4 Killing And Yanking  Commands for killing and yanking.
8.4.5 Specifying Numeric Arguments  Specifying numeric arguments, repeat counts.
8.4.6 Letting Readline Type For You  Getting Readline to do the typing for you.
8.4.7 Keyboard Macros  Saving and re-executing typed characters
8.4.8 Some Miscellaneous Commands  Other miscellaneous commands.
-

- -This section describes Readline commands that may be bound to key -sequences. -You can list your key bindings by executing -bind -P or, for a more terse format, suitable for an -inputrc file, bind -p. (See section 4.2 Bash Builtin Commands.) -Command names without an accompanying key sequence are unbound by default. -

- -In the following descriptions, point refers to the current cursor -position, and mark refers to a cursor position saved by the -set-mark command. -The text between the point and mark is referred to as the region. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.1 Commands For Moving

- -
- -
beginning-of-line (C-a) -
-Move to the start of the current line. -

- - -

end-of-line (C-e) -
-Move to the end of the line. -

- - -

forward-char (C-f) -
-Move forward a character. -

- - -

backward-char (C-b) -
-Move back a character. -

- - -

forward-word (M-f) -
-Move forward to the end of the next word. Words are composed of -letters and digits. -

- - -

backward-word (M-b) -
-Move back to the start of the current or previous word. Words are -composed of letters and digits. -

- - -

clear-screen (C-l) -
-Clear the screen and redraw the current line, -leaving the current line at the top of the screen. -

- - -

redraw-current-line () -
-Refresh the current line. By default, this is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.2 Commands For Manipulating The History

- -

- -

- -
accept-line (Newline or 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 setting of -the HISTCONTROL and HISTIGNORE variables. -If this line is a modified history line, then restore the history line -to its original state. -

- - -

previous-history (C-p) -
-Move `back' through the history list, fetching the previous command. -

- - -

next-history (C-n) -
-Move `forward' through the history list, fetching the next command. -

- - -

beginning-of-history (M-<) -
-Move to the first line in the history. -

- - -

end-of-history (M->) -
-Move to the end of the input history, i.e., the line currently -being entered. -

- - -

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. -

- - -

forward-search-history (C-s) -
-Search forward starting at the current line and moving `down' through -the the history as necessary. This is an incremental search. -

- - -

non-incremental-reverse-search-history (M-p) -
-Search backward starting at the current line and moving `up' -through the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

non-incremental-forward-search-history (M-n) -
-Search forward starting at the current line and moving `down' -through the the history as necessary using a non-incremental search -for a string supplied by the user. -

- - -

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. -By default, this command is unbound. -

- - -

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. By default, this command is unbound. -

- - -

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 n, -insert the nth word from the previous command (the words -in the previous command begin with word 0). A negative argument -inserts the nth word from the end of the previous command. -Once the argument n is computed, the argument is extracted -as if the `!n' history expansion had been specified. -

- - -

yank-last-arg (M-. or M-_) -
-Insert last argument to the previous command (the last word of the -previous history entry). With an -argument, behave exactly like yank-nth-arg. -Successive calls to yank-last-arg move back through the history -list, inserting the last argument of each line in turn. -The history expansion facilities are used to extract the last argument, -as if the `!$' history expansion had been specified. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.3 Commands For Changing Text

- -

- -

- -
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 delete-char, then -return EOF. -

- - -

backward-delete-char (Rubout) -
-Delete the character behind the cursor. A numeric argument means -to kill the characters instead of deleting them. -

- - -

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. By default, this is not bound to a key. -

- - -

quoted-insert (C-q or C-v) -
-Add the next character typed to the line verbatim. This is -how to insert key sequences like C-q, for example. -

- - -

self-insert (a, b, A, 1, !, ...) -
-Insert yourself. -

- - -

transpose-chars (C-t) -
-Drag the character before the cursor forward over -the character at the cursor, moving the -cursor forward as well. If the insertion point -is at the end of the line, then this -transposes the last two characters of the line. -Negative arguments have no effect. -

- - -

transpose-words (M-t) -
-Drag the word before point past the word after point, -moving point past that word as well. -If the insertion point is at the end of the line, this transposes -the last two words on the line. -

- - -

upcase-word (M-u) -
-Uppercase the current (or following) word. With a negative argument, -uppercase the previous word, but do not move the cursor. -

- - -

downcase-word (M-l) -
-Lowercase the current (or following) word. With a negative argument, -lowercase the previous word, but do not move the cursor. -

- - -

capitalize-word (M-c) -
-Capitalize the current (or following) word. With a negative argument, -capitalize the previous word, but do not move the cursor. -

- - -

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 -emacs mode; vi mode does overwrite differently. -Each call to readline() starts in insert mode. -

- -In overwrite mode, characters bound to self-insert replace -the text at point rather than pushing the text to the right. -Characters bound to backward-delete-char replace the character -before point with a space. -

- -By default, this command is unbound. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.4 Killing And Yanking

- -

- -

- - -
kill-line (C-k) -
-Kill the text from point to the end of the line. -

- - -

backward-kill-line (C-x Rubout) -
-Kill backward to the beginning of the line. -

- - -

unix-line-discard (C-u) -
-Kill backward from the cursor to the beginning of the current line. -

- - -

kill-whole-line () -
-Kill all characters on the current line, no matter where point is. -By default, this is unbound. -

- - -

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 forward-word. -

- - -

backward-kill-word (M-DEL) -
-Kill the word behind point. -Word boundaries are the same as backward-word. -

- - -

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. -

- - -

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. -

- - -

kill-region () -
-Kill the text in the current region. -By default, this command is unbound. -

- - -

copy-region-as-kill () -
-Copy the text in the region to the kill buffer, so it can be yanked -right away. By default, this command is unbound. -

- - -

copy-backward-word () -
-Copy the word before point to the kill buffer. -The word boundaries are the same as backward-word. -By default, this command is unbound. -

- - -

copy-forward-word () -
-Copy the word following point to the kill buffer. -The word boundaries are the same as forward-word. -By default, this command is unbound. -

- - -

yank (C-y) -
-Yank the top of the kill ring into the buffer at point. -

- - -

yank-pop (M-y) -
-Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is yank or yank-pop. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.5 Specifying Numeric Arguments

- -
- - -
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. -If the command is followed by digits, executing 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. -By default, this is not bound to a key. -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.6 Letting Readline Type For You

- -

- -

- -
complete (TAB) -
-Attempt to perform completion on the text before point. -The actual completion performed is application-specific. -Bash attempts completion treating the text as a variable (if the -text begins with `$'), username (if the text begins with -`~'), hostname (if the text begins with `@'), or -command (including aliases and functions) in turn. If none -of these produces a match, filename completion is attempted. -

- - -

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 -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 bell-style) -and the original text is restored. -An argument of n moves n 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 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 -possible-completions. -This command is unbound by default. -

- - -

complete-filename (M-/) -
-Attempt filename completion on the text before point. -

- - -

possible-filename-completions (C-x /) -
-List the possible completions of the text before point, -treating it as a filename. -

- - -

complete-username (M-~) -
-Attempt completion on the text before point, treating -it as a username. -

- - -

possible-username-completions (C-x ~) -
-List the possible completions of the text before point, -treating it as a username. -

- - -

complete-variable (M-$) -
-Attempt completion on the text before point, treating -it as a shell variable. -

- - -

possible-variable-completions (C-x $) -
-List the possible completions of the text before point, -treating it as a shell variable. -

- - -

complete-hostname (M-@) -
-Attempt completion on the text before point, treating -it as a hostname. -

- - -

possible-hostname-completions (C-x @) -
-List the possible completions of the text before point, -treating it as a hostname. -

- - -

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. -

- - -

possible-command-completions (C-x !) -
-List the possible completions of the text before point, -treating it as a command name. -

- - -

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. -

- - -

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 section 3.5.1 Brace Expansion). -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.7 Keyboard Macros

- -
- - -
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. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.4.8 Some Miscellaneous Commands

- -
- - -
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 -the characters at the beginning of the line do not match the value -of comment-begin, the value is inserted, otherwise -the characters in comment-begin 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 comment-begin 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. -

- - -

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. -

- - -

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. -

- - -

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, a `*' is appended before -pathname expansion. -

- - -

glob-list-expansions (C-x g) -
-The list of expansions that would have been generated by -glob-expand-word is displayed, and the line is redrawn. -If a numeric argument is supplied, a `*' is appended before -pathname expansion. -

- - -

display-shell-version (C-x C-v) -
-Display version information about the current instance of Bash. -

- - -

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 section 3.5 Shell Expansions). -

- - -

history-expand-line (M-^) -
-Perform history expansion on the current line. -

- - -

magic-space () -
-Perform history expansion on the current line and insert a space -(see section 9.3 History Expansion). -

- - -

alias-expand-line () -
-Perform alias expansion on the current line (see section 6.6 Aliases). -

- - -

history-and-alias-expand-line () -
-Perform history and alias expansion on the current line. -

- - -

insert-last-argument (M-. or M-_) -
-A synonym for yank-last-arg. -

- - -

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. -

- - -

edit-and-execute-command (C-xC-e) -
-Invoke an editor on the current command line, and execute the result as shell -commands. -Bash attempts to invoke -$VISUAL, $EDITOR, and emacs -as the editor, in that order. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.5 Readline vi Mode

- -

- -While the Readline library does not have a full set of vi -editing functions, it does contain enough to allow simple editing -of the line. The Readline vi mode behaves as specified in -the POSIX 1003.2 standard. -

- -In order to switch interactively between emacs and vi -editing modes, use the `set -o emacs' and `set -o vi' -commands (see section 4.3.1 The Set Builtin). -The Readline default is emacs mode. -

- -When you enter a line in vi mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing ESC -switches you into `command' mode, where you can edit the text of the -line with the standard vi movement keys, move to previous -history lines with `k' and subsequent lines with `j', and -so forth. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.6 Programmable Completion

- -

- -When word completion is attempted for an argument to a command for -which a completion specification (a compspec) has been defined -using the complete builtin (see section 8.7 Programmable Completion Builtins), -the programmable completion facilities are invoked. -

- -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. -

- -Once a compspec has been found, it is used to generate the list of -matching words. -If a compspec is not found, the default Bash completion -described above (see section 8.4.6 Letting Readline Type For You) is performed. -

- -First, the actions specified by the compspec are used. -Only matches which are prefixed by the word being completed are -returned. -When the `-f' or `-d' option is used for filename or -directory name completion, the shell variable FIGNORE is -used to filter the matches. -See section 5.2 Bash Variables, for a description of FIGNORE. -

- -Any completions specified by a filename expansion pattern to the -`-G' option are generated next. -The words generated by the pattern need not match the word being completed. -The GLOBIGNORE shell variable is not used to filter the matches, -but the FIGNORE shell variable is used. -

- -Next, the string specified as the argument to the `-W' option -is considered. -The string is first split using the characters in the 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, and arithmetic expansion, -as described above (see section 3.5 Shell Expansions). -The results are split using the rules described above -(see section 3.5.7 Word Splitting). -The results of the expansion are prefix-matched against the word being -completed, and the matching words become the possible completions. -

- -After these matches have been generated, any shell function or command -specified with the `-F' and `-C' options is invoked. -When the command or function is invoked, the COMP_LINE, -COMP_POINT, COMP_KEY, and COMP_TYPE variables are -assigned values as described above (see section 5.2 Bash Variables). -If a shell function is being invoked, the COMP_WORDS and -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. -

- -Any function specified with `-F' is invoked first. -The function may use any of the shell facilities, including the -compgen builtin described below -(see section 8.7 Programmable Completion Builtins), to generate the matches. -It must put the possible completions in the COMPREPLY array -variable. -

- -Next, any command specified with the `-C' 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. -

- -After all of the possible completions are generated, any filter -specified with the `-X' option is applied to the list. -The filter is a pattern as used for pathname expansion; a `&' -in the pattern is replaced with the text of the word being completed. -A literal `&' 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 `!' negates the pattern; in this case any completion -not matching the pattern will be removed. -

- -Finally, any prefix and suffix specified with the `-P' and `-S' -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. -

- -If the previously-applied actions do not generate any matches, and the -`-o dirnames' option was supplied to complete when the -compspec was defined, directory name completion is attempted. -

- -If the `-o plusdirs' option was supplied to complete when -the compspec was defined, directory name completion is attempted and any -matches are added to the results of the other actions. -

- -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 Bash completions are not attempted, and the Readline default -of filename completion is disabled. -If the `-o bashdefault' option was supplied to complete when -the compspec was defined, the default Bash completions are attempted -if the compspec generates no matches. -If the `-o default' option was supplied to complete when the -compspec was defined, Readline's default completion will be performed -if the compspec (and, if attempted, the default Bash completions) -generate no matches. -

- -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 mark-directories Readline variable, regardless -of the setting of the mark-symlinked-directories Readline variable. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

8.7 Programmable Completion Builtins

- -

- -Two builtin commands are available to manipulate the programmable completion -facilities. -

- -

-
compgen -
-
 
compgen [option] [word]
-

- -Generate possible completion matches for word according to -the options, which may be any option accepted by the -complete -builtin with the exception of `-p' and `-r', and write -the matches to the standard output. -When using the `-F' or `-C' options, the various shell variables -set by the programmable completion facilities, while available, will not -have useful values. -

- -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 word is specified, only those completions matching word -will be displayed. -

- -The return value is true unless an invalid option is supplied, or no -matches were generated. -

- -

complete -
-
 
complete [-abcdefgjksuv] [-o comp-option] [-A action] [-G globpat] [-W wordlist]
-[-F function] [-C command] [-X filterpat]
-[-P prefix] [-S suffix] name [name ...]
-complete -pr [name ...]
-

- -Specify how arguments to each name should be completed. -If the `-p' 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 `-r' option removes a completion specification for -each name, or, if no names are supplied, all -completion specifications. -

- -The process of applying these completion specifications when word completion -is attempted is described above (see section 8.6 Programmable Completion). -

- -Other options, if specified, have the following meanings. -The arguments to the `-G', `-W', and `-X' options -(and, if necessary, the `-P' and `-S' options) -should be quoted to protect them from expansion before the -complete builtin is invoked. -

- -

-
-o comp-option -
The comp-option controls several aspects of the compspec's behavior -beyond the simple generation of completions. -comp-option may be one of: -

- -

- -
bashdefault -
Perform the rest of the default Bash completions if the compspec -generates no matches. -

- -

default -
Use Readline's default filename completion if the compspec generates -no matches. -

- -

dirnames -
Perform directory name completion if the compspec generates no matches. -

- -

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). This option is intended to be used with -shell functions specified with `-F'. -

- -

nospace -
Tell Readline not to append a space (the default) to words completed at -the end of the line. -

- -

plusdirs -
After any matches defined by the compspec are generated, -directory name completion is attempted and any -matches are added to the results of the other actions. -

- -

-

- -

-A action -
The action may be one of the following to generate a list of possible -completions: -

- -

-
alias -
Alias names. May also be specified as `-a'. -

- -

arrayvar -
Array variable names. -

- -

binding -
Readline key binding names (see section 8.4 Bindable Readline Commands). -

- -

builtin -
Names of shell builtin commands. May also be specified as `-b'. -

- -

command -
Command names. May also be specified as `-c'. -

- -

directory -
Directory names. May also be specified as `-d'. -

- -

disabled -
Names of disabled shell builtins. -

- -

enabled -
Names of enabled shell builtins. -

- -

export -
Names of exported shell variables. May also be specified as `-e'. -

- -

file -
File names. May also be specified as `-f'. -

- -

function -
Names of shell functions. -

- -

group -
Group names. May also be specified as `-g'. -

- -

helptopic -
Help topics as accepted by the help builtin (see section 4.2 Bash Builtin Commands). -

- -

hostname -
Hostnames, as taken from the file specified by the -HOSTFILE shell variable (see section 5.2 Bash Variables). -

- -

job -
Job names, if job control is active. May also be specified as `-j'. -

- -

keyword -
Shell reserved words. May also be specified as `-k'. -

- -

running -
Names of running jobs, if job control is active. -

- -

service -
Service names. May also be specified as `-s'. -

- -

setopt -
Valid arguments for the `-o' option to the set builtin -(see section 4.3.1 The Set Builtin). -

- -

shopt -
Shell option names as accepted by the shopt builtin -(see section 4.2 Bash Builtin Commands). -

- -

signal -
Signal names. -

- -

stopped -
Names of stopped jobs, if job control is active. -

- -

user -
User names. May also be specified as `-u'. -

- -

variable -
Names of all shell variables. May also be specified as `-v'. -
-

- -

-G globpat -
The filename expansion pattern globpat is expanded to generate -the possible completions. -

- -

-W wordlist -
The wordlist is split using the characters in the -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. -

- -

-C command -
command is executed in a subshell environment, and its output is -used as the possible completions. -

- -

-F function -
The shell function function is executed in the current shell -environment. -When it finishes, the possible completions are retrieved from the value -of the COMPREPLY array variable. -

- -

-X filterpat -
filterpat 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 -filterpat is removed from the list. -A leading `!' in filterpat negates the pattern; in this -case, any completion not matching filterpat is removed. -

- -

-P prefix -
prefix is added at the beginning of each possible completion -after all other options have been applied. -

- -

-S suffix -
suffix is appended to each possible completion -after all other options have been applied. -
-

- -The return value is true unless an invalid option is supplied, an option -other than `-p' or `-r' is supplied without a name -argument, an attempt is made to remove a completion specification for -a name for which no specification exists, or -an error occurs adding a completion specification. -

- -

- -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9. Using History Interactively

- -

- -This chapter describes how to use the GNU History Library -interactively, from a user's standpoint. -It should be considered a user's guide. -For information on using the GNU History Library in other programs, -see the GNU Readline Library Manual. -

- -

- - - -
9.1 Bash History Facilities  How Bash lets you manipulate your command - history.
9.2 Bash History Builtins  The Bash builtin commands that manipulate - the command history.
9.3 History Expansion  What it feels like using History as a user.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.1 Bash History Facilities

- -

- -When the `-o history' option to the set builtin -is enabled (see section 4.3.1 The Set Builtin), -the shell provides access to the command history, -the list of commands previously typed. -The value of the HISTSIZE shell variable is used as the -number of commands to save in a history list. -The text of the last $HISTSIZE -commands (default 500) is saved. -The shell stores each command in the history list prior to -parameter and variable expansion -but after history expansion is performed, subject to the -values of the shell variables -HISTIGNORE and HISTCONTROL. -

- -When the shell starts up, the history is initialized from the -file named by the HISTFILE variable (default `~/.bash_history'). -The file named by the value of HISTFILE is truncated, if -necessary, to contain no more than the number of lines specified by -the value of the HISTFILESIZE variable. -When an interactive shell exits, the last -$HISTSIZE lines are copied from the history list to the file -named by $HISTFILE. -If the histappend shell option is set (see section 4.2 Bash Builtin Commands), -the lines are appended to the history file, -otherwise the history file is overwritten. -If 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 $HISTFILESIZE -lines. If HISTFILESIZE is not set, no truncation is performed. -

- -If the HISTTIMEFORMAT is set, the time stamp information -associated with each history entry is written to the history file. -

- -The builtin command fc may be used to list or edit and re-execute -a portion of the history list. -The 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 (see section 8.4.2 Commands For Manipulating The History). -

- -The shell allows control over which commands are saved on the history -list. The HISTCONTROL and HISTIGNORE -variables may be set to cause the shell to save only a subset of the -commands entered. -The 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 lithist -shell option causes the shell to save the command with embedded newlines -instead of semicolons. -The shopt builtin is used to set these options. -See section 4.2 Bash Builtin Commands, for a description of shopt. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.2 Bash History Builtins

- -

- -Bash provides two builtin commands which manipulate the -history list and history file. -

- -

- -
fc -
-
 
fc [-e ename] [-lnr] [first] [last]
-fc -s [pat=rep] [command]
-

- -Fix Command. In the first form, a range of commands from first to -last is selected from the history list. Both first and -last may be specified as a string (to locate the most recent -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 last is not specified it is set to -first. If first is not specified it is set to the previous -command for editing and -16 for listing. If the `-l' flag is -given, the commands are listed on standard output. The `-n' flag -suppresses the command numbers when listing. The `-r' flag -reverses the order of the listing. Otherwise, the editor given by -ename is invoked on a file containing those commands. If -ename is not given, the value of the following variable expansion -is used: ${FCEDIT:-${EDITOR:-vi}}. This says to use the -value of the FCEDIT variable if set, or the value of the -EDITOR variable if that is set, or vi if neither is set. -When editing is complete, the edited commands are echoed and executed. -

- -In the second form, command is re-executed after each instance -of pat in the selected command is replaced by rep. -

- -A useful alias to use with the fc command is r='fc -s', so -that typing `r cc' runs the last command beginning with cc -and typing `r' re-executes the last command (see section 6.6 Aliases). -

- -

history -
-
 
history [n]
-history -c
-history -d offset
-history [-anrw] [filename]
-history -ps arg
-

- -With no options, display the history list with line numbers. -Lines prefixed with a `*' have been modified. -An argument of n lists only the last n lines. -If the shell variable HISTTIMEFORMAT is set and not null, -it is used as a format string for strftime to display -the time stamp associated with each displayed history entry. -No intervening blank is printed between the formatted time stamp -and the history line. -

- -Options, if supplied, have the following meanings: -

- -

-
-c -
Clear the history list. This may be combined -with the other options to replace the history list completely. -

- -

-d offset -
Delete the history entry at position offset. -offset should be specified as it appears when the history is -displayed. -

- -

-a -
Append the new -history lines (history lines entered since the beginning of the -current Bash session) to the history file. -

- -

-n -
Append the history lines not already read from the history file -to the current history list. These are lines appended to the history -file since the beginning of the current Bash session. -

- -

-r -
Read the current history file and append its contents to -the history list. -

- -

-w -
Write out the current history to the history file. -

- -

-p -
Perform history substitution on the args and display the result -on the standard output, without storing the results in the history list. -

- -

-s -
The args are added to the end of -the history list as a single entry. -

- -

-

- -When any of the `-w', `-r', `-a', or `-n' options is -used, if filename -is given, then it is used as the history file. If not, then -the value of the HISTFILE variable is used. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.3 History Expansion

- -

- -The History library provides a history expansion feature that is similar -to the history expansion provided by csh. This section -describes the syntax used to manipulate the history information. -

- -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. -

- -History expansion takes place in two parts. The first is to determine -which line from the history list should be used during substitution. -The second is to select portions of that line for inclusion into the -current one. The line selected from the history is called the -event, and the portions of that line that are acted upon are -called words. Various modifiers are available to manipulate -the selected words. The line is broken into words in the same fashion -that Bash does, so that several words -surrounded by quotes are considered one word. -History expansions are introduced by the appearance of the -history expansion character, which is `!' by default. -Only `\' and `'' may be used to escape the history expansion -character. -

- -Several shell options settable with the shopt -builtin (see section 4.2 Bash Builtin Commands) may be used to tailor -the behavior of history expansion. If the -histverify shell option is enabled, and Readline -is being used, history substitutions are not immediately passed to -the shell parser. -Instead, the expanded line is reloaded into the Readline -editing buffer for further modification. -If Readline is being used, and the histreedit -shell option is enabled, a failed history expansion will be -reloaded into the Readline editing buffer for correction. -The `-p' option to the history builtin command -may be used to see what a history expansion will do before using it. -The `-s' option to the 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. -This is most useful in conjunction with Readline. -

- -The shell allows control of the various characters used by the -history expansion mechanism with the histchars variable. -

- -

- - - -
9.3.1 Event Designators  How to specify which history line to use.
9.3.2 Word Designators  Specifying which words are of interest.
9.3.3 Modifiers  Modifying the results of substitution.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.3.1 Event Designators

- -

- -An event designator is a reference to a command line entry in the -history list. - -

- -

- -
! -
Start a history substitution, except when followed by a space, tab, -the end of the line, `=' or `(' (when the -extglob shell option is enabled using the shopt builtin). -

- -

!n -
Refer to command line n. -

- -

!-n -
Refer to the command n lines back. -

- -

!! -
Refer to the previous command. This is a synonym for `!-1'. -

- -

!string -
Refer to the most recent command starting with string. -

- -

!?string[?] -
Refer to the most recent command containing string. The trailing -`?' may be omitted if the string is followed immediately by -a newline. -

- -

^string1^string2^ -
Quick Substitution. Repeat the last command, replacing string1 -with string2. Equivalent to -!!:s/string1/string2/. -

- -

!# -
The entire command line typed so far. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.3.2 Word Designators

- -

- -Word designators are used to select desired words from the event. -A `:' separates the event specification from the word designator. It -may be omitted if the word designator begins with a `^', `$', -`*', `-', or `%'. 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. -

- -For example, -

- -

-
!! -
designates the preceding command. When you type this, the preceding -command is repeated in toto. -

- -

!!:$ -
designates the last argument of the preceding command. This may be -shortened to !$. -

- -

!fi:2 -
designates the second argument of the most recent command starting with -the letters fi. -
-

- -Here are the word designators: - -

- -
0 (zero) -
The 0th word. For many applications, this is the command word. -

- -

n -
The nth word. -

- -

^ -
The first argument; that is, word 1. -

- -

$ -
The last argument. -

- -

% -
The word matched by the most recent `?string?' search. -

- -

x-y -
A range of words; `-y' abbreviates `0-y'. -

- -

* -
All of the words, except the 0th. This is a synonym for `1-$'. -It is not an error to use `*' if there is just one word in the event; -the empty string is returned in that case. -

- -

x* -
Abbreviates `x-$' -

- -

x- -
Abbreviates `x-$' like `x*', but omits the last word. -

- -

-

- -If a word designator is supplied without an event specification, the -previous command is used as the event. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

9.3.3 Modifiers

- -

- -After the optional word designator, you can add a sequence of one or more -of the following modifiers, each preceded by a `:'. -

- -

- -
h -
Remove a trailing pathname component, leaving only the head. -

- -

t -
Remove all leading pathname components, leaving the tail. -

- -

r -
Remove a trailing suffix of the form `.suffix', leaving -the basename. -

- -

e -
Remove all but the trailing suffix. -

- -

p -
Print the new command but do not execute it. -

- -

q -
Quote the substituted words, escaping further substitutions. -

- -

x -
Quote the substituted words as with `q', -but break into words at spaces, tabs, and newlines. -

- -

s/old/new/ -
Substitute new for the first occurrence of old in the -event line. Any delimiter may be used in place of `/'. -The delimiter may be quoted in old and new -with a single backslash. If `&' appears in new, -it is replaced by old. A single backslash will quote -the `&'. The final delimiter is optional if it is the last -character on the input line. -

- -

& -
Repeat the previous substitution. -

- -

g -
a -
Cause changes to be applied over the entire event line. Used in -conjunction with `s', as in gs/old/new/, -or with `&'. -

- -

G -
Apply the following `s' modifier once to each word in the event. -

- -

-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10. Installing Bash

- -

- -This chapter provides basic instructions for installing Bash on -the various supported platforms. The distribution supports the -GNU operating systems, nearly every version of Unix, and several -non-Unix systems such as BeOS and Interix. -Other independent ports exist for -MS-DOS, OS/2, and Windows platforms. -

- -

- - - - - - - - -
10.1 Basic Installation  Installation instructions.
10.2 Compilers and Options  How to set special options for various - systems.
10.3 Compiling For Multiple Architectures  How to compile Bash for more - than one kind of system from - the same source tree.
10.4 Installation Names  How to set the various paths used by the installation.
10.5 Specifying the System Type  How to configure Bash for a particular system.
10.6 Sharing Defaults  How to share default configuration values among GNU - programs.
10.7 Operation Controls  Options recognized by the configuration program.
10.8 Optional Features  How to enable and disable optional features when - building Bash.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.1 Basic Installation

- -

- -These are installation instructions for Bash. -

- -The simplest way to compile Bash is: -

- -

    -
  1. -cd to the directory containing the source code and type -`./configure' to configure Bash for your system. If you're -using csh on an old version of System V, you might need to -type `sh ./configure' instead to prevent csh from trying -to execute configure itself. -

    - -Running configure takes some time. -While running, it prints messages telling which features it is -checking for. -

    - -

  2. -Type `make' to compile Bash and build the bashbug bug -reporting script. -

    - -

  3. -Optionally, type `make tests' to run the Bash test suite. -

    - -

  4. -Type `make install' to install bash and bashbug. -This will also install the manual pages and Info file. -

    - -

-

- -The configure shell script attempts to guess correct -values for various system-dependent variables used during -compilation. It uses those values to create a `Makefile' in -each directory of the package (the top directory, the -`builtins', `doc', and `support' directories, -each directory under `lib', and several others). It also creates a -`config.h' file containing system-dependent definitions. -Finally, it creates a shell script named config.status that you -can run in the future to recreate the current configuration, a -file `config.cache' that saves the results of its tests to -speed up reconfiguring, and a file `config.log' containing -compiler output (useful mainly for debugging configure). -If at some point -`config.cache' contains results you don't want to keep, you -may remove or edit it. -

- -To find out more about the options and arguments that the -configure script understands, type -

- -
 
bash-2.04$ ./configure --help
-

- -at the Bash prompt in your Bash source directory. -

- -If you need to do unusual things to compile Bash, please -try to figure out how configure could check whether or not -to do them, and mail diffs or instructions to -bash-maintainers@gnu.org so they can be -considered for the next release. -

- -The file `configure.in' is used to create configure -by a program called Autoconf. You only need -`configure.in' if you want to change it or regenerate -configure using a newer version of Autoconf. If -you do this, make sure you are using Autoconf version 2.50 or -newer. -

- -You can remove the program binaries and object files from the -source code directory by typing `make clean'. To also remove the -files that configure created (so you can compile Bash for -a different kind of computer), type `make distclean'. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.2 Compilers and Options

- -

- -Some systems require unusual options for compilation or linking -that the configure script does not know about. You can -give configure initial values for variables by setting -them in the environment. Using a Bourne-compatible shell, you -can do that on the command line like this: -

- -
 
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-

- -On systems that have the env program, you can do it like this: -

- -
 
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-

- -The configuration process uses GCC to build Bash if it -is available. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.3 Compiling For Multiple Architectures

- -

- -You can compile Bash for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of make that -supports the VPATH variable, such as GNU make. -cd to the -directory where you want the object files and executables to go and run -the configure script from the source directory. You may need to -supply the `--srcdir=PATH' argument to tell configure where the -source files are. configure automatically checks for the -source code in the directory that configure is in and in `..'. -

- -If you have to use a make that does not supports the VPATH -variable, you can compile Bash for one architecture at a -time in the source code directory. After you have installed -Bash for one architecture, use `make distclean' before -reconfiguring for another architecture. -

- -Alternatively, if your system supports symbolic links, you can use the -`support/mkclone' script to create a build tree which has -symbolic links back to each file in the source directory. Here's an -example that creates a build directory in the current directory from a -source directory `/usr/gnu/src/bash-2.0': -

- -
 
bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
-

- -The mkclone script requires Bash, so you must have already built -Bash for at least one architecture before you can create build -directories for other architectures. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.4 Installation Names

- -

- -By default, `make install' will install into -`/usr/local/bin', `/usr/local/man', etc. You can -specify an installation prefix other than `/usr/local' by -giving configure the option `--prefix=PATH', -or by specifying a value for the DESTDIR `make' -variable when running `make install'. -

- -You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. -If you give configure the option -`--exec-prefix=PATH', `make install' will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.5 Specifying the System Type

- -

- -There may be some features configure can not figure out -automatically, but need to determine by the type of host Bash -will run on. Usually configure can figure that -out, but if it prints a message saying it can not guess the host -type, give it the `--host=TYPE' option. `TYPE' can -either be a short name for the system type, such as `sun4', -or a canonical name with three fields: `CPU-COMPANY-SYSTEM' -(e.g., `i386-unknown-freebsd4.2'). -

- -See the file `support/config.sub' for the possible -values of each field. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.6 Sharing Defaults

- -

- -If you want to set default values for configure scripts to -share, you can create a site shell script called -config.site that gives default values for variables like -CC, cache_file, and prefix. configure -looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -CONFIG_SITE environment variable to the location of the site -script. A warning: the Bash configure looks for a site script, -but not all configure scripts do. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.7 Operation Controls

- -

- -configure recognizes the following options to control how it -operates. -

- -

- -
--cache-file=file -
Use and save the results of the tests in -file instead of `./config.cache'. Set file to -`/dev/null' to disable caching, for debugging -configure. -

- -

--help -
Print a summary of the options to configure, and exit. -

- -

--quiet -
--silent -
-q -
Do not print messages saying which checks are being made. -

- -

--srcdir=dir -
Look for the Bash source code in directory dir. Usually -configure can determine that directory automatically. -

- -

--version -
Print the version of Autoconf used to generate the configure -script, and exit. -
-

- -configure also accepts some other, not widely used, boilerplate -options. `configure --help' prints the complete list. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

10.8 Optional Features

- -

- -The Bash configure has a number of `--enable-feature' -options, where feature indicates an optional part of Bash. -There are also several `--with-package' options, -where package is something like `bash-malloc' or `purify'. -To turn off the default use of a package, use -`--without-package'. To configure Bash without a feature -that is enabled by default, use `--disable-feature'. -

- -Here is a complete list of the `--enable-' and -`--with-' options that the Bash configure recognizes. -

- -

-
--with-afs -
Define if you are using the Andrew File System from Transarc. -

- -

--with-bash-malloc -
Use the Bash version of -malloc in the directory `lib/malloc'. This is not the same -malloc that appears in GNU libc, but an older version -originally derived from the 4.2 BSD malloc. This malloc -is very fast, but wastes some space on each allocation. -This option is enabled by default. -The `NOTES' file contains a list of systems for -which this should be turned off, and configure disables this -option automatically for a number of systems. -

- -

--with-curses -
Use the curses library instead of the termcap library. This should -be supplied if your system has an inadequate or incomplete termcap -database. -

- -

--with-gnu-malloc -
A synonym for --with-bash-malloc. -

- -

--with-installed-readline[=PREFIX] -
Define this to make Bash link with a locally-installed version of Readline -rather than the version in `lib/readline'. This works only with -Readline 5.0 and later versions. If PREFIX is yes or not -supplied, configure uses the values of the make variables -includedir and libdir, which are subdirectories of prefix -by default, to find the installed version of Readline if it is not in -the standard system include and library directories. -If PREFIX is no, Bash links with the version in -`lib/readline'. -If PREFIX is set to any other value, configure treats it as -a directory pathname and looks for -the installed version of Readline in subdirectories of that directory -(include files in PREFIX/include and the library in -PREFIX/lib). -

- -

--with-purify -
Define this to use the Purify memory allocation checker from Rational -Software. -

- -

--enable-minimal-config -
This produces a shell with minimal features, close to the historical -Bourne shell. -
-

- -There are several `--enable-' options that alter how Bash is -compiled and linked, rather than changing run-time features. -

- -

-
--enable-largefile -
Enable support for large files if the operating system requires special compiler options -to build programs which can access large files. This is enabled by -default, if the operating system provides large file support. -

- -

--enable-profiling -
This builds a Bash binary that produces profiling information to be -processed by gprof each time it is executed. -

- -

--enable-static-link -
This causes Bash to be linked statically, if gcc is being used. -This could be used to build a version to use as root's shell. -
-

- -The `minimal-config' option can be used to disable all of -the following options, but it is processed first, so individual -options may be enabled using `enable-feature'. -

- -All of the following options except for `disabled-builtins' and -`xpg-echo-default' are -enabled by default, unless the operating system does not provide the -necessary support. -

- -

-
--enable-alias -
Allow alias expansion and include the alias and unalias -builtins (see section 6.6 Aliases). -

- -

--enable-arith-for-command -
Include support for the alternate form of the for command -that behaves like the C language for statement -(see section 3.2.4.1 Looping Constructs). -

- -

--enable-array-variables -
Include support for one-dimensional array shell variables -(see section 6.7 Arrays). -

- -

--enable-bang-history -
Include support for csh-like history substitution -(see section 9.3 History Expansion). -

- -

--enable-brace-expansion -
Include csh-like brace expansion -( b{a,b}c ==> bac bbc ). -See 3.5.1 Brace Expansion, for a complete description. -

- -

--enable-command-timing -
Include support for recognizing time as a reserved word and for -displaying timing statistics for the pipeline following time -(see section 3.2.2 Pipelines). -This allows pipelines as well as shell builtins and functions to be timed. -

- -

--enable-cond-command -
Include support for the [[ conditional command. -(see section 3.2.4.2 Conditional Constructs). -

- -

--enable-cond-regexp -
Include support for matching POSIX regular expressions using the -`=~' binary operator in the [[ conditional command. -(see section 3.2.4.2 Conditional Constructs). -

- -

--enable-debugger -
Include support for the bash debugger (distributed separately). -

- -

--enable-directory-stack -
Include support for a csh-like directory stack and the -pushd, popd, and dirs builtins -(see section 6.8 The Directory Stack). -

- -

--enable-disabled-builtins -
Allow builtin commands to be invoked via `builtin xxx' -even after xxx has been disabled using `enable -n xxx'. -See 4.2 Bash Builtin Commands, for details of the builtin and -enable builtin commands. -

- -

--enable-dparen-arithmetic -
Include support for the ((...)) command -(see section 3.2.4.2 Conditional Constructs). -

- -

--enable-extended-glob -
Include support for the extended pattern matching features described -above under 3.5.8.1 Pattern Matching. -

- -

--enable-help-builtin -
Include the help builtin, which displays help on shell builtins and -variables (see section 4.2 Bash Builtin Commands). -

- -

--enable-history -
Include command history and the fc and history -builtin commands (see section 9.1 Bash History Facilities). -

- -

--enable-job-control -
This enables the job control features (see section 7. Job Control), -if the operating system supports them. -

- -

--enable-multibyte -
This enables support for multibyte characters if the operating -system provides the necessary support. -

- -

--enable-net-redirections -
This enables the special handling of filenames of the form -/dev/tcp/host/port and -/dev/udp/host/port -when used in redirections (see section 3.6 Redirections). -

- -

--enable-process-substitution -
This enables process substitution (see section 3.5.6 Process Substitution) if -the operating system provides the necessary support. -

- -

--enable-progcomp -
Enable the programmable completion facilities -(see section 8.6 Programmable Completion). -If Readline is not enabled, this option has no effect. -

- -

--enable-prompt-string-decoding -
Turn on the interpretation of a number of backslash-escaped characters -in the $PS1, $PS2, $PS3, and $PS4 prompt -strings. See 6.9 Controlling the Prompt, for a complete list of prompt -string escape sequences. -

- -

--enable-readline -
Include support for command-line editing and history with the Bash -version of the Readline library (see section 8. Command Line Editing). -

- -

--enable-restricted -
Include support for a restricted shell. If this is enabled, Bash, -when called as rbash, enters a restricted mode. See -6.10 The Restricted Shell, for a description of restricted mode. -

- -

--enable-select -
Include the select builtin, which allows the generation of simple -menus (see section 3.2.4.2 Conditional Constructs). -

- -

--enable-separate-helpfiles -
Use external files for the documentation displayed by the help builtin -instead of storing the text internally. -

- -

--enable-single-help-strings -
Store the text displayed by the help builtin as a single string for -each help topic. This aids in translating the text to different languages. -You may need to disable this if your compiler cannot handle very long string -literals. -

- -

--enable-strict-posix-default -
Make Bash POSIX-conformant by default (see section 6.11 Bash POSIX Mode). -

- -

--enable-usg-echo-default -
A synonym for --enable-xpg-echo-default. -

- -

--enable-xpg-echo-default -
Make the echo builtin expand backslash-escaped characters by default, -without requiring the `-e' option. -This sets the default value of the xpg_echo shell option to on, -which makes the Bash echo behave more like the version specified in -the Single Unix Specification, version 3. -See section 4.2 Bash Builtin Commands, for a description of the escape sequences that -echo recognizes. -

- -

-

- -The file `config-top.h' contains C Preprocessor -`#define' statements for options which are not settable from -configure. -Some of these are not meant to be changed; beware of the consequences if -you do. -Read the comments associated with each definition for more -information about its effect. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

A. Reporting Bugs

- -

- -Please report all bugs you find in Bash. -But first, you should -make sure that it really is a bug, and that it appears in the latest -version of Bash. -The latest version of Bash is always available for FTP from -ftp://ftp.gnu.org/pub/bash/. -

- -Once you have determined that a bug actually exists, use the -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 bug-bash@gnu.org or posted to the Usenet -newsgroup gnu.bash.bug. -

- -All bug reports should include: -

    -
  • -The version number of Bash. -
  • -The hardware and operating system. -
  • -The compiler used to compile Bash. -
  • -A description of the bug behaviour. -
  • -A short script or `recipe' which exercises the bug and may be used -to reproduce it. -
-

- -bashbug inserts the first three items automatically into -the template it provides for filing a bug report. -

- -Please send all reports concerning this manual to -chet@po.CWRU.Edu. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

B. Major Differences From The Bourne Shell

- -

- -Bash implements essentially the same grammar, parameter and -variable expansion, redirection, and quoting as the Bourne Shell. -Bash uses the POSIX standard as the specification of -how these features are to be implemented. There are some -differences between the traditional Bourne shell and Bash; this -section quickly details the differences of significance. A -number of these differences are explained in greater depth in -previous sections. -This section uses the version of sh included in SVR4.2 (the -last version of the historical Bourne shell) as the baseline reference. -

- -

    - -
  • -Bash is POSIX-conformant, even where the POSIX specification -differs from traditional sh behavior (see section 6.11 Bash POSIX Mode). -

    - -

  • -Bash has multi-character invocation options (see section 6.1 Invoking Bash). -

    - -

  • -Bash has command-line editing (see section 8. Command Line Editing) and -the bind builtin. -

    - -

  • -Bash provides a programmable word completion mechanism -(see section 8.6 Programmable Completion), and two builtin commands, -complete and compgen, to manipulate it. -

    - -

  • -Bash has command history (see section 9.1 Bash History Facilities) and the -history and fc builtins to manipulate it. -The Bash history list maintains timestamp information and uses the -value of the HISTTIMEFORMAT variable to display it. -

    - -

  • -Bash implements csh-like history expansion -(see section 9.3 History Expansion). -

    - -

  • -Bash has one-dimensional array variables (see section 6.7 Arrays), and the -appropriate variable expansions and assignment syntax to use them. -Several of the Bash builtins take options to act on arrays. -Bash provides a number of built-in array variables. -

    - -

  • -The $'...' quoting syntax, which expands ANSI-C -backslash-escaped characters in the text between the single quotes, -is supported (see section 3.1.2.4 ANSI-C Quoting). -

    - -

  • -Bash supports the $"..." quoting syntax to do -locale-specific translation of the characters between the double -quotes. The `-D', `--dump-strings', and `--dump-po-strings' -invocation options list the translatable strings found in a script -(see section 3.1.2.5 Locale-Specific Translation). -

    - -

  • -Bash implements the ! keyword to negate the return value of -a pipeline (see section 3.2.2 Pipelines). -Very useful when an if statement needs to act only if a test fails. -The Bash `-o pipefail' option to set will cause a pipeline to -return a failure status if any command fails. -

    - -

  • -Bash has the time reserved word and command timing (see section 3.2.2 Pipelines). -The display of the timing statistics may be controlled with the -TIMEFORMAT variable. -

    - -

  • -Bash implements the for (( expr1 ; expr2 ; expr3 )) -arithmetic for command, similar to the C language (see section 3.2.4.1 Looping Constructs). -

    - -

  • -Bash includes the select compound command, which allows the -generation of simple menus (see section 3.2.4.2 Conditional Constructs). -

    - -

  • -Bash includes the [[ compound command, which makes conditional -testing part of the shell grammar (see section 3.2.4.2 Conditional Constructs), including -optional regular expression matching. -

    - -

  • -Bash provides optional case-insensitive matching for the case and -[[ constructs. -

    - -

  • -Bash includes brace expansion (see section 3.5.1 Brace Expansion) and tilde -expansion (see section 3.5.2 Tilde Expansion). -

    - -

  • -Bash implements command aliases and the alias and unalias -builtins (see section 6.6 Aliases). -

    - -

  • -Bash provides shell arithmetic, the (( compound command -(see section 3.2.4.2 Conditional Constructs), -and arithmetic expansion (see section 6.5 Shell Arithmetic). -

    - -

  • -Variables present in the shell's initial environment are automatically -exported to child processes. The Bourne shell does not normally do -this unless the variables are explicitly marked using the export -command. -

    - -

  • -Bash supports the `+=' assignment operator, which appends to the value -of the variable named on the left hand side. -

    - -

  • -Bash includes the POSIX pattern removal `%', `#', `%%' -and `##' expansions to remove leading or trailing substrings from -variable values (see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -The expansion ${#xx}, which returns the length of ${xx}, -is supported (see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -The expansion ${var:offset[:length]}, -which expands to the substring of var's value of length -length, beginning at offset, is present -(see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -The expansion -${var/[/]pattern[/replacement]}, -which matches pattern and replaces it with replacement in -the value of var, is available (see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -The expansion ${!prefix}* expansion, which expands to -the names of all shell variables whose names begin with prefix, -is available (see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -Bash has indirect variable expansion using ${!word} -(see section 3.5.3 Shell Parameter Expansion). -

    - -

  • -Bash can expand positional parameters beyond $9 using -${num}. -

    - -

  • -The POSIX $() form of command substitution -is implemented (see section 3.5.4 Command Substitution), -and preferred to the Bourne shell's " (which -is also implemented for backwards compatibility). -

    - -

  • -Bash has process substitution (see section 3.5.6 Process Substitution). -

    - -

  • -Bash automatically assigns variables that provide information about the -current user (UID, EUID, and GROUPS), the current host -(HOSTTYPE, OSTYPE, MACHTYPE, and HOSTNAME), -and the instance of Bash that is running (BASH, -BASH_VERSION, and BASH_VERSINFO). See section 5.2 Bash Variables, -for details. -

    - -

  • -The IFS variable is used to split only the results of expansion, -not all words (see section 3.5.7 Word Splitting). -This closes a longstanding shell security hole. -

    - -

  • -Bash implements the full set of POSIX filename expansion operators, -including character classes, equivalence classes, and -collating symbols (see section 3.5.8 Filename Expansion). -

    - -

  • -Bash implements extended pattern matching features when the extglob -shell option is enabled (see section 3.5.8.1 Pattern Matching). -

    - -

  • -It is possible to have a variable and a function with the same name; -sh does not separate the two name spaces. -

    - -

  • -Bash functions are permitted to have local variables using the -local builtin, and thus useful recursive functions may be written -(see section 4.2 Bash Builtin Commands). -

    - -

  • -Variable assignments preceding commands affect only that command, even -builtins and functions (see section 3.7.4 Environment). -In sh, all variable assignments -preceding commands are global unless the command is executed from the -file system. -

    - -

  • -Bash performs filename expansion on filenames specified as operands -to input and output redirection operators (see section 3.6 Redirections). -

    - -

  • -Bash contains the `<>' redirection operator, allowing a file to be -opened for both reading and writing, and the `&>' redirection -operator, for directing standard output and standard error to the same -file (see section 3.6 Redirections). -

    - -

  • -Bash includes the `<<<' redirection operator, allowing a string to -be used as the standard input to a command. -

    - -

  • -Bash implements the `[n]<&word' and `[n]>&word' -redirection operators, which move one file descriptor to another. -

    - -

  • -Bash treats a number of filenames specially when they are -used in redirection operators (see section 3.6 Redirections). -

    - -

  • -Bash can open network connections to arbitrary machines and services -with the redirection operators (see section 3.6 Redirections). -

    - -

  • -The noclobber option is available to avoid overwriting existing -files with output redirection (see section 4.3.1 The Set Builtin). -The `>|' redirection operator may be used to override noclobber. -

    - -

  • -The Bash cd and pwd builtins (see section 4.1 Bourne Shell Builtins) -each take `-L' and `-P' options to switch between logical and -physical modes. -

    - -

  • -Bash allows a function to override a builtin with the same name, and provides -access to that builtin's functionality within the function via the -builtin and command builtins (see section 4.2 Bash Builtin Commands). -

    - -

  • -The command builtin allows selective disabling of functions -when command lookup is performed (see section 4.2 Bash Builtin Commands). -

    - -

  • -Individual builtins may be enabled or disabled using the enable -builtin (see section 4.2 Bash Builtin Commands). -

    - -

  • -The Bash exec builtin takes additional options that allow users -to control the contents of the environment passed to the executed -command, and what the zeroth argument to the command is to be -(see section 4.1 Bourne Shell Builtins). -

    - -

  • -Shell functions may be exported to children via the environment -using export -f (see section 3.3 Shell Functions). -

    - -

  • -The Bash export, readonly, and declare builtins can -take a `-f' option to act on shell functions, a `-p' option to -display variables with various attributes set in a format that can be -used as shell input, a `-n' option to remove various variable -attributes, and `name=value' arguments to set variable attributes -and values simultaneously. -

    - -

  • -The Bash hash builtin allows a name to be associated with -an arbitrary filename, even when that filename cannot be found by -searching the $PATH, using `hash -p' -(see section 4.1 Bourne Shell Builtins). -

    - -

  • -Bash includes a help builtin for quick reference to shell -facilities (see section 4.2 Bash Builtin Commands). -

    - -

  • -The printf builtin is available to display formatted output -(see section 4.2 Bash Builtin Commands). -

    - -

  • -The Bash read builtin (see section 4.2 Bash Builtin Commands) -will read a line ending in `\' with -the `-r' option, and will use the REPLY variable as a -default if no non-option arguments are supplied. -The Bash read builtin -also accepts a prompt string with the `-p' option and will use -Readline to obtain the line when given the `-e' option. -The read builtin also has additional options to control input: -the `-s' option will turn off echoing of input characters as -they are read, the `-t' option will allow read to time out -if input does not arrive within a specified number of seconds, the -`-n' option will allow reading only a specified number of -characters rather than a full line, and the `-d' option will read -until a particular character rather than newline. -

    - -

  • -The return builtin may be used to abort execution of scripts -executed with the . or source builtins -(see section 4.1 Bourne Shell Builtins). -

    - -

  • -Bash includes the shopt builtin, for finer control of shell -optional capabilities (see section 4.3.2 The Shopt Builtin), and allows these options -to be set and unset at shell invocation (see section 6.1 Invoking Bash). -

    - -

  • -Bash has much more optional behavior controllable with the set -builtin (see section 4.3.1 The Set Builtin). -

    - -

  • -The `-x' (xtrace) option displays commands other than -simple commands when performing an execution trace -(see section 4.3.1 The Set Builtin). -

    - -

  • -The test builtin (see section 4.1 Bourne Shell Builtins) -is slightly different, as it implements the POSIX algorithm, -which specifies the behavior based on the number of arguments. -

    - -

  • -Bash includes the caller builtin, which displays the context of -any active subroutine call (a shell function or a script executed with -the . or source builtins). This supports the bash -debugger. -

    - -

  • -The trap builtin (see section 4.1 Bourne Shell Builtins) allows a -DEBUG pseudo-signal specification, similar to EXIT. -Commands specified with a DEBUG trap are executed before every -simple command, for command, case command, -select command, every arithmetic for command, and before -the first command executes in a shell function. -The DEBUG trap is not inherited by shell functions unless the -function has been given the trace attribute or the -functrace option has been enabled using the shopt builtin. -The extdebug shell option has additional effects on the -DEBUG trap. -

    - -The trap builtin (see section 4.1 Bourne Shell Builtins) allows an -ERR pseudo-signal specification, similar to EXIT and DEBUG. -Commands specified with an ERR trap are executed after a simple -command fails, with a few exceptions. -The ERR trap is not inherited by shell functions unless the --o errtrace option to the set builtin is enabled. -

    - -The trap builtin (see section 4.1 Bourne Shell Builtins) allows a -RETURN pseudo-signal specification, similar to -EXIT and DEBUG. -Commands specified with an RETURN trap are executed before -execution resumes after a shell function or a shell script executed with -. or source returns. -The RETURN trap is not inherited by shell functions unless the -function has been given the trace attribute or the -functrace option has been enabled using the shopt builtin. -

    - -

  • -The Bash type builtin is more extensive and gives more information -about the names it finds (see section 4.2 Bash Builtin Commands). -

    - -

  • -The Bash umask builtin permits a `-p' option to cause -the output to be displayed in the form of a umask command -that may be reused as input (see section 4.1 Bourne Shell Builtins). -

    - -

  • -Bash implements a csh-like directory stack, and provides the -pushd, popd, and dirs builtins to manipulate it -(see section 6.8 The Directory Stack). -Bash also makes the directory stack visible as the value of the -DIRSTACK shell variable. -

    - -

  • -Bash interprets special backslash-escaped characters in the prompt -strings when interactive (see section 6.9 Controlling the Prompt). -

    - -

  • -The Bash restricted mode is more useful (see section 6.10 The Restricted Shell); -the SVR4.2 shell restricted mode is too limited. -

    - -

  • -The disown builtin can remove a job from the internal shell -job table (see section 7.2 Job Control Builtins) or suppress the sending -of SIGHUP to a job when the shell exits as the result of a -SIGHUP. -

    - -

  • -Bash includes a number of features to support a separate debugger for -shell scripts. -

    - -

  • -The SVR4.2 shell has two privilege-related builtins -(mldmode and priv) not present in Bash. -

    - -

  • -Bash does not have the stop or newgrp builtins. -

    - -

  • -Bash does not use the SHACCT variable or perform shell accounting. -

    - -

  • -The SVR4.2 sh uses a TIMEOUT variable like Bash uses -TMOUT. -

    - -

-

- -More features unique to Bash may be found in 6. Bash Features. -

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

B.1 Implementation Differences From The SVR4.2 Shell

- -

- -Since Bash is a completely new implementation, it does not suffer from -many of the limitations of the SVR4.2 shell. For instance: -

- -

    - -
  • -Bash does not fork a subshell when redirecting into or out of -a shell control structure such as an if or while -statement. -

    - -

  • -Bash does not allow unbalanced quotes. The SVR4.2 shell will silently -insert a needed closing quote at EOF under certain circumstances. -This can be the cause of some hard-to-find errors. -

    - -

  • -The SVR4.2 shell uses a baroque memory management scheme based on -trapping SIGSEGV. If the shell is started from a process with -SIGSEGV blocked (e.g., by using the system() C library -function call), it misbehaves badly. -

    - -

  • -In a questionable attempt at security, the SVR4.2 shell, -when invoked without the `-p' option, will alter its real -and effective UID and GID if they are less than some -magic threshold value, commonly 100. -This can lead to unexpected results. -

    - -

  • -The SVR4.2 shell does not allow users to trap SIGSEGV, -SIGALRM, or SIGCHLD. -

    - -

  • -The SVR4.2 shell does not allow the IFS, MAILCHECK, -PATH, PS1, or PS2 variables to be unset. -

    - -

  • -The SVR4.2 shell treats `^' as the undocumented equivalent of -`|'. -

    - -

  • -Bash allows multiple option arguments when it is invoked (-x -v); -the SVR4.2 shell allows only one option argument (-xv). In -fact, some versions of the shell dump core if the second argument begins -with a `-'. -

    - -

  • -The SVR4.2 shell exits a script if any builtin fails; Bash exits -a script only if one of the POSIX special builtins fails, and -only for certain failures, as enumerated in the POSIX standard. -

    - -

  • -The SVR4.2 shell behaves differently when invoked as jsh -(it turns on job control). -
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

C. Copying This Manual

- -

- -

- -
C.1 GNU Free Documentation License  License for copying this manual.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

C.1 GNU Free Documentation License

- -

- - -

- Version 1.2, November 2002 -
-

- -
 
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-

- -

    -
  1. -PREAMBLE -

    - -The purpose of this License is to make a manual, textbook, or other -functional and useful document free in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. -

    - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. -

    - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. -

    - -

  2. -APPLICABILITY AND DEFINITIONS -

    - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The "Document", below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as "you". You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. -

    - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. -

    - -A "Secondary Section" is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. -

    - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. -

    - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. -

    - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called "Opaque". -

    - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input -format, SGML or XML using a publicly available -DTD, and standard-conforming simple HTML, -PostScript or PDF designed for human modification. Examples -of transparent image formats include PNG, XCF and -JPG. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, SGML or -XML for which the DTD and/or processing tools are -not generally available, and the machine-generated HTML, -PostScript or PDF produced by some word processors for -output purposes only. -

    - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -

    - -A section "Entitled XYZ" means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as "Acknowledgements", -"Dedications", "Endorsements", or "History".) To "Preserve the Title" -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. -

    - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. -

    - -

  3. -VERBATIM COPYING -

    - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. -

    - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -

    - -

  4. -COPYING IN QUANTITY -

    - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. -

    - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. -

    - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. -

    - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -

    - -

  5. -MODIFICATIONS -

    - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: -

    - -

      -
    1. -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. -

      - -

    2. -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. -

      - -

    3. -State on the Title page the name of the publisher of the -Modified Version, as the publisher. -

      - -

    4. -Preserve all the copyright notices of the Document. -

      - -

    5. -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. -

      - -

    6. -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. -

      - -

    7. -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. -

      - -

    8. -Include an unaltered copy of this License. -

      - -

    9. -Preserve the section Entitled "History", Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled "History" in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. -

      - -

    10. -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the "History" section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. -

      - -

    11. -For any section Entitled "Acknowledgements" or "Dedications", Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. -

      - -

    12. -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. -

      - -

    13. -Delete any section Entitled "Endorsements". Such a section -may not be included in the Modified Version. -

      - -

    14. -Do not retitle any existing section to be Entitled "Endorsements" or -to conflict in title with any Invariant Section. -

      - -

    15. -Preserve any Warranty Disclaimers. -
    -

    - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. -

    - -You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. -

    - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. -

    - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -

    - -

  6. -COMBINING DOCUMENTS -

    - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. -

    - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. -

    - -In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all -sections Entitled "Endorsements." -

    - -

  7. -COLLECTIONS OF DOCUMENTS -

    - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. -

    - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -

    - -

  8. -AGGREGATION WITH INDEPENDENT WORKS -

    - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. -

    - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. -

    - -

  9. -TRANSLATION -

    - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. -

    - -If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. -

    - -

  10. -TERMINATION -

    - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -

    - -

  11. -FUTURE REVISIONS OF THIS LICENSE -

    - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. -

    - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -

-

- -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

C.1.1 ADDENDUM: How to use this License for your documents

- -

- -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: -

- -
 
  Copyright (C)  year  your name.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-

- -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: -

- -
 
    with the Invariant Sections being list their titles, with
-    the Front-Cover Texts being list, and with the Back-Cover Texts
-    being list.
-

- -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. -

- -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D. Indexes

- -

- -

- - - - - -
D.1 Index of Shell Builtin Commands  Index of Bash builtin commands.
D.2 Index of Shell Reserved Words  Index of Bash reserved words.
D.3 Parameter and Variable Index  Quick reference helps you find the - variable you want.
D.4 Function Index  Index of bindable Readline functions.
D.5 Concept Index  General index for concepts described in - this manual.
-

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D.1 Index of Shell Builtin Commands

- -
Jump to:   . -   -: -   -[ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -J -   -K -   -L -   -P -   -R -   -S -   -T -   -U -   -W -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

.
.4.1 Bourne Shell Builtins

:
:4.1 Bourne Shell Builtins

[
[4.1 Bourne Shell Builtins

A
alias4.2 Bash Builtin Commands

B
bg7.2 Job Control Builtins
bind4.2 Bash Builtin Commands
break4.1 Bourne Shell Builtins
builtin4.2 Bash Builtin Commands

C
caller4.2 Bash Builtin Commands
cd4.1 Bourne Shell Builtins
command4.2 Bash Builtin Commands
compgen8.7 Programmable Completion Builtins
complete8.7 Programmable Completion Builtins
continue4.1 Bourne Shell Builtins

D
declare4.2 Bash Builtin Commands
dirs6.8.1 Directory Stack Builtins
disown7.2 Job Control Builtins

E
echo4.2 Bash Builtin Commands
enable4.2 Bash Builtin Commands
eval4.1 Bourne Shell Builtins
exec4.1 Bourne Shell Builtins
exit4.1 Bourne Shell Builtins
export4.1 Bourne Shell Builtins

F
fc9.2 Bash History Builtins
fg7.2 Job Control Builtins

G
getopts4.1 Bourne Shell Builtins

H
hash4.1 Bourne Shell Builtins
help4.2 Bash Builtin Commands
history9.2 Bash History Builtins

J
jobs7.2 Job Control Builtins

K
kill7.2 Job Control Builtins

L
let4.2 Bash Builtin Commands
local4.2 Bash Builtin Commands
logout4.2 Bash Builtin Commands

P
popd6.8.1 Directory Stack Builtins
printf4.2 Bash Builtin Commands
pushd6.8.1 Directory Stack Builtins
pwd4.1 Bourne Shell Builtins

R
read4.2 Bash Builtin Commands
readonly4.1 Bourne Shell Builtins
return4.1 Bourne Shell Builtins

S
set4.3.1 The Set Builtin
shift4.1 Bourne Shell Builtins
shopt4.3.2 The Shopt Builtin
source4.2 Bash Builtin Commands
suspend7.2 Job Control Builtins

T
test4.1 Bourne Shell Builtins
times4.1 Bourne Shell Builtins
trap4.1 Bourne Shell Builtins
type4.2 Bash Builtin Commands
typeset4.2 Bash Builtin Commands

U
ulimit4.2 Bash Builtin Commands
umask4.1 Bourne Shell Builtins
unalias4.2 Bash Builtin Commands
unset4.1 Bourne Shell Builtins

W
wait7.2 Job Control Builtins

Jump to:   . -   -: -   -[ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -J -   -K -   -L -   -P -   -R -   -S -   -T -   -U -   -W -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D.2 Index of Shell Reserved Words

- -
Jump to:   ! -   -[ -   -] -   -{ -   -} -   -
-C -   -D -   -E -   -F -   -I -   -S -   -T -   -U -   -W -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

!
!3.2.2 Pipelines

[
[[3.2.4.2 Conditional Constructs

]
]]3.2.4.2 Conditional Constructs

{
{3.2.4.3 Grouping Commands

}
}3.2.4.3 Grouping Commands

C
case3.2.4.2 Conditional Constructs

D
do3.2.4.1 Looping Constructs
done3.2.4.1 Looping Constructs

E
elif3.2.4.2 Conditional Constructs
else3.2.4.2 Conditional Constructs
esac3.2.4.2 Conditional Constructs

F
fi3.2.4.2 Conditional Constructs
for3.2.4.1 Looping Constructs
function3.3 Shell Functions

I
if3.2.4.2 Conditional Constructs
in3.2.4.2 Conditional Constructs

S
select3.2.4.2 Conditional Constructs

T
then3.2.4.2 Conditional Constructs
time3.2.2 Pipelines

U
until3.2.4.1 Looping Constructs

W
while3.2.4.1 Looping Constructs

Jump to:   ! -   -[ -   -] -   -{ -   -} -   -
-C -   -D -   -E -   -F -   -I -   -S -   -T -   -U -   -W -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D.3 Parameter and Variable Index

- -
Jump to:   ! -   -# -   -$ -   -* -   -- -   -0 -   -? -   -@ -   -_ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -K -   -L -   -M -   -O -   -P -   -R -   -S -   -T -   -U -   -V -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

!
!3.4.2 Special Parameters
!3.4.2 Special Parameters

#
#3.4.2 Special Parameters
#3.4.2 Special Parameters

$
$3.4.2 Special Parameters
$3.4.2 Special Parameters

*
*3.4.2 Special Parameters
*3.4.2 Special Parameters

-
-3.4.2 Special Parameters
-3.4.2 Special Parameters

0
03.4.2 Special Parameters
03.4.2 Special Parameters

?
?3.4.2 Special Parameters
?3.4.2 Special Parameters

@
@3.4.2 Special Parameters
@3.4.2 Special Parameters

_
_3.4.2 Special Parameters
_3.4.2 Special Parameters

A
auto_resume7.3 Job Control Variables
auto_resume7.3 Job Control Variables

B
BASH5.2 Bash Variables
BASH5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGC5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_ARGV5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_COMMAND5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_ENV5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_EXECUTION_STRING5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_LINENO5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_REMATCH5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SOURCE5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_SUBSHELL5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSINFO5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASH_VERSION5.2 Bash Variables
BASHPID5.2 Bash Variables
BASHPID5.2 Bash Variables
bell-style8.3.1 Readline Init File Syntax
bind-tty-special-chars8.3.1 Readline Init File Syntax

C
CDPATH5.1 Bourne Shell Variables
CDPATH5.1 Bourne Shell Variables
COLUMNS5.2 Bash Variables
COLUMNS5.2 Bash Variables
comment-begin8.3.1 Readline Init File Syntax
COMP_CWORD5.2 Bash Variables
COMP_CWORD5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_KEY5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_LINE5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_POINT5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_TYPE5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDBREAKS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
COMP_WORDS5.2 Bash Variables
completion-query-items8.3.1 Readline Init File Syntax
COMPREPLY5.2 Bash Variables
COMPREPLY5.2 Bash Variables
convert-meta8.3.1 Readline Init File Syntax

D
DIRSTACK5.2 Bash Variables
DIRSTACK5.2 Bash Variables
disable-completion8.3.1 Readline Init File Syntax

E
editing-mode8.3.1 Readline Init File Syntax
EMACS5.2 Bash Variables
EMACS5.2 Bash Variables
enable-keypad8.3.1 Readline Init File Syntax
EUID5.2 Bash Variables
EUID5.2 Bash Variables
expand-tilde8.3.1 Readline Init File Syntax

F
FCEDIT5.2 Bash Variables
FCEDIT5.2 Bash Variables
FIGNORE5.2 Bash Variables
FIGNORE5.2 Bash Variables
FUNCNAME5.2 Bash Variables
FUNCNAME5.2 Bash Variables

G
GLOBIGNORE5.2 Bash Variables
GLOBIGNORE5.2 Bash Variables
GROUPS5.2 Bash Variables
GROUPS5.2 Bash Variables

H
histchars5.2 Bash Variables
histchars5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCMD5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTCONTROL5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTFILESIZE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
HISTIGNORE5.2 Bash Variables
history-preserve-point8.3.1 Readline Init File Syntax
HISTSIZE5.2 Bash Variables
HISTSIZE5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HISTTIMEFORMAT5.2 Bash Variables
HOME5.1 Bourne Shell Variables
HOME5.1 Bourne Shell Variables
horizontal-scroll-mode8.3.1 Readline Init File Syntax
HOSTFILE5.2 Bash Variables
HOSTFILE5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTNAME5.2 Bash Variables
HOSTTYPE5.2 Bash Variables
HOSTTYPE5.2 Bash Variables

I
IFS5.1 Bourne Shell Variables
IFS5.1 Bourne Shell Variables
IGNOREEOF5.2 Bash Variables
IGNOREEOF5.2 Bash Variables
input-meta8.3.1 Readline Init File Syntax
INPUTRC5.2 Bash Variables
INPUTRC5.2 Bash Variables
isearch-terminators8.3.1 Readline Init File Syntax

K
keymap8.3.1 Readline Init File Syntax

L
LANG5.2 Bash Variables
LANG5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_ALL5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_COLLATE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LC_CTYPE5.2 Bash Variables
LC_MESSAGES3.1.2.5 Locale-Specific Translation
LC_MESSAGES5.2 Bash Variables
LC_MESSAGES5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LC_NUMERIC5.2 Bash Variables
LINENO5.2 Bash Variables
LINENO5.2 Bash Variables
LINES5.2 Bash Variables
LINES5.2 Bash Variables

M
MACHTYPE5.2 Bash Variables
MACHTYPE5.2 Bash Variables
MAIL5.1 Bourne Shell Variables
MAIL5.1 Bourne Shell Variables
MAILCHECK5.2 Bash Variables
MAILCHECK5.2 Bash Variables
MAILPATH5.1 Bourne Shell Variables
MAILPATH5.1 Bourne Shell Variables
mark-modified-lines8.3.1 Readline Init File Syntax
mark-symlinked-directories8.3.1 Readline Init File Syntax
match-hidden-files8.3.1 Readline Init File Syntax
meta-flag8.3.1 Readline Init File Syntax

O
OLDPWD5.2 Bash Variables
OLDPWD5.2 Bash Variables
OPTARG5.1 Bourne Shell Variables
OPTARG5.1 Bourne Shell Variables
OPTERR5.2 Bash Variables
OPTERR5.2 Bash Variables
OPTIND5.1 Bourne Shell Variables
OPTIND5.1 Bourne Shell Variables
OSTYPE5.2 Bash Variables
OSTYPE5.2 Bash Variables
output-meta8.3.1 Readline Init File Syntax

P
page-completions8.3.1 Readline Init File Syntax
PATH5.1 Bourne Shell Variables
PATH5.1 Bourne Shell Variables
PIPESTATUS5.2 Bash Variables
PIPESTATUS5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
POSIXLY_CORRECT5.2 Bash Variables
PPID5.2 Bash Variables
PPID5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PROMPT_COMMAND5.2 Bash Variables
PS15.1 Bourne Shell Variables
PS15.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS25.1 Bourne Shell Variables
PS35.2 Bash Variables
PS35.2 Bash Variables
PS45.2 Bash Variables
PS45.2 Bash Variables
PWD5.2 Bash Variables
PWD5.2 Bash Variables

R
RANDOM5.2 Bash Variables
RANDOM5.2 Bash Variables
REPLY5.2 Bash Variables
REPLY5.2 Bash Variables

S
SECONDS5.2 Bash Variables
SECONDS5.2 Bash Variables
SHELL5.2 Bash Variables
SHELL5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHELLOPTS5.2 Bash Variables
SHLVL5.2 Bash Variables
SHLVL5.2 Bash Variables
show-all-if-ambiguous8.3.1 Readline Init File Syntax
show-all-if-unmodified8.3.1 Readline Init File Syntax

T
TEXTDOMAIN3.1.2.5 Locale-Specific Translation
TEXTDOMAINDIR3.1.2.5 Locale-Specific Translation
TIMEFORMAT5.2 Bash Variables
TIMEFORMAT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMOUT5.2 Bash Variables
TMPDIR5.2 Bash Variables
TMPDIR5.2 Bash Variables

U
UID5.2 Bash Variables
UID5.2 Bash Variables

V
visible-stats8.3.1 Readline Init File Syntax

Jump to:   ! -   -# -   -$ -   -* -   -- -   -0 -   -? -   -@ -   -_ -   -
-A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -K -   -L -   -M -   -O -   -P -   -R -   -S -   -T -   -U -   -V -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D.4 Function Index

- -
Jump to:   A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -K -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -U -   -Y -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

A
abort (C-g)8.4.8 Some Miscellaneous Commands
abort (C-g)8.4.8 Some Miscellaneous Commands
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
accept-line (Newline or Return)8.4.2 Commands For Manipulating The History
alias-expand-line ()8.4.8 Some Miscellaneous Commands
alias-expand-line ()8.4.8 Some Miscellaneous Commands

B
backward-char (C-b)8.4.1 Commands For Moving
backward-char (C-b)8.4.1 Commands For Moving
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-delete-char (Rubout)8.4.3 Commands For Changing Text
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-line (C-x Rubout)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-kill-word (M-DEL)8.4.4 Killing And Yanking
backward-word (M-b)8.4.1 Commands For Moving
backward-word (M-b)8.4.1 Commands For Moving
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-history (M-&#60;)8.4.2 Commands For Manipulating The History
beginning-of-line (C-a)8.4.1 Commands For Moving
beginning-of-line (C-a)8.4.1 Commands For Moving

C
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
call-last-kbd-macro (C-x e)8.4.7 Keyboard Macros
capitalize-word (M-c)8.4.3 Commands For Changing Text
capitalize-word (M-c)8.4.3 Commands For Changing Text
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search (C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
character-search-backward (M-C-])8.4.8 Some Miscellaneous Commands
clear-screen (C-l)8.4.1 Commands For Moving
clear-screen (C-l)8.4.1 Commands For Moving
complete (TAB)8.4.6 Letting Readline Type For You
complete (TAB)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-command (M-!)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-filename (M-/)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-hostname (M-@)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-into-braces (M-{)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-username (M-~)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
complete-variable (M-$)8.4.6 Letting Readline Type For You
copy-backward-word ()8.4.4 Killing And Yanking
copy-backward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-forward-word ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking
copy-region-as-kill ()8.4.4 Killing And Yanking

D
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char (C-d)8.4.3 Commands For Changing Text
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-char-or-list ()8.4.6 Letting Readline Type For You
delete-horizontal-space ()8.4.4 Killing And Yanking
delete-horizontal-space ()8.4.4 Killing And Yanking
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
digit-argument (M-0, M-1, <small>...</small> M--)8.4.5 Specifying Numeric Arguments
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
display-shell-version (C-x C-v)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
do-uppercase-version (M-a, M-b, M-x, <small>...</small>)8.4.8 Some Miscellaneous Commands
downcase-word (M-l)8.4.3 Commands For Changing Text
downcase-word (M-l)8.4.3 Commands For Changing Text
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-functions ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-macros ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dump-variables ()8.4.8 Some Miscellaneous Commands
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You
dynamic-complete-history (M-TAB)8.4.6 Letting Readline Type For You

E
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
edit-and-execute-command (C-xC-e)8.4.8 Some Miscellaneous Commands
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-kbd-macro (C-x ))8.4.7 Keyboard Macros
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-history (M-&#62;)8.4.2 Commands For Manipulating The History
end-of-line (C-e)8.4.1 Commands For Moving
end-of-line (C-e)8.4.1 Commands For Moving
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands
exchange-point-and-mark (C-x C-x)8.4.8 Some Miscellaneous Commands

F
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-backward-delete-char ()8.4.3 Commands For Changing Text
forward-char (C-f)8.4.1 Commands For Moving
forward-char (C-f)8.4.1 Commands For Moving
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-search-history (C-s)8.4.2 Commands For Manipulating The History
forward-word (M-f)8.4.1 Commands For Moving
forward-word (M-f)8.4.1 Commands For Moving

G
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-complete-word (M-g)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-expand-word (C-x *)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands
glob-list-expansions (C-x g)8.4.8 Some Miscellaneous Commands

H
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-and-alias-expand-line ()8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-expand-line (M-^)8.4.8 Some Miscellaneous Commands
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-backward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History
history-search-forward ()8.4.2 Commands For Manipulating The History

I
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-comment (M-#)8.4.8 Some Miscellaneous Commands
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-completions (M-*)8.4.6 Letting Readline Type For You
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands
insert-last-argument (M-. or M-_)8.4.8 Some Miscellaneous Commands

K
kill-line (C-k)8.4.4 Killing And Yanking
kill-line (C-k)8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-region ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-whole-line ()8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking
kill-word (M-d)8.4.4 Killing And Yanking

M
magic-space ()8.4.8 Some Miscellaneous Commands
magic-space ()8.4.8 Some Miscellaneous Commands
menu-complete ()8.4.6 Letting Readline Type For You
menu-complete ()8.4.6 Letting Readline Type For You

N
next-history (C-n)8.4.2 Commands For Manipulating The History
next-history (C-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-forward-search-history (M-n)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History
non-incremental-reverse-search-history (M-p)8.4.2 Commands For Manipulating The History

O
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
operate-and-get-next (C-o)8.4.8 Some Miscellaneous Commands
overwrite-mode ()8.4.3 Commands For Changing Text
overwrite-mode ()8.4.3 Commands For Changing Text

P
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-command-completions (C-x !)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-completions (M-?)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-filename-completions (C-x /)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-hostname-completions (C-x @)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-username-completions (C-x ~)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
possible-variable-completions (C-x $)8.4.6 Letting Readline Type For You
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
prefix-meta (ESC)8.4.8 Some Miscellaneous Commands
previous-history (C-p)8.4.2 Commands For Manipulating The History
previous-history (C-p)8.4.2 Commands For Manipulating The History

Q
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text
quoted-insert (C-q or C-v)8.4.3 Commands For Changing Text

R
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
re-read-init-file (C-x C-r)8.4.8 Some Miscellaneous Commands
redraw-current-line ()8.4.1 Commands For Moving
redraw-current-line ()8.4.1 Commands For Moving
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
reverse-search-history (C-r)8.4.2 Commands For Manipulating The History
revert-line (M-r)8.4.8 Some Miscellaneous Commands
revert-line (M-r)8.4.8 Some Miscellaneous Commands

S
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
self-insert (a, b, A, 1, !, <small>...</small>)8.4.3 Commands For Changing Text
set-mark (C-@)8.4.8 Some Miscellaneous Commands
set-mark (C-@)8.4.8 Some Miscellaneous Commands
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
shell-expand-line (M-C-e)8.4.8 Some Miscellaneous Commands
start-kbd-macro (C-x ()8.4.7 Keyboard Macros
start-kbd-macro (C-x ()8.4.7 Keyboard Macros

T
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
tilde-expand (M-&#38;)8.4.8 Some Miscellaneous Commands
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-chars (C-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text
transpose-words (M-t)8.4.3 Commands For Changing Text

U
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
undo (C-_ or C-x C-u)8.4.8 Some Miscellaneous Commands
universal-argument ()8.4.5 Specifying Numeric Arguments
universal-argument ()8.4.5 Specifying Numeric Arguments
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-filename-rubout ()8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-line-discard (C-u)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
unix-word-rubout (C-w)8.4.4 Killing And Yanking
upcase-word (M-u)8.4.3 Commands For Changing Text
upcase-word (M-u)8.4.3 Commands For Changing Text

Y
yank (C-y)8.4.4 Killing And Yanking
yank (C-y)8.4.4 Killing And Yanking
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-last-arg (M-. or M-_)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-nth-arg (M-C-y)8.4.2 Commands For Manipulating The History
yank-pop (M-y)8.4.4 Killing And Yanking
yank-pop (M-y)8.4.4 Killing And Yanking

Jump to:   A -   -B -   -C -   -D -   -E -   -F -   -G -   -H -   -I -   -K -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -U -   -Y -   -

- - -


- - - - - - - - - - - -
[ < ][ > ]   [ << ][ Up ][ >> ]         [Top][Contents][Index][ ? ]
-

D.5 Concept Index

- -
Jump to:   A -   -B -   -C -   -D -   -E -   -F -   -H -   -I -   -J -   -K -   -L -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -V -   -W -   -Y -   -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Index Entry Section

A
alias expansion6.6 Aliases
arithmetic evaluation6.5 Shell Arithmetic
arithmetic expansion3.5.5 Arithmetic Expansion
arithmetic, shell6.5 Shell Arithmetic
arrays6.7 Arrays

B
background7.1 Job Control Basics
Bash configuration10.1 Basic Installation
Bash installation10.1 Basic Installation
Bourne shell3. Basic Shell Features
brace expansion3.5.1 Brace Expansion
builtin2. Definitions

C
command editing8.2.1 Readline Bare Essentials
command execution3.7.2 Command Search and Execution
command expansion3.7.1 Simple Command Expansion
command history9.1 Bash History Facilities
command search3.7.2 Command Search and Execution
command substitution3.5.4 Command Substitution
command timing3.2.2 Pipelines
commands, compound3.2.4 Compound Commands
commands, conditional3.2.4.2 Conditional Constructs
commands, grouping3.2.4.3 Grouping Commands
commands, lists3.2.3 Lists of Commands
commands, looping3.2.4.1 Looping Constructs
commands, pipelines3.2.2 Pipelines
commands, shell3.2 Shell Commands
commands, simple3.2.1 Simple Commands
comments, shell3.1.3 Comments
completion builtins8.7 Programmable Completion Builtins
configuration10.1 Basic Installation
control operator2. Definitions

D
directory stack6.8 The Directory Stack

E
editing command lines8.2.1 Readline Bare Essentials
environment3.7.4 Environment
evaluation, arithmetic6.5 Shell Arithmetic
event designators9.3.1 Event Designators
execution environment3.7.3 Command Execution Environment
exit status2. Definitions
exit status3.7.5 Exit Status
expansion3.5 Shell Expansions
expansion, arithmetic3.5.5 Arithmetic Expansion
expansion, brace3.5.1 Brace Expansion
expansion, filename3.5.8 Filename Expansion
expansion, parameter3.5.3 Shell Parameter Expansion
expansion, pathname3.5.8 Filename Expansion
expansion, tilde3.5.2 Tilde Expansion
expressions, arithmetic6.5 Shell Arithmetic
expressions, conditional6.4 Bash Conditional Expressions

F
FDL, GNU Free Documentation LicenseC.1 GNU Free Documentation License
field2. Definitions
filename2. Definitions
filename expansion3.5.8 Filename Expansion
foreground7.1 Job Control Basics
functions, shell3.3 Shell Functions

H
history builtins9.2 Bash History Builtins
history events9.3.1 Event Designators
history expansion9.3 History Expansion
history list9.1 Bash History Facilities
History, how to use8.7 Programmable Completion Builtins

I
identifier2. Definitions
initialization file, readline8.3 Readline Init File
installation10.1 Basic Installation
interaction, readline8.2 Readline Interaction
interactive shell6.1 Invoking Bash
interactive shell6.3 Interactive Shells
internationalization3.1.2.5 Locale-Specific Translation

J
job2. Definitions
job control2. Definitions
job control7.1 Job Control Basics

K
kill ring8.2.3 Readline Killing Commands
killing text8.2.3 Readline Killing Commands

L
localization3.1.2.5 Locale-Specific Translation
login shell6.1 Invoking Bash

M
matching, pattern3.5.8.1 Pattern Matching
metacharacter2. Definitions

N
name2. Definitions
native languages3.1.2.5 Locale-Specific Translation
notation, readline8.2.1 Readline Bare Essentials

O
operator, shell2. Definitions

P
parameter expansion3.5.3 Shell Parameter Expansion
parameters3.4 Shell Parameters
parameters, positional3.4.1 Positional Parameters
parameters, special3.4.2 Special Parameters
pathname expansion3.5.8 Filename Expansion
pattern matching3.5.8.1 Pattern Matching
pipeline3.2.2 Pipelines
POSIX2. Definitions
POSIX Mode6.11 Bash POSIX Mode
process group2. Definitions
process group ID2. Definitions
process substitution3.5.6 Process Substitution
programmable completion8.6 Programmable Completion
prompting6.9 Controlling the Prompt

Q
quoting3.1.2 Quoting
quoting, ANSI3.1.2.4 ANSI-C Quoting

R
Readline, how to use7.3 Job Control Variables
redirection3.6 Redirections
reserved word2. Definitions
restricted shell6.10 The Restricted Shell
return status2. Definitions

S
shell arithmetic6.5 Shell Arithmetic
shell function3.3 Shell Functions
shell script3.8 Shell Scripts
shell variable3.4 Shell Parameters
shell, interactive6.3 Interactive Shells
signal2. Definitions
signal handling3.7.6 Signals
special builtin2. Definitions
special builtin4.4 Special Builtins
startup files6.2 Bash Startup Files
suspending jobs7.1 Job Control Basics

T
tilde expansion3.5.2 Tilde Expansion
token2. Definitions
translation, native languages3.1.2.5 Locale-Specific Translation

V
variable, shell3.4 Shell Parameters
variables, readline8.3.1 Readline Init File Syntax

W
word2. Definitions
word splitting3.5.7 Word Splitting

Y
yanking text8.2.3 Readline Killing Commands

Jump to:   A -   -B -   -C -   -D -   -E -   -F -   -H -   -I -   -J -   -K -   -L -   -M -   -N -   -O -   -P -   -Q -   -R -   -S -   -T -   -V -   -W -   -Y -   -

- -


- - - - - - -
[Top][Contents][Index][ ? ]
-

Table of Contents

- -
- - - - - - -
[Top][Contents][Index][ ? ]
-

Short Table of Contents

-
-1. Introduction -
-2. Definitions -
-3. Basic Shell Features -
-4. Shell Builtin Commands -
-5. Shell Variables -
-6. Bash Features -
-7. Job Control -
-8. Command Line Editing -
-9. Using History Interactively -
-10. Installing Bash -
-A. Reporting Bugs -
-B. Major Differences From The Bourne Shell -
-C. Copying This Manual -
-D. Indexes -
- -
-
- - - - - - -
[Top][Contents][Index][ ? ]
-

About this document

-This document was generated by Chet Ramey on January, 11 2007 -using texi2html -

-The buttons in the navigation panels have the following meaning: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button Name Go to From 1.2.3 go to
- [ < ] -Back - -previous section in reading order - -1.2.2 -
- [ > ] -Forward - -next section in reading order - -1.2.4 -
- [ << ] -FastBack - -previous or up-and-previous section - -1.1 -
- [ Up ] -Up - -up section - -1.2 -
- [ >> ] -FastForward - -next or up-and-next section - -1.3 -
- [Top] -Top - -cover (top) of document - -   -
- [Contents] -Contents - -table of contents - -   -
- [Index] -Index - -concept index - -   -
- [ ? ] -About - -this page - -   -
-

-where the Example assumes that the current position -is at Subsubsection One-Two-Three of a document of -the following structure: -
    -
  • 1. Section One
  • -
      -
    • 1.1 Subsection One-One
    • -
        -
      • ...
      • -
      -
    • 1.2 Subsection One-Two
    • -
        -
      • 1.2.1 Subsubsection One-Two-One -
      • 1.2.2 Subsubsection One-Two-Two -
      • 1.2.3 Subsubsection One-Two-Three     -<== Current Position -
      • 1.2.4 Subsubsection One-Two-Four -
      -
    • 1.3 Subsection One-Three
    • -
        -
      • ...
      • -
      -
    • 1.4 Subsection One-Four
    • -
    -
- -
-
- -This document was generated -by Chet Ramey on January, 11 2007 -using texi2html - - - diff --git a/fdprintf.c b/fdprintf.c deleted file mode 100644 index cfe13bfba..000000000 --- a/fdprintf.c +++ /dev/null @@ -1,66 +0,0 @@ -/* fdprintf -- printf to a file descriptor - - Copyright (C) 2008 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#if !HAVE_FDPRINTF - -#include - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (PREFER_STDARG) -# include -#else -# include -#endif - -#include - -int -#if defined (PREFER_STDARG) -fdprintf(int fd, const char *format, ...) -#else -fdprintf(fd, format, va_alist) - int fd; - const char *format; - va_dcl -#endif -{ - FILE *fp; - int rc, r2; - va_list args; - - fp = fdopen (dup (fd), "w"); - if (fp == 0) - return -1; - - SH_VA_START (args, format); - rc = vfprintf (fp, fmt, ap); - fflush (fp); - va_end (args); - - r2 = fclose (fp); /* check here */ - - return rc; -} -#endif diff --git a/lib/readline/copyright-comment b/lib/readline/copyright-comment deleted file mode 100644 index eea44d2e4..000000000 --- a/lib/readline/copyright-comment +++ /dev/null @@ -1,12 +0,0 @@ - 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 3 of the License, 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. If not, see . diff --git a/lib/readline/copyright-history b/lib/readline/copyright-history deleted file mode 100644 index 6e7422e55..000000000 --- a/lib/readline/copyright-history +++ /dev/null @@ -1,12 +0,0 @@ - History is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - History 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 History. If not, see . diff --git a/parse.y.yacc b/parse.y.yacc deleted file mode 100644 index 438163da5..000000000 --- a/parse.y.yacc +++ /dev/null @@ -1,5726 +0,0 @@ -/* parse.y - Yacc grammar for bash. */ - -/* Copyright (C) 1989-2009 Free Software Foundation, Inc. - - This file is part of GNU Bash, the Bourne Again SHell. - - Bash is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Bash is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Bash. If not, see . -*/ - -%{ -#include "config.h" - -#include "bashtypes.h" -#include "bashansi.h" - -#include "filecntl.h" - -#if defined (HAVE_UNISTD_H) -# include -#endif - -#if defined (HAVE_LOCALE_H) -# include -#endif - -#include -#include "chartypes.h" -#include - -#include "memalloc.h" - -#include "bashintl.h" - -#define NEED_STRFTIME_DECL /* used in externs.h */ - -#include "shell.h" -#include "trap.h" -#include "flags.h" -#include "parser.h" -#include "mailcheck.h" -#include "test.h" -#include "builtins.h" -#include "builtins/common.h" -#include "builtins/builtext.h" - -#include "shmbutil.h" - -#if defined (READLINE) -# include "bashline.h" -# include -#endif /* READLINE */ - -#if defined (HISTORY) -# include "bashhist.h" -# include -#endif /* HISTORY */ - -#if defined (JOB_CONTROL) -# include "jobs.h" -#endif /* JOB_CONTROL */ - -#if defined (ALIAS) -# include "alias.h" -#else -typedef void *alias_t; -#endif /* ALIAS */ - -#if defined (PROMPT_STRING_DECODE) -# ifndef _MINIX -# include -# endif -# include -# if defined (TM_IN_SYS_TIME) -# include -# include -# endif /* TM_IN_SYS_TIME */ -# include "maxpath.h" -#endif /* PROMPT_STRING_DECODE */ - -#define RE_READ_TOKEN -99 -#define NO_EXPANSION -100 - -#ifdef DEBUG -# define YYDEBUG 1 -#else -# define YYDEBUG 0 -#endif - -#if defined (HANDLE_MULTIBYTE) -# define last_shell_getc_is_singlebyte \ - ((shell_input_line_index > 1) \ - ? shell_input_line_property[shell_input_line_index - 1] \ - : 1) -# define MBTEST(x) ((x) && last_shell_getc_is_singlebyte) -#else -# define last_shell_getc_is_singlebyte 1 -# define MBTEST(x) ((x)) -#endif - -#if defined (EXTENDED_GLOB) -extern int extended_glob; -#endif - -extern int eof_encountered; -extern int no_line_editing, running_under_emacs; -extern int current_command_number; -extern int sourcelevel, parse_and_execute_level; -extern int posixly_correct; -extern int last_command_exit_value; -extern char *shell_name, *current_host_name; -extern char *dist_version; -extern int patch_level; -extern int dump_translatable_strings, dump_po_strings; -extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin; -#if defined (BUFFERED_INPUT) -extern int bash_input_fd_changed; -#endif - -extern int errno; -/* **************************************************************** */ -/* */ -/* "Forward" declarations */ -/* */ -/* **************************************************************** */ - -#ifdef DEBUG -static void debug_parser __P((int)); -#endif - -static int yy_getc __P((void)); -static int yy_ungetc __P((int)); - -#if defined (READLINE) -static int yy_readline_get __P((void)); -static int yy_readline_unget __P((int)); -#endif - -static int yy_string_get __P((void)); -static int yy_string_unget __P((int)); -static void rewind_input_string __P((void)); -static int yy_stream_get __P((void)); -static int yy_stream_unget __P((int)); - -static int shell_getc __P((int)); -static void shell_ungetc __P((int)); -static void discard_until __P((int)); - -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) -static void push_string __P((char *, int, alias_t *)); -static void pop_string __P((void)); -static void free_string_list __P((void)); -#endif - -static char *read_a_line __P((int)); - -static int reserved_word_acceptable __P((int)); -static int yylex __P((void)); -static int alias_expand_token __P((char *)); -static int time_command_acceptable __P((void)); -static int special_case_tokens __P((char *)); -static int read_token __P((int)); -static char *parse_matched_pair __P((int, int, int, int *, int)); -static char *parse_comsub __P((int, int, int, int *, int)); -#if defined (ARRAY_VARS) -static char *parse_compound_assignment __P((int *)); -#endif -#if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND) -static int parse_dparen __P((int)); -static int parse_arith_cmd __P((char **, int)); -#endif -#if defined (COND_COMMAND) -static void cond_error __P((void)); -static COND_COM *cond_expr __P((void)); -static COND_COM *cond_or __P((void)); -static COND_COM *cond_and __P((void)); -static COND_COM *cond_term __P((void)); -static int cond_skip_newlines __P((void)); -static COMMAND *parse_cond_command __P((void)); -#endif -#if defined (ARRAY_VARS) -static int token_is_assignment __P((char *, int)); -static int token_is_ident __P((char *, int)); -#endif -static int read_token_word __P((int)); -static void discard_parser_constructs __P((int)); - -static char *error_token_from_token __P((int)); -static char *error_token_from_text __P((void)); -static void print_offending_line __P((void)); -static void report_syntax_error __P((char *)); - -static void handle_eof_input_unit __P((void)); -static void prompt_again __P((void)); -#if 0 -static void reset_readline_prompt __P((void)); -#endif -static void print_prompt __P((void)); - -#if defined (HANDLE_MULTIBYTE) -static void set_line_mbstate __P((void)); -static char *shell_input_line_property = NULL; -#else -# define set_line_mbstate() -#endif - -extern int yyerror __P((const char *)); - -#ifdef DEBUG -extern int yydebug; -#endif - -/* Default prompt strings */ -char *primary_prompt = PPROMPT; -char *secondary_prompt = SPROMPT; - -/* PROMPT_STRING_POINTER points to one of these, never to an actual string. */ -char *ps1_prompt, *ps2_prompt; - -/* Handle on the current prompt string. Indirectly points through - ps1_ or ps2_prompt. */ -char **prompt_string_pointer = (char **)NULL; -char *current_prompt_string; - -/* Non-zero means we expand aliases in commands. */ -int expand_aliases = 0; - -/* If non-zero, the decoded prompt string undergoes parameter and - variable substitution, command substitution, arithmetic substitution, - string expansion, process substitution, and quote removal in - decode_prompt_string. */ -int promptvars = 1; - -/* If non-zero, $'...' and $"..." are expanded when they appear within - a ${...} expansion, even when the expansion appears within double - quotes. */ -int extended_quote = 1; - -/* The decoded prompt string. Used if READLINE is not defined or if - editing is turned off. Analogous to current_readline_prompt. */ -static char *current_decoded_prompt; - -/* The number of lines read from input while creating the current command. */ -int current_command_line_count; - -/* The token that currently denotes the end of parse. */ -int shell_eof_token; - -/* The token currently being read. */ -int current_token; - -/* Variables to manage the task of reading here documents, because we need to - defer the reading until after a complete command has been collected. */ -static REDIRECT *redir_stack[10]; -int need_here_doc; - -/* Where shell input comes from. History expansion is performed on each - line when the shell is interactive. */ -static char *shell_input_line = (char *)NULL; -static int shell_input_line_index; -static int shell_input_line_size; /* Amount allocated for shell_input_line. */ -static int shell_input_line_len; /* strlen (shell_input_line) */ - -/* Either zero or EOF. */ -static int shell_input_line_terminator; - -/* The line number in a script on which a function definition starts. */ -static int function_dstart; - -/* The line number in a script on which a function body starts. */ -static int function_bstart; - -/* The line number in a script at which an arithmetic for command starts. */ -static int arith_for_lineno; - -/* The current parser state. */ -static int parser_state; - -/* The last read token, or NULL. read_token () uses this for context - checking. */ -static int last_read_token; - -/* The token read prior to last_read_token. */ -static int token_before_that; - -/* The token read prior to token_before_that. */ -static int two_tokens_ago; - -/* The line number in a script where the word in a `case WORD', `select WORD' - or `for WORD' begins. This is a nested command maximum, since the array - index is decremented after a case, select, or for command is parsed. */ -#define MAX_CASE_NEST 128 -static int word_lineno[MAX_CASE_NEST]; -static int word_top = -1; - -/* If non-zero, it is the token that we want read_token to return - regardless of what text is (or isn't) present to be read. This - is reset by read_token. If token_to_read == WORD or - ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */ -static int token_to_read; -static WORD_DESC *word_desc_to_read; - -static REDIRECTEE redir; -%} - -%union { - WORD_DESC *word; /* the word that we read. */ - int number; /* the number that we read. */ - WORD_LIST *word_list; - COMMAND *command; - REDIRECT *redirect; - ELEMENT element; - PATTERN_LIST *pattern; -} - -/* Reserved words. Members of the first group are only recognized - in the case that they are preceded by a list_terminator. Members - of the second group are for [[...]] commands. Members of the - third group are recognized only under special circumstances. */ -%token IF THEN ELSE ELIF FI CASE ESAC FOR SELECT WHILE UNTIL DO DONE FUNCTION COPROC -%token COND_START COND_END COND_ERROR -%token IN BANG TIME TIMEOPT - -/* More general tokens. yylex () knows how to make these. */ -%token WORD ASSIGNMENT_WORD -%token NUMBER -%token ARITH_CMD ARITH_FOR_EXPRS -%token COND_CMD -%token AND_AND OR_OR GREATER_GREATER LESS_LESS LESS_AND LESS_LESS_LESS -%token GREATER_AND SEMI_SEMI SEMI_AND SEMI_SEMI_AND -%token LESS_LESS_MINUS AND_GREATER AND_GREATER_GREATER LESS_GREATER -%token GREATER_BAR BAR_AND - -/* The types that the various syntactical units return. */ - -%type inputunit command pipeline pipeline_command -%type list list0 list1 compound_list simple_list simple_list1 -%type simple_command shell_command -%type for_command select_command case_command group_command -%type arith_command -%type cond_command -%type arith_for_command -%type coproc -%type function_def function_body if_command elif_clause subshell -%type redirection redirection_list -%type simple_command_element -%type word_list pattern -%type pattern_list case_clause_sequence case_clause -%type timespec -%type list_terminator - -%start inputunit - -%left '&' ';' '\n' yacc_EOF -%left AND_AND OR_OR -%right '|' BAR_AND -%% - -inputunit: simple_list simple_list_terminator - { - /* Case of regular command. Discard the error - safety net,and return the command just parsed. */ - global_command = $1; - eof_encountered = 0; - /* discard_parser_constructs (0); */ - if (parser_state & PST_CMDSUBST) - parser_state |= PST_EOFTOKEN; - YYACCEPT; - } - | '\n' - { - /* Case of regular command, but not a very - interesting one. Return a NULL command. */ - global_command = (COMMAND *)NULL; - if (parser_state & PST_CMDSUBST) - parser_state |= PST_EOFTOKEN; - YYACCEPT; - } - | error '\n' - { - /* Error during parsing. Return NULL command. */ - global_command = (COMMAND *)NULL; - eof_encountered = 0; - /* discard_parser_constructs (1); */ - if (interactive && parse_and_execute_level == 0) - { - YYACCEPT; - } - else - { - YYABORT; - } - } - | yacc_EOF - { - /* Case of EOF seen by itself. Do ignoreeof or - not. */ - global_command = (COMMAND *)NULL; - handle_eof_input_unit (); - YYACCEPT; - } - ; - -word_list: WORD - { $$ = make_word_list ($1, (WORD_LIST *)NULL); } - | word_list WORD - { $$ = make_word_list ($2, $1); } - ; - -redirection: '>' WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_output_direction, redir); - } - | '<' WORD - { - redir.filename = $2; - $$ = make_redirection (0, r_input_direction, redir); - } - | NUMBER '>' WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_output_direction, redir); - } - | NUMBER '<' WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_input_direction, redir); - } - | GREATER_GREATER WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_appending_to, redir); - } - | NUMBER GREATER_GREATER WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_appending_to, redir); - } - | LESS_LESS WORD - { - redir.filename = $2; - $$ = make_redirection (0, r_reading_until, redir); - redir_stack[need_here_doc++] = $$; - } - | NUMBER LESS_LESS WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_reading_until, redir); - redir_stack[need_here_doc++] = $$; - } - | LESS_LESS_LESS WORD - { - redir.filename = $2; - $$ = make_redirection (0, r_reading_string, redir); - } - | NUMBER LESS_LESS_LESS WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_reading_string, redir); - } - | LESS_AND NUMBER - { - redir.dest = $2; - $$ = make_redirection (0, r_duplicating_input, redir); - } - | NUMBER LESS_AND NUMBER - { - redir.dest = $3; - $$ = make_redirection ($1, r_duplicating_input, redir); - } - | GREATER_AND NUMBER - { - redir.dest = $2; - $$ = make_redirection (1, r_duplicating_output, redir); - } - | NUMBER GREATER_AND NUMBER - { - redir.dest = $3; - $$ = make_redirection ($1, r_duplicating_output, redir); - } - | LESS_AND WORD - { - redir.filename = $2; - $$ = make_redirection (0, r_duplicating_input_word, redir); - } - | NUMBER LESS_AND WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_duplicating_input_word, redir); - } - | GREATER_AND WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_duplicating_output_word, redir); - } - | NUMBER GREATER_AND WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_duplicating_output_word, redir); - } - | LESS_LESS_MINUS WORD - { - redir.filename = $2; - $$ = make_redirection - (0, r_deblank_reading_until, redir); - redir_stack[need_here_doc++] = $$; - } - | NUMBER LESS_LESS_MINUS WORD - { - redir.filename = $3; - $$ = make_redirection - ($1, r_deblank_reading_until, redir); - redir_stack[need_here_doc++] = $$; - } - | GREATER_AND '-' - { - redir.dest = 0; - $$ = make_redirection (1, r_close_this, redir); - } - | NUMBER GREATER_AND '-' - { - redir.dest = 0; - $$ = make_redirection ($1, r_close_this, redir); - } - | LESS_AND '-' - { - redir.dest = 0; - $$ = make_redirection (0, r_close_this, redir); - } - | NUMBER LESS_AND '-' - { - redir.dest = 0; - $$ = make_redirection ($1, r_close_this, redir); - } - | AND_GREATER WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_err_and_out, redir); - } - | AND_GREATER_GREATER WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_append_err_and_out, redir); - } - | NUMBER LESS_GREATER WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_input_output, redir); - } - | LESS_GREATER WORD - { - redir.filename = $2; - $$ = make_redirection (0, r_input_output, redir); - } - | GREATER_BAR WORD - { - redir.filename = $2; - $$ = make_redirection (1, r_output_force, redir); - } - | NUMBER GREATER_BAR WORD - { - redir.filename = $3; - $$ = make_redirection ($1, r_output_force, redir); - } - ; - -simple_command_element: WORD - { $$.word = $1; $$.redirect = 0; } - | ASSIGNMENT_WORD - { $$.word = $1; $$.redirect = 0; } - | redirection - { $$.redirect = $1; $$.word = 0; } - ; - -redirection_list: redirection - { - $$ = $1; - } - | redirection_list redirection - { - register REDIRECT *t; - - for (t = $1; t->next; t = t->next) - ; - t->next = $2; - $$ = $1; - } - ; - -simple_command: simple_command_element - { $$ = make_simple_command ($1, (COMMAND *)NULL); } - | simple_command simple_command_element - { $$ = make_simple_command ($2, $1); } - ; - -command: simple_command - { $$ = clean_simple_command ($1); } - | shell_command - { $$ = $1; } - | shell_command redirection_list - { - COMMAND *tc; - - tc = $1; - if (tc->redirects) - { - register REDIRECT *t; - for (t = tc->redirects; t->next; t = t->next) - ; - t->next = $2; - } - else - tc->redirects = $2; - $$ = $1; - } - | function_def - { $$ = $1; } - | coproc - { $$ = $1; } - ; - -shell_command: for_command - { $$ = $1; } - | case_command - { $$ = $1; } - | WHILE compound_list DO compound_list DONE - { $$ = make_while_command ($2, $4); } - | UNTIL compound_list DO compound_list DONE - { $$ = make_until_command ($2, $4); } - | select_command - { $$ = $1; } - | if_command - { $$ = $1; } - | subshell - { $$ = $1; } - | group_command - { $$ = $1; } - | arith_command - { $$ = $1; } - | cond_command - { $$ = $1; } - | arith_for_command - { $$ = $1; } - ; - -for_command: FOR WORD newline_list DO compound_list DONE - { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD newline_list '{' compound_list '}' - { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD ';' newline_list DO compound_list DONE - { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD ';' newline_list '{' compound_list '}' - { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE - { - $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' - { - $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE - { - $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}' - { - $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - ; - -arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_list DONE - { - $$ = make_arith_for_command ($2, $6, arith_for_lineno); - if (word_top > 0) word_top--; - } - | FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}' - { - $$ = make_arith_for_command ($2, $6, arith_for_lineno); - if (word_top > 0) word_top--; - } - | FOR ARITH_FOR_EXPRS DO compound_list DONE - { - $$ = make_arith_for_command ($2, $4, arith_for_lineno); - if (word_top > 0) word_top--; - } - | FOR ARITH_FOR_EXPRS '{' compound_list '}' - { - $$ = make_arith_for_command ($2, $4, arith_for_lineno); - if (word_top > 0) word_top--; - } - ; - -select_command: SELECT WORD newline_list DO list DONE - { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | SELECT WORD newline_list '{' list '}' - { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | SELECT WORD ';' newline_list DO list DONE - { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | SELECT WORD ';' newline_list '{' list '}' - { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | SELECT WORD newline_list IN word_list list_terminator newline_list DO list DONE - { - $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | SELECT WORD newline_list IN word_list list_terminator newline_list '{' list '}' - { - $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - ; - -case_command: CASE WORD newline_list IN newline_list ESAC - { - $$ = make_case_command ($2, (PATTERN_LIST *)NULL, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | CASE WORD newline_list IN case_clause_sequence newline_list ESAC - { - $$ = make_case_command ($2, $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - | CASE WORD newline_list IN case_clause ESAC - { - $$ = make_case_command ($2, $5, word_lineno[word_top]); - if (word_top > 0) word_top--; - } - ; - -function_def: WORD '(' ')' newline_list function_body - { $$ = make_function_def ($1, $5, function_dstart, function_bstart); } - - | FUNCTION WORD '(' ')' newline_list function_body - { $$ = make_function_def ($2, $6, function_dstart, function_bstart); } - - | FUNCTION WORD newline_list function_body - { $$ = make_function_def ($2, $4, function_dstart, function_bstart); } - ; - -function_body: shell_command - { $$ = $1; } - | shell_command redirection_list - { - COMMAND *tc; - - tc = $1; - /* According to Posix.2 3.9.5, redirections - specified after the body of a function should - be attached to the function and performed when - the function is executed, not as part of the - function definition command. */ - /* XXX - I don't think it matters, but we might - want to change this in the future to avoid - problems differentiating between a function - definition with a redirection and a function - definition containing a single command with a - redirection. The two are semantically equivalent, - though -- the only difference is in how the - command printing code displays the redirections. */ - if (tc->redirects) - { - register REDIRECT *t; - for (t = tc->redirects; t->next; t = t->next) - ; - t->next = $2; - } - else - tc->redirects = $2; - $$ = $1; - } - ; - -subshell: '(' compound_list ')' - { - $$ = make_subshell_command ($2); - $$->flags |= CMD_WANT_SUBSHELL; - } - ; - -coproc: COPROC shell_command - { - $$ = make_coproc_command ("COPROC", $2); - $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; - } - | COPROC shell_command redirection_list - { - COMMAND *tc; - - tc = $2; - if (tc->redirects) - { - register REDIRECT *t; - for (t = tc->redirects; t->next; t = t->next) - ; - t->next = $3; - } - else - tc->redirects = $3; - $$ = make_coproc_command ("COPROC", $2); - $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; - } - | COPROC WORD shell_command - { - $$ = make_coproc_command ($2->word, $3); - $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; - } - | COPROC WORD shell_command redirection_list - { - COMMAND *tc; - - tc = $3; - if (tc->redirects) - { - register REDIRECT *t; - for (t = tc->redirects; t->next; t = t->next) - ; - t->next = $4; - } - else - tc->redirects = $4; - $$ = make_coproc_command ($2->word, $3); - $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; - } - | COPROC simple_command - { - $$ = make_coproc_command ("COPROC", clean_simple_command ($2)); - $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; - } - ; - -if_command: IF compound_list THEN compound_list FI - { $$ = make_if_command ($2, $4, (COMMAND *)NULL); } - | IF compound_list THEN compound_list ELSE compound_list FI - { $$ = make_if_command ($2, $4, $6); } - | IF compound_list THEN compound_list elif_clause FI - { $$ = make_if_command ($2, $4, $5); } - ; - - -group_command: '{' compound_list '}' - { $$ = make_group_command ($2); } - ; - -arith_command: ARITH_CMD - { $$ = make_arith_command ($1); } - ; - -cond_command: COND_START COND_CMD COND_END - { $$ = $2; } - ; - -elif_clause: ELIF compound_list THEN compound_list - { $$ = make_if_command ($2, $4, (COMMAND *)NULL); } - | ELIF compound_list THEN compound_list ELSE compound_list - { $$ = make_if_command ($2, $4, $6); } - | ELIF compound_list THEN compound_list elif_clause - { $$ = make_if_command ($2, $4, $5); } - ; - -case_clause: pattern_list - | case_clause_sequence pattern_list - { $2->next = $1; $$ = $2; } - ; - -pattern_list: newline_list pattern ')' compound_list - { $$ = make_pattern_list ($2, $4); } - | newline_list pattern ')' newline_list - { $$ = make_pattern_list ($2, (COMMAND *)NULL); } - | newline_list '(' pattern ')' compound_list - { $$ = make_pattern_list ($3, $5); } - | newline_list '(' pattern ')' newline_list - { $$ = make_pattern_list ($3, (COMMAND *)NULL); } - ; - -case_clause_sequence: pattern_list SEMI_SEMI - { $$ = $1; } - | case_clause_sequence pattern_list SEMI_SEMI - { $2->next = $1; $$ = $2; } - | pattern_list SEMI_AND - { $1->flags |= CASEPAT_FALLTHROUGH; $$ = $1; } - | case_clause_sequence pattern_list SEMI_AND - { $2->flags |= CASEPAT_FALLTHROUGH; $2->next = $1; $$ = $2; } - | pattern_list SEMI_SEMI_AND - { $1->flags |= CASEPAT_TESTNEXT; $$ = $1; } - | case_clause_sequence pattern_list SEMI_SEMI_AND - { $2->flags |= CASEPAT_TESTNEXT; $2->next = $1; $$ = $2; } - ; - -pattern: WORD - { $$ = make_word_list ($1, (WORD_LIST *)NULL); } - | pattern '|' WORD - { $$ = make_word_list ($3, $1); } - ; - -/* A list allows leading or trailing newlines and - newlines as operators (equivalent to semicolons). - It must end with a newline or semicolon. - Lists are used within commands such as if, for, while. */ - -list: newline_list list0 - { - $$ = $2; - if (need_here_doc) - gather_here_documents (); - } - ; - -compound_list: list - | newline_list list1 - { - $$ = $2; - } - ; - -list0: list1 '\n' newline_list - | list1 '&' newline_list - { - if ($1->type == cm_connection) - $$ = connect_async_list ($1, (COMMAND *)NULL, '&'); - else - $$ = command_connect ($1, (COMMAND *)NULL, '&'); - } - | list1 ';' newline_list - - ; - -list1: list1 AND_AND newline_list list1 - { $$ = command_connect ($1, $4, AND_AND); } - | list1 OR_OR newline_list list1 - { $$ = command_connect ($1, $4, OR_OR); } - | list1 '&' newline_list list1 - { - if ($1->type == cm_connection) - $$ = connect_async_list ($1, $4, '&'); - else - $$ = command_connect ($1, $4, '&'); - } - | list1 ';' newline_list list1 - { $$ = command_connect ($1, $4, ';'); } - | list1 '\n' newline_list list1 - { $$ = command_connect ($1, $4, ';'); } - | pipeline_command - { $$ = $1; } - ; - -simple_list_terminator: '\n' - | yacc_EOF - ; - -list_terminator:'\n' - { $$ = '\n'; } - | ';' - { $$ = ';'; } - | yacc_EOF - { $$ = yacc_EOF; } - ; - -newline_list: - | newline_list '\n' - ; - -/* A simple_list is a list that contains no significant newlines - and no leading or trailing newlines. Newlines are allowed - only following operators, where they are not significant. - - This is what an inputunit consists of. */ - -simple_list: simple_list1 - { - $$ = $1; - if (need_here_doc) - gather_here_documents (); - if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token) - { - global_command = $1; - eof_encountered = 0; - rewind_input_string (); - YYACCEPT; - } - } - | simple_list1 '&' - { - if ($1->type == cm_connection) - $$ = connect_async_list ($1, (COMMAND *)NULL, '&'); - else - $$ = command_connect ($1, (COMMAND *)NULL, '&'); - if (need_here_doc) - gather_here_documents (); - if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token) - { - global_command = $1; - eof_encountered = 0; - rewind_input_string (); - YYACCEPT; - } - } - | simple_list1 ';' - { - $$ = $1; - if (need_here_doc) - gather_here_documents (); - if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token) - { - global_command = $1; - eof_encountered = 0; - rewind_input_string (); - YYACCEPT; - } - } - | simple_list1 ')' - { - $$ = $1; - if (need_here_doc) - gather_here_documents (); /*(*/ - if ((parser_state & PST_CMDSUBST) && shell_eof_token == ')') - { - global_command = $1; - eof_encountered = 0; - rewind_input_string (); - YYACCEPT; - } - else - { - report_syntax_error ((char *)NULL); - YYABORT; - } - } - ; - -simple_list1: simple_list1 AND_AND newline_list simple_list1 - { $$ = command_connect ($1, $4, AND_AND); } - | simple_list1 OR_OR newline_list simple_list1 - { $$ = command_connect ($1, $4, OR_OR); } - | simple_list1 '&' simple_list1 - { - if ($1->type == cm_connection) - $$ = connect_async_list ($1, $3, '&'); - else - $$ = command_connect ($1, $3, '&'); - } - | simple_list1 ';' simple_list1 - { $$ = command_connect ($1, $3, ';'); } - - | pipeline_command - { $$ = $1; } - ; - -pipeline_command: pipeline - { $$ = $1; } - | BANG pipeline - { - if ($2) - $2->flags |= CMD_INVERT_RETURN; - $$ = $2; - } - | timespec pipeline - { - if ($2) - $2->flags |= $1; - $$ = $2; - } - | timespec BANG pipeline - { - if ($3) - $3->flags |= $1|CMD_INVERT_RETURN; - $$ = $3; - } - | BANG timespec pipeline - { - if ($3) - $3->flags |= $2|CMD_INVERT_RETURN; - $$ = $3; - } - | timespec list_terminator - { - ELEMENT x; - - /* Boy, this is unclean. `time' by itself can - time a null command. We cheat and push a - newline back if the list_terminator was a newline - to avoid the double-newline problem (one to - terminate this, one to terminate the command) */ - x.word = 0; - x.redirect = 0; - $$ = make_simple_command (x, (COMMAND *)NULL); - $$->flags |= $1; - /* XXX - let's cheat and push a newline back */ - if ($2 == '\n') - token_to_read = '\n'; - } - - ; - -pipeline: pipeline '|' newline_list pipeline - { $$ = command_connect ($1, $4, '|'); } - | pipeline BAR_AND newline_list pipeline - { - /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ - COMMAND *tc; - REDIRECTEE rd; - REDIRECT *r; - - tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1; - rd.dest = 1; - r = make_redirection (2, r_duplicating_output, rd); - if (tc->redirects) - { - register REDIRECT *t; - for (t = tc->redirects; t->next; t = t->next) - ; - t->next = r; - } - else - tc->redirects = r; - - $$ = command_connect ($1, $4, '|'); - } - | command - { $$ = $1; } - ; - -timespec: TIME - { $$ = CMD_TIME_PIPELINE; } - | TIME TIMEOPT - { $$ = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } - ; -%% - -/* Initial size to allocate for tokens, and the - amount to grow them by. */ -#define TOKEN_DEFAULT_INITIAL_SIZE 496 -#define TOKEN_DEFAULT_GROW_SIZE 512 - -/* Should we call prompt_again? */ -#define SHOULD_PROMPT() \ - (interactive && (bash_input.type == st_stdin || bash_input.type == st_stream)) - -#if defined (ALIAS) -# define expanding_alias() (pushed_string_list && pushed_string_list->expander) -#else -# define expanding_alias() 0 -#endif - -/* Global var is non-zero when end of file has been reached. */ -int EOF_Reached = 0; - -#ifdef DEBUG -static void -debug_parser (i) - int i; -{ -#if YYDEBUG != 0 - yydebug = i; -#endif -} -#endif - -/* yy_getc () returns the next available character from input or EOF. - yy_ungetc (c) makes `c' the next character to read. - init_yy_io (get, unget, type, location) makes the function GET the - installed function for getting the next character, makes UNGET the - installed function for un-getting a character, sets the type of stream - (either string or file) from TYPE, and makes LOCATION point to where - the input is coming from. */ - -/* Unconditionally returns end-of-file. */ -int -return_EOF () -{ - return (EOF); -} - -/* Variable containing the current get and unget functions. - See ./input.h for a clearer description. */ -BASH_INPUT bash_input; - -/* Set all of the fields in BASH_INPUT to NULL. Free bash_input.name if it - is non-null, avoiding a memory leak. */ -void -initialize_bash_input () -{ - bash_input.type = st_none; - FREE (bash_input.name); - bash_input.name = (char *)NULL; - bash_input.location.file = (FILE *)NULL; - bash_input.location.string = (char *)NULL; - bash_input.getter = (sh_cget_func_t *)NULL; - bash_input.ungetter = (sh_cunget_func_t *)NULL; -} - -/* Set the contents of the current bash input stream from - GET, UNGET, TYPE, NAME, and LOCATION. */ -void -init_yy_io (get, unget, type, name, location) - sh_cget_func_t *get; - sh_cunget_func_t *unget; - enum stream_type type; - const char *name; - INPUT_STREAM location; -{ - bash_input.type = type; - FREE (bash_input.name); - bash_input.name = name ? savestring (name) : (char *)NULL; - - /* XXX */ -#if defined (CRAY) - memcpy((char *)&bash_input.location.string, (char *)&location.string, sizeof(location)); -#else - bash_input.location = location; -#endif - bash_input.getter = get; - bash_input.ungetter = unget; -} - -char * -yy_input_name () -{ - return (bash_input.name ? bash_input.name : "stdin"); -} - -/* Call this to get the next character of input. */ -static int -yy_getc () -{ - return (*(bash_input.getter)) (); -} - -/* Call this to unget C. That is, to make C the next character - to be read. */ -static int -yy_ungetc (c) - int c; -{ - return (*(bash_input.ungetter)) (c); -} - -#if defined (BUFFERED_INPUT) -#ifdef INCLUDE_UNUSED -int -input_file_descriptor () -{ - switch (bash_input.type) - { - case st_stream: - return (fileno (bash_input.location.file)); - case st_bstream: - return (bash_input.location.buffered_fd); - case st_stdin: - default: - return (fileno (stdin)); - } -} -#endif -#endif /* BUFFERED_INPUT */ - -/* **************************************************************** */ -/* */ -/* Let input be read from readline (). */ -/* */ -/* **************************************************************** */ - -#if defined (READLINE) -char *current_readline_prompt = (char *)NULL; -char *current_readline_line = (char *)NULL; -int current_readline_line_index = 0; - -static int -yy_readline_get () -{ - SigHandler *old_sigint; - int line_len; - unsigned char c; - - if (!current_readline_line) - { - if (!bash_readline_initialized) - initialize_readline (); - -#if defined (JOB_CONTROL) - if (job_control) - give_terminal_to (shell_pgrp, 0); -#endif /* JOB_CONTROL */ - - old_sigint = (SigHandler *)NULL; - if (signal_is_ignored (SIGINT) == 0) - { - old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler); - interrupt_immediately++; - } - terminate_immediately = 1; - - current_readline_line = readline (current_readline_prompt ? - current_readline_prompt : ""); - - terminate_immediately = 0; - if (signal_is_ignored (SIGINT) == 0 && old_sigint) - { - interrupt_immediately--; - set_signal_handler (SIGINT, old_sigint); - } - -#if 0 - /* Reset the prompt to the decoded value of prompt_string_pointer. */ - reset_readline_prompt (); -#endif - - if (current_readline_line == 0) - return (EOF); - - current_readline_line_index = 0; - line_len = strlen (current_readline_line); - - current_readline_line = (char *)xrealloc (current_readline_line, 2 + line_len); - current_readline_line[line_len++] = '\n'; - current_readline_line[line_len] = '\0'; - } - - if (current_readline_line[current_readline_line_index] == 0) - { - free (current_readline_line); - current_readline_line = (char *)NULL; - return (yy_readline_get ()); - } - else - { - c = current_readline_line[current_readline_line_index++]; - return (c); - } -} - -static int -yy_readline_unget (c) - int c; -{ - if (current_readline_line_index && current_readline_line) - current_readline_line[--current_readline_line_index] = c; - return (c); -} - -void -with_input_from_stdin () -{ - INPUT_STREAM location; - - if (bash_input.type != st_stdin && stream_on_stack (st_stdin) == 0) - { - location.string = current_readline_line; - init_yy_io (yy_readline_get, yy_readline_unget, - st_stdin, "readline stdin", location); - } -} - -#else /* !READLINE */ - -void -with_input_from_stdin () -{ - with_input_from_stream (stdin, "stdin"); -} -#endif /* !READLINE */ - -/* **************************************************************** */ -/* */ -/* Let input come from STRING. STRING is zero terminated. */ -/* */ -/* **************************************************************** */ - -static int -yy_string_get () -{ - register char *string; - register unsigned char c; - - string = bash_input.location.string; - - /* If the string doesn't exist, or is empty, EOF found. */ - if (string && *string) - { - c = *string++; - bash_input.location.string = string; - return (c); - } - else - return (EOF); -} - -static int -yy_string_unget (c) - int c; -{ - *(--bash_input.location.string) = c; - return (c); -} - -void -with_input_from_string (string, name) - char *string; - const char *name; -{ - INPUT_STREAM location; - - location.string = string; - init_yy_io (yy_string_get, yy_string_unget, st_string, name, location); -} - -/* Count the number of characters we've consumed from bash_input.location.string - and read into shell_input_line, but have not returned from shell_getc. - That is the true input location. Rewind bash_input.location.string by - that number of characters, so it points to the last character actually - consumed by the parser. */ -static void -rewind_input_string () -{ - int xchars; - - /* number of unconsumed characters in the input -- XXX need to take newlines - into account, e.g., $(...\n) */ - xchars = shell_input_line_len - shell_input_line_index; - if (bash_input.location.string[-1] == '\n') - xchars++; - - /* XXX - how to reflect bash_input.location.string back to string passed to - parse_and_execute or xparse_dolparen? xparse_dolparen needs to know how - far into the string we parsed. parse_and_execute knows where bash_input. - location.string is, and how far from orig_string that is -- that's the - number of characters the command consumed. */ - - /* bash_input.location.string - xchars should be where we parsed to */ - /* need to do more validation on xchars value for sanity -- test cases. */ - bash_input.location.string -= xchars; -} - -/* **************************************************************** */ -/* */ -/* Let input come from STREAM. */ -/* */ -/* **************************************************************** */ - -/* These two functions used to test the value of the HAVE_RESTARTABLE_SYSCALLS - define, and just use getc/ungetc if it was defined, but since bash - installs its signal handlers without the SA_RESTART flag, some signals - (like SIGCHLD, SIGWINCH, etc.) received during a read(2) will not cause - the read to be restarted. We need to restart it ourselves. */ - -static int -yy_stream_get () -{ - int result; - - result = EOF; - if (bash_input.location.file) - { - if (interactive) - { - interrupt_immediately++; - terminate_immediately++; - } - result = getc_with_restart (bash_input.location.file); - if (interactive) - { - interrupt_immediately--; - terminate_immediately--; - } - } - return (result); -} - -static int -yy_stream_unget (c) - int c; -{ - return (ungetc_with_restart (c, bash_input.location.file)); -} - -void -with_input_from_stream (stream, name) - FILE *stream; - const char *name; -{ - INPUT_STREAM location; - - location.file = stream; - init_yy_io (yy_stream_get, yy_stream_unget, st_stream, name, location); -} - -typedef struct stream_saver { - struct stream_saver *next; - BASH_INPUT bash_input; - int line; -#if defined (BUFFERED_INPUT) - BUFFERED_STREAM *bstream; -#endif /* BUFFERED_INPUT */ -} STREAM_SAVER; - -/* The globally known line number. */ -int line_number = 0; - -#if defined (COND_COMMAND) -static int cond_lineno; -static int cond_token; -#endif - -STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL; - -void -push_stream (reset_lineno) - int reset_lineno; -{ - STREAM_SAVER *saver = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER)); - - xbcopy ((char *)&bash_input, (char *)&(saver->bash_input), sizeof (BASH_INPUT)); - -#if defined (BUFFERED_INPUT) - saver->bstream = (BUFFERED_STREAM *)NULL; - /* If we have a buffered stream, clear out buffers[fd]. */ - if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0) - saver->bstream = set_buffered_stream (bash_input.location.buffered_fd, - (BUFFERED_STREAM *)NULL); -#endif /* BUFFERED_INPUT */ - - saver->line = line_number; - bash_input.name = (char *)NULL; - saver->next = stream_list; - stream_list = saver; - EOF_Reached = 0; - if (reset_lineno) - line_number = 0; -} - -void -pop_stream () -{ - if (!stream_list) - EOF_Reached = 1; - else - { - STREAM_SAVER *saver = stream_list; - - EOF_Reached = 0; - stream_list = stream_list->next; - - init_yy_io (saver->bash_input.getter, - saver->bash_input.ungetter, - saver->bash_input.type, - saver->bash_input.name, - saver->bash_input.location); - -#if defined (BUFFERED_INPUT) - /* If we have a buffered stream, restore buffers[fd]. */ - /* If the input file descriptor was changed while this was on the - save stack, update the buffered fd to the new file descriptor and - re-establish the buffer <-> bash_input fd correspondence. */ - if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0) - { - if (bash_input_fd_changed) - { - bash_input_fd_changed = 0; - if (default_buffered_input >= 0) - { - bash_input.location.buffered_fd = default_buffered_input; - saver->bstream->b_fd = default_buffered_input; - SET_CLOSE_ON_EXEC (default_buffered_input); - } - } - /* XXX could free buffered stream returned as result here. */ - set_buffered_stream (bash_input.location.buffered_fd, saver->bstream); - } -#endif /* BUFFERED_INPUT */ - - line_number = saver->line; - - FREE (saver->bash_input.name); - free (saver); - } -} - -/* Return 1 if a stream of type TYPE is saved on the stack. */ -int -stream_on_stack (type) - enum stream_type type; -{ - register STREAM_SAVER *s; - - for (s = stream_list; s; s = s->next) - if (s->bash_input.type == type) - return 1; - return 0; -} - -/* Save the current token state and return it in a malloced array. */ -int * -save_token_state () -{ - int *ret; - - ret = (int *)xmalloc (4 * sizeof (int)); - ret[0] = last_read_token; - ret[1] = token_before_that; - ret[2] = two_tokens_ago; - ret[3] = current_token; - return ret; -} - -void -restore_token_state (ts) - int *ts; -{ - if (ts == 0) - return; - last_read_token = ts[0]; - token_before_that = ts[1]; - two_tokens_ago = ts[2]; - current_token = ts[3]; -} - -/* - * This is used to inhibit alias expansion and reserved word recognition - * inside case statement pattern lists. A `case statement pattern list' is: - * - * everything between the `in' in a `case word in' and the next ')' - * or `esac' - * everything between a `;;' and the next `)' or `esac' - */ - -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) - -#define END_OF_ALIAS 0 - -/* - * Pseudo-global variables used in implementing token-wise alias expansion. - */ - -/* - * Pushing and popping strings. This works together with shell_getc to - * implement alias expansion on a per-token basis. - */ - -typedef struct string_saver { - struct string_saver *next; - int expand_alias; /* Value to set expand_alias to when string is popped. */ - char *saved_line; -#if defined (ALIAS) - alias_t *expander; /* alias that caused this line to be pushed. */ -#endif - int saved_line_size, saved_line_index, saved_line_terminator; -} STRING_SAVER; - -STRING_SAVER *pushed_string_list = (STRING_SAVER *)NULL; - -/* - * Push the current shell_input_line onto a stack of such lines and make S - * the current input. Used when expanding aliases. EXPAND is used to set - * the value of expand_next_token when the string is popped, so that the - * word after the alias in the original line is handled correctly when the - * alias expands to multiple words. TOKEN is the token that was expanded - * into S; it is saved and used to prevent infinite recursive expansion. - */ -static void -push_string (s, expand, ap) - char *s; - int expand; - alias_t *ap; -{ - STRING_SAVER *temp = (STRING_SAVER *)xmalloc (sizeof (STRING_SAVER)); - - temp->expand_alias = expand; - temp->saved_line = shell_input_line; - temp->saved_line_size = shell_input_line_size; - temp->saved_line_index = shell_input_line_index; - temp->saved_line_terminator = shell_input_line_terminator; -#if defined (ALIAS) - temp->expander = ap; -#endif - temp->next = pushed_string_list; - pushed_string_list = temp; - -#if defined (ALIAS) - if (ap) - ap->flags |= AL_BEINGEXPANDED; -#endif - - shell_input_line = s; - shell_input_line_size = strlen (s); - shell_input_line_index = 0; - shell_input_line_terminator = '\0'; -#if 0 - parser_state &= ~PST_ALEXPNEXT; /* XXX */ -#endif - - set_line_mbstate (); -} - -/* - * Make the top of the pushed_string stack be the current shell input. - * Only called when there is something on the stack. Called from shell_getc - * when it thinks it has consumed the string generated by an alias expansion - * and needs to return to the original input line. - */ -static void -pop_string () -{ - STRING_SAVER *t; - - FREE (shell_input_line); - shell_input_line = pushed_string_list->saved_line; - shell_input_line_index = pushed_string_list->saved_line_index; - shell_input_line_size = pushed_string_list->saved_line_size; - shell_input_line_terminator = pushed_string_list->saved_line_terminator; - - if (pushed_string_list->expand_alias) - parser_state |= PST_ALEXPNEXT; - else - parser_state &= ~PST_ALEXPNEXT; - - t = pushed_string_list; - pushed_string_list = pushed_string_list->next; - -#if defined (ALIAS) - if (t->expander) - t->expander->flags &= ~AL_BEINGEXPANDED; -#endif - - free ((char *)t); - - set_line_mbstate (); -} - -static void -free_string_list () -{ - register STRING_SAVER *t, *t1; - - for (t = pushed_string_list; t; ) - { - t1 = t->next; - FREE (t->saved_line); -#if defined (ALIAS) - if (t->expander) - t->expander->flags &= ~AL_BEINGEXPANDED; -#endif - free ((char *)t); - t = t1; - } - pushed_string_list = (STRING_SAVER *)NULL; -} - -#endif /* ALIAS || DPAREN_ARITHMETIC */ - -void -free_pushed_string_input () -{ -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) - free_string_list (); -#endif -} - -/* Return a line of text, taken from wherever yylex () reads input. - If there is no more input, then we return NULL. If REMOVE_QUOTED_NEWLINE - is non-zero, we remove unquoted \ pairs. This is used by - read_secondary_line to read here documents. */ -static char * -read_a_line (remove_quoted_newline) - int remove_quoted_newline; -{ - static char *line_buffer = (char *)NULL; - static int buffer_size = 0; - int indx = 0, c, peekc, pass_next; - -#if defined (READLINE) - if (no_line_editing && SHOULD_PROMPT ()) -#else - if (SHOULD_PROMPT ()) -#endif - print_prompt (); - - pass_next = 0; - while (1) - { - /* Allow immediate exit if interrupted during input. */ - QUIT; - - c = yy_getc (); - - /* Ignore null bytes in input. */ - if (c == 0) - { -#if 0 - internal_warning ("read_a_line: ignored null byte in input"); -#endif - continue; - } - - /* If there is no more input, then we return NULL. */ - if (c == EOF) - { - if (interactive && bash_input.type == st_stream) - clearerr (stdin); - if (indx == 0) - return ((char *)NULL); - c = '\n'; - } - - /* `+2' in case the final character in the buffer is a newline. */ - RESIZE_MALLOCED_BUFFER (line_buffer, indx, 2, buffer_size, 128); - - /* IF REMOVE_QUOTED_NEWLINES is non-zero, we are reading a - here document with an unquoted delimiter. In this case, - the line will be expanded as if it were in double quotes. - We allow a backslash to escape the next character, but we - need to treat the backslash specially only if a backslash - quoting a backslash-newline pair appears in the line. */ - if (pass_next) - { - line_buffer[indx++] = c; - pass_next = 0; - } - else if (c == '\\' && remove_quoted_newline) - { - peekc = yy_getc (); - if (peekc == '\n') - { - line_number++; - continue; /* Make the unquoted \ pair disappear. */ - } - else - { - yy_ungetc (peekc); - pass_next = 1; - line_buffer[indx++] = c; /* Preserve the backslash. */ - } - } - else - line_buffer[indx++] = c; - - if (c == '\n') - { - line_buffer[indx] = '\0'; - return (line_buffer); - } - } -} - -/* Return a line as in read_a_line (), but insure that the prompt is - the secondary prompt. This is used to read the lines of a here - document. REMOVE_QUOTED_NEWLINE is non-zero if we should remove - newlines quoted with backslashes while reading the line. It is - non-zero unless the delimiter of the here document was quoted. */ -char * -read_secondary_line (remove_quoted_newline) - int remove_quoted_newline; -{ - char *ret; - int n, c; - - prompt_string_pointer = &ps2_prompt; - if (SHOULD_PROMPT()) - prompt_again (); - ret = read_a_line (remove_quoted_newline); -#if defined (HISTORY) - if (remember_on_history && (parser_state & PST_HEREDOC)) - { - /* To make adding the the here-document body right, we need to rely - on history_delimiting_chars() returning \n for the first line of - the here-document body and the null string for the second and - subsequent lines, so we avoid double newlines. - current_command_line_count == 2 for the first line of the body. */ - - current_command_line_count++; - maybe_add_history (ret); - } -#endif /* HISTORY */ - return ret; -} - -/* **************************************************************** */ -/* */ -/* YYLEX () */ -/* */ -/* **************************************************************** */ - -/* Reserved words. These are only recognized as the first word of a - command. */ -STRING_INT_ALIST word_token_alist[] = { - { "if", IF }, - { "then", THEN }, - { "else", ELSE }, - { "elif", ELIF }, - { "fi", FI }, - { "case", CASE }, - { "esac", ESAC }, - { "for", FOR }, -#if defined (SELECT_COMMAND) - { "select", SELECT }, -#endif - { "while", WHILE }, - { "until", UNTIL }, - { "do", DO }, - { "done", DONE }, - { "in", IN }, - { "function", FUNCTION }, -#if defined (COMMAND_TIMING) - { "time", TIME }, -#endif - { "{", '{' }, - { "}", '}' }, - { "!", BANG }, -#if defined (COND_COMMAND) - { "[[", COND_START }, - { "]]", COND_END }, -#endif -#if defined (COPROCESS_SUPPORT) - { "coproc", COPROC }, -#endif - { (char *)NULL, 0} -}; - -/* other tokens that can be returned by read_token() */ -STRING_INT_ALIST other_token_alist[] = { - /* Multiple-character tokens with special values */ - { "-p", TIMEOPT }, - { "&&", AND_AND }, - { "||", OR_OR }, - { ">>", GREATER_GREATER }, - { "<<", LESS_LESS }, - { "<&", LESS_AND }, - { ">&", GREATER_AND }, - { ";;", SEMI_SEMI }, - { ";&", SEMI_AND }, - { ";;&", SEMI_SEMI_AND }, - { "<<-", LESS_LESS_MINUS }, - { "<<<", LESS_LESS_LESS }, - { "&>", AND_GREATER }, - { "&>>", AND_GREATER_GREATER }, - { "<>", LESS_GREATER }, - { ">|", GREATER_BAR }, - { "|&", BAR_AND }, - { "EOF", yacc_EOF }, - /* Tokens whose value is the character itself */ - { ">", '>' }, - { "<", '<' }, - { "-", '-' }, - { "{", '{' }, - { "}", '}' }, - { ";", ';' }, - { "(", '(' }, - { ")", ')' }, - { "|", '|' }, - { "&", '&' }, - { "newline", '\n' }, - { (char *)NULL, 0} -}; - -/* others not listed here: - WORD look at yylval.word - ASSIGNMENT_WORD look at yylval.word - NUMBER look at yylval.number - ARITH_CMD look at yylval.word_list - ARITH_FOR_EXPRS look at yylval.word_list - COND_CMD look at yylval.command -*/ - -/* These are used by read_token_word, but appear up here so that shell_getc - can use them to decide when to add otherwise blank lines to the history. */ - -/* The primary delimiter stack. */ -struct dstack dstack = { (char *)NULL, 0, 0 }; - -/* A temporary delimiter stack to be used when decoding prompt strings. - This is needed because command substitutions in prompt strings (e.g., PS2) - can screw up the parser's quoting state. */ -static struct dstack temp_dstack = { (char *)NULL, 0, 0 }; - -/* Macro for accessing the top delimiter on the stack. Returns the - delimiter or zero if none. */ -#define current_delimiter(ds) \ - (ds.delimiter_depth ? ds.delimiters[ds.delimiter_depth - 1] : 0) - -#define push_delimiter(ds, character) \ - do \ - { \ - if (ds.delimiter_depth + 2 > ds.delimiter_space) \ - ds.delimiters = (char *)xrealloc \ - (ds.delimiters, (ds.delimiter_space += 10) * sizeof (char)); \ - ds.delimiters[ds.delimiter_depth] = character; \ - ds.delimiter_depth++; \ - } \ - while (0) - -#define pop_delimiter(ds) ds.delimiter_depth-- - -/* Return the next shell input character. This always reads characters - from shell_input_line; when that line is exhausted, it is time to - read the next line. This is called by read_token when the shell is - processing normal command input. */ - -/* This implements one-character lookahead/lookbehind across physical input - lines, to avoid something being lost because it's pushed back with - shell_ungetc when we're at the start of a line. */ -static int eol_ungetc_lookahead = 0; - -static int -shell_getc (remove_quoted_newline) - int remove_quoted_newline; -{ - register int i; - int c; - unsigned char uc; - - QUIT; - - if (sigwinch_received) - { - sigwinch_received = 0; - get_new_window_size (0, (int *)0, (int *)0); - } - - if (eol_ungetc_lookahead) - { - c = eol_ungetc_lookahead; - eol_ungetc_lookahead = 0; - return (c); - } - -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) - /* If shell_input_line[shell_input_line_index] == 0, but there is - something on the pushed list of strings, then we don't want to go - off and get another line. We let the code down below handle it. */ - - if (!shell_input_line || ((!shell_input_line[shell_input_line_index]) && - (pushed_string_list == (STRING_SAVER *)NULL))) -#else /* !ALIAS && !DPAREN_ARITHMETIC */ - if (!shell_input_line || !shell_input_line[shell_input_line_index]) -#endif /* !ALIAS && !DPAREN_ARITHMETIC */ - { - line_number++; - - restart_read: - - /* Allow immediate exit if interrupted during input. */ - QUIT; - - i = 0; - shell_input_line_terminator = 0; - - /* If the shell is interatctive, but not currently printing a prompt - (interactive_shell && interactive == 0), we don't want to print - notifies or cleanup the jobs -- we want to defer it until we do - print the next prompt. */ - if (interactive_shell == 0 || SHOULD_PROMPT()) - { -#if defined (JOB_CONTROL) - /* This can cause a problem when reading a command as the result - of a trap, when the trap is called from flush_child. This call - had better not cause jobs to disappear from the job table in - that case, or we will have big trouble. */ - notify_and_cleanup (); -#else /* !JOB_CONTROL */ - cleanup_dead_jobs (); -#endif /* !JOB_CONTROL */ - } - -#if defined (READLINE) - if (no_line_editing && SHOULD_PROMPT()) -#else - if (SHOULD_PROMPT()) -#endif - print_prompt (); - - if (bash_input.type == st_stream) - clearerr (stdin); - - while (1) - { - c = yy_getc (); - - /* Allow immediate exit if interrupted during input. */ - QUIT; - - if (c == '\0') - { -#if 0 - internal_warning ("shell_getc: ignored null byte in input"); -#endif - continue; - } - - RESIZE_MALLOCED_BUFFER (shell_input_line, i, 2, shell_input_line_size, 256); - - if (c == EOF) - { - if (bash_input.type == st_stream) - clearerr (stdin); - - if (i == 0) - shell_input_line_terminator = EOF; - - shell_input_line[i] = '\0'; - break; - } - - shell_input_line[i++] = c; - - if (c == '\n') - { - shell_input_line[--i] = '\0'; - current_command_line_count++; - break; - } - } - - shell_input_line_index = 0; - shell_input_line_len = i; /* == strlen (shell_input_line) */ - - set_line_mbstate (); - -#if defined (HISTORY) - if (remember_on_history && shell_input_line && shell_input_line[0]) - { - char *expansions; -# if defined (BANG_HISTORY) - int old_hist; - - /* If the current delimiter is a single quote, we should not be - performing history expansion, even if we're on a different - line from the original single quote. */ - old_hist = history_expansion_inhibited; - if (current_delimiter (dstack) == '\'') - history_expansion_inhibited = 1; -# endif - expansions = pre_process_line (shell_input_line, 1, 1); -# if defined (BANG_HISTORY) - history_expansion_inhibited = old_hist; -# endif - if (expansions != shell_input_line) - { - free (shell_input_line); - shell_input_line = expansions; - shell_input_line_len = shell_input_line ? - strlen (shell_input_line) : 0; - if (!shell_input_line_len) - current_command_line_count--; - - /* We have to force the xrealloc below because we don't know - the true allocated size of shell_input_line anymore. */ - shell_input_line_size = shell_input_line_len; - - set_line_mbstate (); - } - } - /* Try to do something intelligent with blank lines encountered while - entering multi-line commands. XXX - this is grotesque */ - else if (remember_on_history && shell_input_line && - shell_input_line[0] == '\0' && - current_command_line_count > 1) - { - if (current_delimiter (dstack)) - /* We know shell_input_line[0] == 0 and we're reading some sort of - quoted string. This means we've got a line consisting of only - a newline in a quoted string. We want to make sure this line - gets added to the history. */ - maybe_add_history (shell_input_line); - else - { - char *hdcs; - hdcs = history_delimiting_chars (); - if (hdcs && hdcs[0] == ';') - maybe_add_history (shell_input_line); - } - } - -#endif /* HISTORY */ - - if (shell_input_line) - { - /* Lines that signify the end of the shell's input should not be - echoed. */ - if (echo_input_at_read && (shell_input_line[0] || - shell_input_line_terminator != EOF)) - fprintf (stderr, "%s\n", shell_input_line); - } - else - { - shell_input_line_size = 0; - prompt_string_pointer = ¤t_prompt_string; - if (SHOULD_PROMPT ()) - prompt_again (); - goto restart_read; - } - - /* Add the newline to the end of this string, iff the string does - not already end in an EOF character. */ - if (shell_input_line_terminator != EOF) - { - if (shell_input_line_len + 3 > shell_input_line_size) - shell_input_line = (char *)xrealloc (shell_input_line, - 1 + (shell_input_line_size += 2)); - - shell_input_line[shell_input_line_len] = '\n'; - shell_input_line[shell_input_line_len + 1] = '\0'; - - set_line_mbstate (); - } - } - - uc = shell_input_line[shell_input_line_index]; - - if (uc) - shell_input_line_index++; - -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) - /* If UC is NULL, we have reached the end of the current input string. If - pushed_string_list is non-empty, it's time to pop to the previous string - because we have fully consumed the result of the last alias expansion. - Do it transparently; just return the next character of the string popped - to. */ - if (!uc && (pushed_string_list != (STRING_SAVER *)NULL)) - { - pop_string (); - uc = shell_input_line[shell_input_line_index]; - if (uc) - shell_input_line_index++; - } -#endif /* ALIAS || DPAREN_ARITHMETIC */ - - if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n') - { - if (SHOULD_PROMPT ()) - prompt_again (); - line_number++; - goto restart_read; - } - - if (!uc && shell_input_line_terminator == EOF) - return ((shell_input_line_index != 0) ? '\n' : EOF); - - return (uc); -} - -/* Put C back into the input for the shell. This might need changes for - HANDLE_MULTIBYTE around EOLs. Since we (currently) never push back a - character different than we read, shell_input_line_property doesn't need - to change when manipulating shell_input_line. The define for - last_shell_getc_is_singlebyte should take care of it, though. */ -static void -shell_ungetc (c) - int c; -{ - if (shell_input_line && shell_input_line_index) - shell_input_line[--shell_input_line_index] = c; - else - eol_ungetc_lookahead = c; -} - -#ifdef INCLUDE_UNUSED -/* Back the input pointer up by one, effectively `ungetting' a character. */ -static void -shell_ungetchar () -{ - if (shell_input_line && shell_input_line_index) - shell_input_line_index--; -} -#endif - -/* Discard input until CHARACTER is seen, then push that character back - onto the input stream. */ -static void -discard_until (character) - int character; -{ - int c; - - while ((c = shell_getc (0)) != EOF && c != character) - ; - - if (c != EOF) - shell_ungetc (c); -} - -void -execute_variable_command (command, vname) - char *command, *vname; -{ - char *last_lastarg; - sh_parser_state_t ps; - - save_parser_state (&ps); - last_lastarg = get_string_value ("_"); - if (last_lastarg) - last_lastarg = savestring (last_lastarg); - - parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST); - - restore_parser_state (&ps); - bind_variable ("_", last_lastarg, 0); - FREE (last_lastarg); - - if (token_to_read == '\n') /* reset_parser was called */ - token_to_read = 0; -} - -/* Place to remember the token. We try to keep the buffer - at a reasonable size, but it can grow. */ -static char *token = (char *)NULL; - -/* Current size of the token buffer. */ -static int token_buffer_size; - -/* Command to read_token () explaining what we want it to do. */ -#define READ 0 -#define RESET 1 -#define prompt_is_ps1 \ - (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt) - -/* Function for yyparse to call. yylex keeps track of - the last two tokens read, and calls read_token. */ -static int -yylex () -{ - if (interactive && (current_token == 0 || current_token == '\n')) - { - /* Before we print a prompt, we might have to check mailboxes. - We do this only if it is time to do so. Notice that only here - is the mail alarm reset; nothing takes place in check_mail () - except the checking of mail. Please don't change this. */ - if (prompt_is_ps1 && time_to_check_mail ()) - { - check_mail (); - reset_mail_timer (); - } - - /* Avoid printing a prompt if we're not going to read anything, e.g. - after resetting the parser with read_token (RESET). */ - if (token_to_read == 0 && SHOULD_PROMPT ()) - prompt_again (); - } - - two_tokens_ago = token_before_that; - token_before_that = last_read_token; - last_read_token = current_token; - current_token = read_token (READ); - - if ((parser_state & PST_EOFTOKEN) && current_token == shell_eof_token) - { - current_token = yacc_EOF; - if (bash_input.type == st_string) - rewind_input_string (); - } - parser_state &= ~PST_EOFTOKEN; - - return (current_token); -} - -/* When non-zero, we have read the required tokens - which allow ESAC to be the next one read. */ -static int esacs_needed_count; - -void -gather_here_documents () -{ - int r; - - r = 0; - while (need_here_doc) - { - parser_state |= PST_HEREDOC; - make_here_document (redir_stack[r++], line_number); - parser_state &= ~PST_HEREDOC; - need_here_doc--; - } -} - -/* When non-zero, an open-brace used to create a group is awaiting a close - brace partner. */ -static int open_brace_count; - -#define command_token_position(token) \ - (((token) == ASSIGNMENT_WORD) || \ - ((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token))) - -#define assignment_acceptable(token) \ - (command_token_position(token) && ((parser_state & PST_CASEPAT) == 0)) - -/* Check to see if TOKEN is a reserved word and return the token - value if it is. */ -#define CHECK_FOR_RESERVED_WORD(tok) \ - do { \ - if (!dollar_present && !quoted && \ - reserved_word_acceptable (last_read_token)) \ - { \ - int i; \ - for (i = 0; word_token_alist[i].word != (char *)NULL; i++) \ - if (STREQ (tok, word_token_alist[i].word)) \ - { \ - if ((parser_state & PST_CASEPAT) && (word_token_alist[i].token != ESAC)) \ - break; \ - if (word_token_alist[i].token == TIME && time_command_acceptable () == 0) \ - break; \ - if (word_token_alist[i].token == ESAC) \ - parser_state &= ~(PST_CASEPAT|PST_CASESTMT); \ - else if (word_token_alist[i].token == CASE) \ - parser_state |= PST_CASESTMT; \ - else if (word_token_alist[i].token == COND_END) \ - parser_state &= ~(PST_CONDCMD|PST_CONDEXPR); \ - else if (word_token_alist[i].token == COND_START) \ - parser_state |= PST_CONDCMD; \ - else if (word_token_alist[i].token == '{') \ - open_brace_count++; \ - else if (word_token_alist[i].token == '}' && open_brace_count) \ - open_brace_count--; \ - return (word_token_alist[i].token); \ - } \ - } \ - } while (0) - -#if defined (ALIAS) - - /* OK, we have a token. Let's try to alias expand it, if (and only if) - it's eligible. - - It is eligible for expansion if EXPAND_ALIASES is set, and - the token is unquoted and the last token read was a command - separator (or expand_next_token is set), and we are currently - processing an alias (pushed_string_list is non-empty) and this - token is not the same as the current or any previously - processed alias. - - Special cases that disqualify: - In a pattern list in a case statement (parser_state & PST_CASEPAT). */ - -static char * -mk_alexpansion (s) - char *s; -{ - int l; - char *r; - - l = strlen (s); - r = xmalloc (l + 2); - strcpy (r, s); - if (r[l -1] != ' ') - r[l++] = ' '; - r[l] = '\0'; - return r; -} - -static int -alias_expand_token (tokstr) - char *tokstr; -{ - char *expanded; - alias_t *ap; - - if (((parser_state & PST_ALEXPNEXT) || command_token_position (last_read_token)) && - (parser_state & PST_CASEPAT) == 0) - { - ap = find_alias (tokstr); - - /* Currently expanding this token. */ - if (ap && (ap->flags & AL_BEINGEXPANDED)) - return (NO_EXPANSION); - - /* mk_alexpansion puts an extra space on the end of the alias expansion, - so the lookahead by the parser works right. If this gets changed, - make sure the code in shell_getc that deals with reaching the end of - an expanded alias is changed with it. */ - expanded = ap ? mk_alexpansion (ap->value) : (char *)NULL; - - if (expanded) - { - push_string (expanded, ap->flags & AL_EXPANDNEXT, ap); - return (RE_READ_TOKEN); - } - else - /* This is an eligible token that does not have an expansion. */ - return (NO_EXPANSION); - } - return (NO_EXPANSION); -} -#endif /* ALIAS */ - -static int -time_command_acceptable () -{ -#if defined (COMMAND_TIMING) - switch (last_read_token) - { - case 0: - case ';': - case '\n': - case AND_AND: - case OR_OR: - case '&': - case DO: - case THEN: - case ELSE: - case '{': /* } */ - case '(': /* ) */ - return 1; - default: - return 0; - } -#else - return 0; -#endif /* COMMAND_TIMING */ -} - -/* Handle special cases of token recognition: - IN is recognized if the last token was WORD and the token - before that was FOR or CASE or SELECT. - - DO is recognized if the last token was WORD and the token - before that was FOR or SELECT. - - ESAC is recognized if the last token caused `esacs_needed_count' - to be set - - `{' is recognized if the last token as WORD and the token - before that was FUNCTION, or if we just parsed an arithmetic - `for' command. - - `}' is recognized if there is an unclosed `{' present. - - `-p' is returned as TIMEOPT if the last read token was TIME. - - ']]' is returned as COND_END if the parser is currently parsing - a conditional expression ((parser_state & PST_CONDEXPR) != 0) - - `time' is returned as TIME if and only if it is immediately - preceded by one of `;', `\n', `||', `&&', or `&'. -*/ - -static int -special_case_tokens (tokstr) - char *tokstr; -{ - if ((last_read_token == WORD) && -#if defined (SELECT_COMMAND) - ((token_before_that == FOR) || (token_before_that == CASE) || (token_before_that == SELECT)) && -#else - ((token_before_that == FOR) || (token_before_that == CASE)) && -#endif - (tokstr[0] == 'i' && tokstr[1] == 'n' && tokstr[2] == 0)) - { - if (token_before_that == CASE) - { - parser_state |= PST_CASEPAT; - esacs_needed_count++; - } - return (IN); - } - - if (last_read_token == WORD && -#if defined (SELECT_COMMAND) - (token_before_that == FOR || token_before_that == SELECT) && -#else - (token_before_that == FOR) && -#endif - (tokstr[0] == 'd' && tokstr[1] == 'o' && tokstr[2] == '\0')) - return (DO); - - /* Ditto for ESAC in the CASE case. - Specifically, this handles "case word in esac", which is a legal - construct, certainly because someone will pass an empty arg to the - case construct, and we don't want it to barf. Of course, we should - insist that the case construct has at least one pattern in it, but - the designers disagree. */ - if (esacs_needed_count) - { - esacs_needed_count--; - if (STREQ (tokstr, "esac")) - { - parser_state &= ~PST_CASEPAT; - return (ESAC); - } - } - - /* The start of a shell function definition. */ - if (parser_state & PST_ALLOWOPNBRC) - { - parser_state &= ~PST_ALLOWOPNBRC; - if (tokstr[0] == '{' && tokstr[1] == '\0') /* } */ - { - open_brace_count++; - function_bstart = line_number; - return ('{'); /* } */ - } - } - - /* We allow a `do' after a for ((...)) without an intervening - list_terminator */ - if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == 'd' && tokstr[1] == 'o' && !tokstr[2]) - return (DO); - if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == '{' && tokstr[1] == '\0') /* } */ - { - open_brace_count++; - return ('{'); /* } */ - } - - if (open_brace_count && reserved_word_acceptable (last_read_token) && tokstr[0] == '}' && !tokstr[1]) - { - open_brace_count--; /* { */ - return ('}'); - } - -#if defined (COMMAND_TIMING) - /* Handle -p after `time'. */ - if (last_read_token == TIME && tokstr[0] == '-' && tokstr[1] == 'p' && !tokstr[2]) - return (TIMEOPT); -#endif - -#if 0 -#if defined (COMMAND_TIMING) - if (STREQ (token, "time") && ((parser_state & PST_CASEPAT) == 0) && time_command_acceptable ()) - return (TIME); -#endif /* COMMAND_TIMING */ -#endif - -#if defined (COND_COMMAND) /* [[ */ - if ((parser_state & PST_CONDEXPR) && tokstr[0] == ']' && tokstr[1] == ']' && tokstr[2] == '\0') - return (COND_END); -#endif - - return (-1); -} - -/* Called from shell.c when Control-C is typed at top level. Or - by the error rule at top level. */ -void -reset_parser () -{ - dstack.delimiter_depth = 0; /* No delimiters found so far. */ - open_brace_count = 0; - - parser_state = 0; - -#if defined (ALIAS) || defined (DPAREN_ARITHMETIC) - if (pushed_string_list) - free_string_list (); -#endif /* ALIAS || DPAREN_ARITHMETIC */ - - if (shell_input_line) - { - free (shell_input_line); - shell_input_line = (char *)NULL; - shell_input_line_size = shell_input_line_index = 0; - } - - FREE (word_desc_to_read); - word_desc_to_read = (WORD_DESC *)NULL; - - current_token = '\n'; /* XXX */ - last_read_token = '\n'; - token_to_read = '\n'; -} - -/* Read the next token. Command can be READ (normal operation) or - RESET (to normalize state). */ -static int -read_token (command) - int command; -{ - int character; /* Current character. */ - int peek_char; /* Temporary look-ahead character. */ - int result; /* The thing to return. */ - - if (command == RESET) - { - reset_parser (); - return ('\n'); - } - - if (token_to_read) - { - result = token_to_read; - if (token_to_read == WORD || token_to_read == ASSIGNMENT_WORD) - { - yylval.word = word_desc_to_read; - word_desc_to_read = (WORD_DESC *)NULL; - } - token_to_read = 0; - return (result); - } - -#if defined (COND_COMMAND) - if ((parser_state & (PST_CONDCMD|PST_CONDEXPR)) == PST_CONDCMD) - { - cond_lineno = line_number; - parser_state |= PST_CONDEXPR; - yylval.command = parse_cond_command (); - if (cond_token != COND_END) - { - cond_error (); - return (-1); - } - token_to_read = COND_END; - parser_state &= ~(PST_CONDEXPR|PST_CONDCMD); - return (COND_CMD); - } -#endif - -#if defined (ALIAS) - /* This is a place to jump back to once we have successfully expanded a - token with an alias and pushed the string with push_string () */ - re_read_token: -#endif /* ALIAS */ - - /* Read a single word from input. Start by skipping blanks. */ - while ((character = shell_getc (1)) != EOF && shellblank (character)) - ; - - if (character == EOF) - { - EOF_Reached = 1; - return (yacc_EOF); - } - - if MBTEST(character == '#' && (!interactive || interactive_comments)) - { - /* A comment. Discard until EOL or EOF, and then return a newline. */ - discard_until ('\n'); - shell_getc (0); - character = '\n'; /* this will take the next if statement and return. */ - } - - if (character == '\n') - { - /* If we're about to return an unquoted newline, we can go and collect - the text of any pending here document. */ - if (need_here_doc) - gather_here_documents (); - -#if defined (ALIAS) - parser_state &= ~PST_ALEXPNEXT; -#endif /* ALIAS */ - - parser_state &= ~PST_ASSIGNOK; - - return (character); - } - - if (parser_state & PST_REGEXP) - goto tokword; - - /* Shell meta-characters. */ - if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0)) - { -#if defined (ALIAS) - /* Turn off alias tokenization iff this character sequence would - not leave us ready to read a command. */ - if (character == '<' || character == '>') - parser_state &= ~PST_ALEXPNEXT; -#endif /* ALIAS */ - - parser_state &= ~PST_ASSIGNOK; - - peek_char = shell_getc (1); - if (character == peek_char) - { - switch (character) - { - case '<': - /* If '<' then we could be at "<<" or at "<<-". We have to - look ahead one more character. */ - peek_char = shell_getc (1); - if MBTEST(peek_char == '-') - return (LESS_LESS_MINUS); - else if MBTEST(peek_char == '<') - return (LESS_LESS_LESS); - else - { - shell_ungetc (peek_char); - return (LESS_LESS); - } - - case '>': - return (GREATER_GREATER); - - case ';': - parser_state |= PST_CASEPAT; -#if defined (ALIAS) - parser_state &= ~PST_ALEXPNEXT; -#endif /* ALIAS */ - - peek_char = shell_getc (1); - if MBTEST(peek_char == '&') - return (SEMI_SEMI_AND); - else - { - shell_ungetc (peek_char); - return (SEMI_SEMI); - } - - case '&': - return (AND_AND); - - case '|': - return (OR_OR); - -#if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND) - case '(': /* ) */ - result = parse_dparen (character); - if (result == -2) - break; - else - return result; -#endif - } - } - else if MBTEST(character == '<' && peek_char == '&') - return (LESS_AND); - else if MBTEST(character == '>' && peek_char == '&') - return (GREATER_AND); - else if MBTEST(character == '<' && peek_char == '>') - return (LESS_GREATER); - else if MBTEST(character == '>' && peek_char == '|') - return (GREATER_BAR); - else if MBTEST(character == '&' && peek_char == '>') - { - peek_char = shell_getc (1); - if MBTEST(peek_char == '>') - return (AND_GREATER_GREATER); - else - { - shell_ungetc (peek_char); - return (AND_GREATER); - } - } - else if MBTEST(character == '|' && peek_char == '&') - return (BAR_AND); - else if MBTEST(character == ';' && peek_char == '&') - { - parser_state |= PST_CASEPAT; -#if defined (ALIAS) - parser_state &= ~PST_ALEXPNEXT; -#endif /* ALIAS */ - return (SEMI_AND); - } - - shell_ungetc (peek_char); - - /* If we look like we are reading the start of a function - definition, then let the reader know about it so that - we will do the right thing with `{'. */ - if MBTEST(character == ')' && last_read_token == '(' && token_before_that == WORD) - { - parser_state |= PST_ALLOWOPNBRC; -#if defined (ALIAS) - parser_state &= ~PST_ALEXPNEXT; -#endif /* ALIAS */ - function_dstart = line_number; - } - - /* case pattern lists may be preceded by an optional left paren. If - we're not trying to parse a case pattern list, the left paren - indicates a subshell. */ - if MBTEST(character == '(' && (parser_state & PST_CASEPAT) == 0) /* ) */ - parser_state |= PST_SUBSHELL; - /*(*/ - else if MBTEST((parser_state & PST_CASEPAT) && character == ')') - parser_state &= ~PST_CASEPAT; - /*(*/ - else if MBTEST((parser_state & PST_SUBSHELL) && character == ')') - parser_state &= ~PST_SUBSHELL; - -#if defined (PROCESS_SUBSTITUTION) - /* Check for the constructs which introduce process substitution. - Shells running in `posix mode' don't do process substitution. */ - if MBTEST(posixly_correct || ((character != '>' && character != '<') || peek_char != '(')) /*)*/ -#endif /* PROCESS_SUBSTITUTION */ - return (character); - } - - /* Hack <&- (close stdin) case. Also <&N- (dup and close). */ - if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND)) - return (character); - -tokword: - /* Okay, if we got this far, we have to read a word. Read one, - and then check it against the known ones. */ - result = read_token_word (character); -#if defined (ALIAS) - if (result == RE_READ_TOKEN) - goto re_read_token; -#endif - return result; -} - -/* - * Match a $(...) or other grouping construct. This has to handle embedded - * quoted strings ('', ``, "") and nested constructs. It also must handle - * reprompting the user, if necessary, after reading a newline, and returning - * correct error values if it reads EOF. - */ -#define P_FIRSTCLOSE 0x01 -#define P_ALLOWESC 0x02 -#define P_DQUOTE 0x04 -#define P_COMMAND 0x08 /* parsing a command, so look for comments */ -#define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */ -#define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */ - -/* Lexical state while parsing a grouping construct or $(...). */ -#define LEX_WASDOL 0x001 -#define LEX_CKCOMMENT 0x002 -#define LEX_INCOMMENT 0x004 -#define LEX_PASSNEXT 0x008 -#define LEX_RESWDOK 0x010 -#define LEX_CKCASE 0x020 -#define LEX_INCASE 0x040 -#define LEX_INHEREDOC 0x080 -#define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */ -#define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */ -#define LEX_INWORD 0x400 - -#define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|') - -#define CHECK_NESTRET_ERROR() \ - do { \ - if (nestret == &matched_pair_error) \ - { \ - free (ret); \ - return &matched_pair_error; \ - } \ - } while (0) - -#define APPEND_NESTRET() \ - do { \ - if (nestlen) \ - { \ - RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64); \ - strcpy (ret + retind, nestret); \ - retind += nestlen; \ - } \ - } while (0) - -static char matched_pair_error; - -static char * -parse_matched_pair (qc, open, close, lenp, flags) - int qc; /* `"' if this construct is within double quotes */ - int open, close; - int *lenp, flags; -{ - int count, ch, tflags; - int nestlen, ttranslen, start_lineno; - char *ret, *nestret, *ttrans; - int retind, retsize, rflags; - -/*itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */ - count = 1; - tflags = 0; - - if ((flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0) - tflags |= LEX_CKCOMMENT; - - /* RFLAGS is the set of flags we want to pass to recursive calls. */ - rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); - - ret = (char *)xmalloc (retsize = 64); - retind = 0; - - start_lineno = line_number; - while (count) - { - ch = shell_getc (qc != '\'' && (tflags & LEX_PASSNEXT) == 0); - - if (ch == EOF) - { - free (ret); - parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close); - EOF_Reached = 1; /* XXX */ - return (&matched_pair_error); - } - - /* Possible reprompting. */ - if (ch == '\n' && SHOULD_PROMPT ()) - prompt_again (); - - /* Don't bother counting parens or doing anything else if in a comment - or part of a case statement */ - if (tflags & LEX_INCOMMENT) - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - - if (ch == '\n') - tflags &= ~LEX_INCOMMENT; - - continue; - } - - /* Not exactly right yet, should handle shell metacharacters, too. If - any changes are made to this test, make analogous changes to subst.c: - extract_delimited_string(). */ - else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1]))) - tflags |= LEX_INCOMMENT; - - if (tflags & LEX_PASSNEXT) /* last char was backslash */ - { - tflags &= ~LEX_PASSNEXT; - if (qc != '\'' && ch == '\n') /* double-quoted \ disappears. */ - { - if (retind > 0) - retind--; /* swallow previously-added backslash */ - continue; - } - - RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); - if MBTEST(ch == CTLESC || ch == CTLNUL) - ret[retind++] = CTLESC; - ret[retind++] = ch; - continue; - } - /* If we're reparsing the input (e.g., from parse_string_to_word_list), - we've already prepended CTLESC to single-quoted results of $'...'. - We may want to do this for other CTLESC-quoted characters in - reparse, too. */ - else if MBTEST((parser_state & PST_REPARSE) && open == '\'' && (ch == CTLESC || ch == CTLNUL)) - { - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - continue; - } - else if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ - { - RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); - ret[retind++] = CTLESC; - ret[retind++] = ch; - continue; - } - else if MBTEST(ch == close) /* ending delimiter */ - count--; - /* handle nested ${...} specially. */ - else if MBTEST(open != close && (tflags & LEX_WASDOL) && open == '{' && ch == open) /* } */ - count++; - else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && ch == open) /* nested begin */ - count++; - - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - - /* If we just read the ending character, don't bother continuing. */ - if (count == 0) - break; - - if (open == '\'') /* '' inside grouping construct */ - { - if MBTEST((flags & P_ALLOWESC) && ch == '\\') - tflags |= LEX_PASSNEXT; - continue; - } - - if MBTEST(ch == '\\') /* backslashes */ - tflags |= LEX_PASSNEXT; - -#if 0 - /* The big hammer. Single quotes aren't special in double quotes. The - problem is that Posix says the single quotes are semi-special: - within a double-quoted ${...} construct "an even number of - unescaped double-quotes or single-quotes, if any, shall occur." */ - if MBTEST(open == '{' && (flags & P_DQUOTE) && ch == '\'') /* } */ - continue; -#endif - - /* Could also check open == '`' if we want to parse grouping constructs - inside old-style command substitution. */ - if (open != close) /* a grouping construct */ - { - if MBTEST(shellquote (ch)) - { - /* '', ``, or "" inside $(...) or other grouping construct. */ - push_delimiter (dstack, ch); - if MBTEST((tflags & LEX_WASDOL) && ch == '\'') /* $'...' inside group */ - nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags); - else - nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags); - pop_delimiter (dstack); - CHECK_NESTRET_ERROR (); - - if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0)) - { - /* Translate $'...' here. */ - ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen); - xfree (nestret); - - if ((rflags & P_DQUOTE) == 0) - { - nestret = sh_single_quote (ttrans); - free (ttrans); - nestlen = strlen (nestret); - } - else - { - nestret = ttrans; - nestlen = ttranslen; - } - retind -= 2; /* back up before the $' */ - } - else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0)) - { - /* Locale expand $"..." here. */ - ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen); - xfree (nestret); - - nestret = sh_mkdoublequoted (ttrans, ttranslen, 0); - free (ttrans); - nestlen = ttranslen + 2; - retind -= 2; /* back up before the $" */ - } - - APPEND_NESTRET (); - FREE (nestret); - } - else if ((flags & P_ARRAYSUB) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ - goto parse_dollar_word; - } - /* Parse an old-style command substitution within double quotes as a - single word. */ - /* XXX - sh and ksh93 don't do this - XXX */ - else if MBTEST(open == '"' && ch == '`') - { - nestret = parse_matched_pair (0, '`', '`', &nestlen, rflags); - - CHECK_NESTRET_ERROR (); - APPEND_NESTRET (); - - FREE (nestret); - } - else if MBTEST(open != '`' && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ - /* check for $(), $[], or ${} inside quoted string. */ - { -parse_dollar_word: - if (open == ch) /* undo previous increment */ - count--; - if (ch == '(') /* ) */ - nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE); - else if (ch == '{') /* } */ - nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags); - else if (ch == '[') /* ] */ - nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags); - - CHECK_NESTRET_ERROR (); - APPEND_NESTRET (); - - FREE (nestret); - } - if MBTEST(ch == '$') - tflags |= LEX_WASDOL; - else - tflags &= ~LEX_WASDOL; - } - - ret[retind] = '\0'; - if (lenp) - *lenp = retind; - return ret; -} - -/* Parse a $(...) command substitution. This is messier than I'd like, and - reproduces a lot more of the token-reading code than I'd like. */ -static char * -parse_comsub (qc, open, close, lenp, flags) - int qc; /* `"' if this construct is within double quotes */ - int open, close; - int *lenp, flags; -{ - int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind; - int nestlen, ttranslen, start_lineno; - char *ret, *nestret, *ttrans, *heredelim; - int retind, retsize, rflags, hdlen; - -/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/ - count = 1; - tflags = LEX_RESWDOK; - - if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0) - tflags |= LEX_CKCASE; - if ((tflags & LEX_CKCASE) && (interactive == 0 || interactive_comments)) - tflags |= LEX_CKCOMMENT; - - /* RFLAGS is the set of flags we want to pass to recursive calls. */ - rflags = (flags & P_DQUOTE); - - ret = (char *)xmalloc (retsize = 64); - retind = 0; - - start_lineno = line_number; - lex_rwlen = lex_wlen = 0; - - heredelim = 0; - lex_firstind = -1; - - while (count) - { -comsub_readchar: - ch = shell_getc (qc != '\'' && (tflags & LEX_PASSNEXT) == 0); - - if (ch == EOF) - { -eof_error: - free (ret); - FREE (heredelim); - parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close); - EOF_Reached = 1; /* XXX */ - return (&matched_pair_error); - } - - /* If we hit the end of a line and are reading the contents of a here - document, and it's not the same line that the document starts on, - check for this line being the here doc delimiter. Otherwise, if - we're in a here document, mark the next character as the beginning - of a line. */ - if (ch == '\n') - { - if ((tflags & LEX_HEREDELIM) && heredelim) - { - tflags &= ~LEX_HEREDELIM; - tflags |= LEX_INHEREDOC; - lex_firstind = retind + 1; - } - else if (tflags & LEX_INHEREDOC) - { - int tind; - tind = lex_firstind; - while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t') - tind++; - if (STREQN (ret + tind, heredelim, hdlen)) - { - tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC); -/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/ - lex_firstind = -1; - } - else - lex_firstind = retind + 1; - } - } - - /* Possible reprompting. */ - if (ch == '\n' && SHOULD_PROMPT ()) - prompt_again (); - - /* Don't bother counting parens or doing anything else if in a comment */ - if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC)) - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - - if ((tflags & LEX_INCOMMENT) && ch == '\n') -{ -/*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/ - tflags &= ~LEX_INCOMMENT; -} - - continue; - } - - if (tflags & LEX_PASSNEXT) /* last char was backslash */ - { -/*itrace("parse_comsub:%d: lex_passnext -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ - tflags &= ~LEX_PASSNEXT; - if (qc != '\'' && ch == '\n') /* double-quoted \ disappears. */ - { - if (retind > 0) - retind--; /* swallow previously-added backslash */ - continue; - } - - RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); - if MBTEST(ch == CTLESC || ch == CTLNUL) - ret[retind++] = CTLESC; - ret[retind++] = ch; - continue; - } - - /* If this is a shell break character, we are not in a word. If not, - we either start or continue a word. */ - if MBTEST(shellbreak (ch)) - { - tflags &= ~LEX_INWORD; -/*itrace("parse_comsub:%d: lex_inword -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ - } - else - { - if (tflags & LEX_INWORD) - { - lex_wlen++; -/*itrace("parse_comsub:%d: lex_inword == 1 ch = `%c' lex_wlen = %d (%d)", line_number, ch, lex_wlen, __LINE__);*/ - } - else - { -/*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/ - tflags |= LEX_INWORD; - lex_wlen = 0; - } - } - - /* Skip whitespace */ - if MBTEST(shellblank (ch) && lex_rwlen == 0) - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - continue; - } - - /* Either we are looking for the start of the here-doc delimiter - (lex_firstind == -1) or we are reading one (lex_firstind >= 0). - If this character is a shell break character and we are reading - the delimiter, save it and note that we are now reading a here - document. If we've found the start of the delimiter, note it by - setting lex_firstind. Backslashes can quote shell metacharacters - in here-doc delimiters. */ - if (tflags & LEX_HEREDELIM) - { - if (lex_firstind == -1 && shellbreak (ch) == 0) - lex_firstind = retind; - else if (lex_firstind >= 0 && (tflags & LEX_PASSNEXT) == 0 && shellbreak (ch)) - { - nestret = substring (ret, lex_firstind, retind); - heredelim = string_quote_removal (nestret, 0); - free (nestret); - hdlen = STRLEN(heredelim); -/*itrace("parse_comsub:%d: found here doc delimiter `%s' (%d)", line_number, heredelim, hdlen);*/ - if (ch == '\n') - { - tflags |= LEX_INHEREDOC; - tflags &= ~LEX_HEREDELIM; - lex_firstind = retind + 1; - } - else - lex_firstind = -1; - } - } - - /* Meta-characters that can introduce a reserved word. Not perfect yet. */ - if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch)) - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - peekc = shell_getc (1); - if (ch == peekc && (ch == '&' || ch == '|' || ch == ';')) /* two-character tokens */ - { - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = peekc; -/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/ - tflags |= LEX_RESWDOK; - lex_rwlen = 0; - continue; - } - else if (ch == '\n' || COMSUB_META(ch)) - { - shell_ungetc (peekc); -/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/ - tflags |= LEX_RESWDOK; - lex_rwlen = 0; - continue; - } - else if (ch == EOF) - goto eof_error; - else - { - /* `unget' the character we just added and fall through */ - retind--; - shell_ungetc (peekc); - } - } - - /* If we can read a reserved word, try to read one. */ - if (tflags & LEX_RESWDOK) - { - if MBTEST(islower (ch)) - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - lex_rwlen++; - continue; - } - else if MBTEST(lex_rwlen == 4 && shellbreak (ch)) - { - if (STREQN (ret + retind - 4, "case", 4)) -{ - tflags |= LEX_INCASE; -/*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/ -} - else if (STREQN (ret + retind - 4, "esac", 4)) -{ - tflags &= ~LEX_INCASE; -/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/ -} - tflags &= ~LEX_RESWDOK; - } - else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0))) - ; /* don't modify LEX_RESWDOK if we're starting a comment */ - else if MBTEST((tflags & LEX_INCASE) && ch != '\n') - /* If we can read a reserved word and we're in case, we're at the - point where we can read a new pattern list or an esac. We - handle the esac case above. If we read a newline, we want to - leave LEX_RESWDOK alone. If we read anything else, we want to - turn off LEX_RESWDOK, since we're going to read a pattern list. */ -{ - tflags &= ~LEX_RESWDOK; -/*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/ -} - else if MBTEST(shellbreak (ch) == 0) -{ - tflags &= ~LEX_RESWDOK; -/*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/ -} - } - - /* Might be the start of a here-doc delimiter */ - if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<') - { - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - peekc = shell_getc (1); - if (peekc == EOF) - goto eof_error; - if (peekc == ch) - { - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = peekc; - peekc = shell_getc (1); - if (peekc == EOF) - goto eof_error; - if (peekc == '-') - { - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = peekc; - tflags |= LEX_STRIPDOC; - } - else - shell_ungetc (peekc); - if (peekc != '<') - { - tflags |= LEX_HEREDELIM; - lex_firstind = -1; - } - continue; - } - else - ch = peekc; /* fall through and continue XXX */ - } - else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0))) -{ -/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/ - tflags |= LEX_INCOMMENT; -} - - if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ - { - RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); - ret[retind++] = CTLESC; - ret[retind++] = ch; - continue; - } -#if 0 - else if MBTEST((tflags & LEX_INCASE) && ch == close && close == ')') - tflags &= ~LEX_INCASE; /* XXX */ -#endif - else if MBTEST(ch == close && (tflags & LEX_INCASE) == 0) /* ending delimiter */ -{ - count--; -/*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/ -} - else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */ -{ - count++; -/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/ -} - - /* Add this character. */ - RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); - ret[retind++] = ch; - - /* If we just read the ending character, don't bother continuing. */ - if (count == 0) - break; - - if MBTEST(ch == '\\') /* backslashes */ - tflags |= LEX_PASSNEXT; - - if MBTEST(shellquote (ch)) - { - /* '', ``, or "" inside $(...). */ - push_delimiter (dstack, ch); - if MBTEST((tflags & LEX_WASDOL) && ch == '\'') /* $'...' inside group */ - nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags); - else - nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags); - pop_delimiter (dstack); - CHECK_NESTRET_ERROR (); - - if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0)) - { - /* Translate $'...' here. */ - ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen); - xfree (nestret); - - if ((rflags & P_DQUOTE) == 0) - { - nestret = sh_single_quote (ttrans); - free (ttrans); - nestlen = strlen (nestret); - } - else - { - nestret = ttrans; - nestlen = ttranslen; - } - retind -= 2; /* back up before the $' */ - } - else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0)) - { - /* Locale expand $"..." here. */ - ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen); - xfree (nestret); - - nestret = sh_mkdoublequoted (ttrans, ttranslen, 0); - free (ttrans); - nestlen = ttranslen + 2; - retind -= 2; /* back up before the $" */ - } - - APPEND_NESTRET (); - FREE (nestret); - } - else if MBTEST((tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ - /* check for $(), $[], or ${} inside command substitution. */ - { - if ((tflags & LEX_INCASE) == 0 && open == ch) /* undo previous increment */ - count--; - if (ch == '(') /* ) */ - nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE); - else if (ch == '{') /* } */ - nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags); - else if (ch == '[') /* ] */ - nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags); - - CHECK_NESTRET_ERROR (); - APPEND_NESTRET (); - - FREE (nestret); - } - if MBTEST(ch == '$') - tflags |= LEX_WASDOL; - else - tflags &= ~LEX_WASDOL; - } - - FREE (heredelim); - ret[retind] = '\0'; - if (lenp) - *lenp = retind; -/*itrace("parse_comsub:%d: returning `%s'", line_number, ret);*/ - return ret; -} - -/* XXX - this needs to handle functionality like subst.c:no_longjmp_on_fatal_error; - maybe extract_command_subst should handle it. */ -char * -xparse_dolparen (base, string, indp, flags) - char *base; - char *string; - int *indp; - int flags; -{ - sh_parser_state_t ps; - int orig_ind, nc, sflags; - char *ret, *s, *ep, *ostring; - - /*yydebug = 1;*/ - orig_ind = *indp; - ostring = string; - - sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE; - if (flags & SX_NOLONGJMP) - sflags |= SEVAL_NOLONGJMP; - save_parser_state (&ps); - - /*(*/ - parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/ - shell_eof_token = ')'; - parse_string (string, "command substitution", sflags, &ep); - - restore_parser_state (&ps); - reset_parser (); - if (interactive) - token_to_read = 0; - - /* Need to find how many characters parse_and_execute consumed, update - *indp, if flags != 0, copy the portion of the string parsed into RET - and return it. If flags & 1 (EX_NOALLOC) we can return NULL. */ - - /*(*/ - if (ep[-1] != ')') - { -#if DEBUG - if (ep[-1] != '\n') - itrace("xparse_dolparen:%d: ep[-1] != RPAREN (%d), ep = `%s'", line_number, ep[-1], ep); -#endif - while (ep > ostring && ep[-1] == '\n') ep--; - } - - nc = ep - ostring; - *indp = ep - base - 1; - - /*(*/ -#if DEBUG - if (base[*indp] != ')') - itrace("xparse_dolparen:%d: base[%d] != RPAREN (%d), base = `%s'", line_number, *indp, base[*indp], base); -#endif - - if (flags & SX_NOALLOC) - return (char *)NULL; - - if (nc == 0) - { - ret = xmalloc (1); - ret[0] = '\0'; - } - else - ret = substring (ostring, 0, nc - 1); - - return ret; -} - -#if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND) -/* Parse a double-paren construct. It can be either an arithmetic - command, an arithmetic `for' command, or a nested subshell. Returns - the parsed token, -1 on error, or -2 if we didn't do anything and - should just go on. */ -static int -parse_dparen (c) - int c; -{ - int cmdtyp, sline; - char *wval; - WORD_DESC *wd; - -#if defined (ARITH_FOR_COMMAND) - if (last_read_token == FOR) - { - arith_for_lineno = line_number; - cmdtyp = parse_arith_cmd (&wval, 0); - if (cmdtyp == 1) - { - wd = alloc_word_desc (); - wd->word = wval; - yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL); - return (ARITH_FOR_EXPRS); - } - else - return -1; /* ERROR */ - } -#endif - -#if defined (DPAREN_ARITHMETIC) - if (reserved_word_acceptable (last_read_token)) - { - sline = line_number; - - cmdtyp = parse_arith_cmd (&wval, 0); - if (cmdtyp == 1) /* arithmetic command */ - { - wd = alloc_word_desc (); - wd->word = wval; - wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB|W_DQUOTE; - yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL); - return (ARITH_CMD); - } - else if (cmdtyp == 0) /* nested subshell */ - { - push_string (wval, 0, (alias_t *)NULL); - if ((parser_state & PST_CASEPAT) == 0) - parser_state |= PST_SUBSHELL; - return (c); - } - else /* ERROR */ - return -1; - } -#endif - - return -2; /* XXX */ -} - -/* We've seen a `(('. Look for the matching `))'. If we get it, return 1. - If not, assume it's a nested subshell for backwards compatibility and - return 0. In any case, put the characters we've consumed into a locally- - allocated buffer and make *ep point to that buffer. Return -1 on an - error, for example EOF. */ -static int -parse_arith_cmd (ep, adddq) - char **ep; - int adddq; -{ - int exp_lineno, rval, c; - char *ttok, *tokstr; - int ttoklen; - - exp_lineno = line_number; - ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0); - rval = 1; - if (ttok == &matched_pair_error) - return -1; - /* Check that the next character is the closing right paren. If - not, this is a syntax error. ( */ - c = shell_getc (0); - if MBTEST(c != ')') - rval = 0; - - tokstr = (char *)xmalloc (ttoklen + 4); - - /* if ADDDQ != 0 then (( ... )) -> "..." */ - if (rval == 1 && adddq) /* arith cmd, add double quotes */ - { - tokstr[0] = '"'; - strncpy (tokstr + 1, ttok, ttoklen - 1); - tokstr[ttoklen] = '"'; - tokstr[ttoklen+1] = '\0'; - } - else if (rval == 1) /* arith cmd, don't add double quotes */ - { - strncpy (tokstr, ttok, ttoklen - 1); - tokstr[ttoklen-1] = '\0'; - } - else /* nested subshell */ - { - tokstr[0] = '('; - strncpy (tokstr + 1, ttok, ttoklen - 1); - tokstr[ttoklen] = ')'; - tokstr[ttoklen+1] = c; - tokstr[ttoklen+2] = '\0'; - } - - *ep = tokstr; - FREE (ttok); - return rval; -} -#endif /* DPAREN_ARITHMETIC || ARITH_FOR_COMMAND */ - -#if defined (COND_COMMAND) -static void -cond_error () -{ - char *etext; - - if (EOF_Reached && cond_token != COND_ERROR) /* [[ */ - parser_error (cond_lineno, _("unexpected EOF while looking for `]]'")); - else if (cond_token != COND_ERROR) - { - if (etext = error_token_from_token (cond_token)) - { - parser_error (cond_lineno, _("syntax error in conditional expression: unexpected token `%s'"), etext); - free (etext); - } - else - parser_error (cond_lineno, _("syntax error in conditional expression")); - } -} - -static COND_COM * -cond_expr () -{ - return (cond_or ()); -} - -static COND_COM * -cond_or () -{ - COND_COM *l, *r; - - l = cond_and (); - if (cond_token == OR_OR) - { - r = cond_or (); - l = make_cond_node (COND_OR, (WORD_DESC *)NULL, l, r); - } - return l; -} - -static COND_COM * -cond_and () -{ - COND_COM *l, *r; - - l = cond_term (); - if (cond_token == AND_AND) - { - r = cond_and (); - l = make_cond_node (COND_AND, (WORD_DESC *)NULL, l, r); - } - return l; -} - -static int -cond_skip_newlines () -{ - while ((cond_token = read_token (READ)) == '\n') - { - if (SHOULD_PROMPT ()) - prompt_again (); - } - return (cond_token); -} - -#define COND_RETURN_ERROR() \ - do { cond_token = COND_ERROR; return ((COND_COM *)NULL); } while (0) - -static COND_COM * -cond_term () -{ - WORD_DESC *op; - COND_COM *term, *tleft, *tright; - int tok, lineno; - char *etext; - - /* Read a token. It can be a left paren, a `!', a unary operator, or a - word that should be the first argument of a binary operator. Start by - skipping newlines, since this is a compound command. */ - tok = cond_skip_newlines (); - lineno = line_number; - if (tok == COND_END) - { - COND_RETURN_ERROR (); - } - else if (tok == '(') - { - term = cond_expr (); - if (cond_token != ')') - { - if (term) - dispose_cond_node (term); /* ( */ - if (etext = error_token_from_token (cond_token)) - { - parser_error (lineno, _("unexpected token `%s', expected `)'"), etext); - free (etext); - } - else - parser_error (lineno, _("expected `)'")); - COND_RETURN_ERROR (); - } - term = make_cond_node (COND_EXPR, (WORD_DESC *)NULL, term, (COND_COM *)NULL); - (void)cond_skip_newlines (); - } - else if (tok == BANG || (tok == WORD && (yylval.word->word[0] == '!' && yylval.word->word[1] == '\0'))) - { - if (tok == WORD) - dispose_word (yylval.word); /* not needed */ - term = cond_term (); - if (term) - term->flags |= CMD_INVERT_RETURN; - } - else if (tok == WORD && yylval.word->word[0] == '-' && yylval.word->word[2] == 0 && test_unop (yylval.word->word)) - { - op = yylval.word; - tok = read_token (READ); - if (tok == WORD) - { - tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); - term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL); - } - else - { - dispose_word (op); - if (etext = error_token_from_token (tok)) - { - parser_error (line_number, _("unexpected argument `%s' to conditional unary operator"), etext); - free (etext); - } - else - parser_error (line_number, _("unexpected argument to conditional unary operator")); - COND_RETURN_ERROR (); - } - - (void)cond_skip_newlines (); - } - else if (tok == WORD) /* left argument to binary operator */ - { - /* lhs */ - tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); - - /* binop */ - tok = read_token (READ); - if (tok == WORD && test_binop (yylval.word->word)) - op = yylval.word; -#if defined (COND_REGEXP) - else if (tok == WORD && STREQ (yylval.word->word, "=~")) - { - op = yylval.word; - parser_state |= PST_REGEXP; - } -#endif - else if (tok == '<' || tok == '>') - op = make_word_from_token (tok); /* ( */ - /* There should be a check before blindly accepting the `)' that we have - seen the opening `('. */ - else if (tok == COND_END || tok == AND_AND || tok == OR_OR || tok == ')') - { - /* Special case. [[ x ]] is equivalent to [[ -n x ]], just like - the test command. Similarly for [[ x && expr ]] or - [[ x || expr ]] or [[ (x) ]]. */ - op = make_word ("-n"); - term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL); - cond_token = tok; - return (term); - } - else - { - if (etext = error_token_from_token (tok)) - { - parser_error (line_number, _("unexpected token `%s', conditional binary operator expected"), etext); - free (etext); - } - else - parser_error (line_number, _("conditional binary operator expected")); - dispose_cond_node (tleft); - COND_RETURN_ERROR (); - } - - /* rhs */ - tok = read_token (READ); - parser_state &= ~PST_REGEXP; - if (tok == WORD) - { - tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); - term = make_cond_node (COND_BINARY, op, tleft, tright); - } - else - { - if (etext = error_token_from_token (tok)) - { - parser_error (line_number, _("unexpected argument `%s' to conditional binary operator"), etext); - free (etext); - } - else - parser_error (line_number, _("unexpected argument to conditional binary operator")); - dispose_cond_node (tleft); - dispose_word (op); - COND_RETURN_ERROR (); - } - - (void)cond_skip_newlines (); - } - else - { - if (tok < 256) - parser_error (line_number, _("unexpected token `%c' in conditional command"), tok); - else if (etext = error_token_from_token (tok)) - { - parser_error (line_number, _("unexpected token `%s' in conditional command"), etext); - free (etext); - } - else - parser_error (line_number, _("unexpected token %d in conditional command"), tok); - COND_RETURN_ERROR (); - } - return (term); -} - -/* This is kind of bogus -- we slip a mini recursive-descent parser in - here to handle the conditional statement syntax. */ -static COMMAND * -parse_cond_command () -{ - COND_COM *cexp; - - cexp = cond_expr (); - return (make_cond_command (cexp)); -} -#endif - -#if defined (ARRAY_VARS) -/* When this is called, it's guaranteed that we don't care about anything - in t beyond i. We do save and restore the chars, though. */ -static int -token_is_assignment (t, i) - char *t; - int i; -{ - unsigned char c, c1; - int r; - - c = t[i]; c1 = t[i+1]; - t[i] = '='; t[i+1] = '\0'; - r = assignment (t, (parser_state & PST_COMPASSIGN) != 0); - t[i] = c; t[i+1] = c1; - return r; -} - -/* XXX - possible changes here for `+=' */ -static int -token_is_ident (t, i) - char *t; - int i; -{ - unsigned char c; - int r; - - c = t[i]; - t[i] = '\0'; - r = legal_identifier (t); - t[i] = c; - return r; -} -#endif - -static int -read_token_word (character) - int character; -{ - /* The value for YYLVAL when a WORD is read. */ - WORD_DESC *the_word; - - /* Index into the token that we are building. */ - int token_index; - - /* ALL_DIGITS becomes zero when we see a non-digit. */ - int all_digit_token; - - /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */ - int dollar_present; - - /* COMPOUND_ASSIGNMENT becomes non-zero if we are parsing a compound - assignment. */ - int compound_assignment; - - /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */ - int quoted; - - /* Non-zero means to ignore the value of the next character, and just - to add it no matter what. */ - int pass_next_character; - - /* The current delimiting character. */ - int cd; - int result, peek_char; - char *ttok, *ttrans; - int ttoklen, ttranslen; - intmax_t lvalue; - - if (token_buffer_size < TOKEN_DEFAULT_INITIAL_SIZE) - token = (char *)xrealloc (token, token_buffer_size = TOKEN_DEFAULT_INITIAL_SIZE); - - token_index = 0; - all_digit_token = DIGIT (character); - dollar_present = quoted = pass_next_character = compound_assignment = 0; - - for (;;) - { - if (character == EOF) - goto got_token; - - if (pass_next_character) - { - pass_next_character = 0; - goto got_escaped_character; - } - - cd = current_delimiter (dstack); - - /* Handle backslashes. Quote lots of things when not inside of - double-quotes, quote some things inside of double-quotes. */ - if MBTEST(character == '\\') - { - peek_char = shell_getc (0); - - /* Backslash-newline is ignored in all cases except - when quoted with single quotes. */ - if (peek_char == '\n') - { - character = '\n'; - goto next_character; - } - else - { - shell_ungetc (peek_char); - - /* If the next character is to be quoted, note it now. */ - if (cd == 0 || cd == '`' || - (cd == '"' && peek_char >= 0 && (sh_syntaxtab[peek_char] & CBSDQUOTE))) - pass_next_character++; - - quoted = 1; - goto got_character; - } - } - - /* Parse a matched pair of quote characters. */ - if MBTEST(shellquote (character)) - { - push_delimiter (dstack, character); - ttok = parse_matched_pair (character, character, character, &ttoklen, (character == '`') ? P_COMMAND : 0); - pop_delimiter (dstack); - if (ttok == &matched_pair_error) - return -1; /* Bail immediately. */ - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, - token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); - token[token_index++] = character; - strcpy (token + token_index, ttok); - token_index += ttoklen; - all_digit_token = 0; - quoted = 1; - dollar_present |= (character == '"' && strchr (ttok, '$') != 0); - FREE (ttok); - goto next_character; - } - -#ifdef COND_REGEXP - /* When parsing a regexp as a single word inside a conditional command, - we need to special-case characters special to both the shell and - regular expressions. Right now, that is only '(' and '|'. */ /*)*/ - if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/ - { - if (character == '|') - goto got_character; - - push_delimiter (dstack, character); - ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); - pop_delimiter (dstack); - if (ttok == &matched_pair_error) - return -1; /* Bail immediately. */ - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, - token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); - token[token_index++] = character; - strcpy (token + token_index, ttok); - token_index += ttoklen; - FREE (ttok); - dollar_present = all_digit_token = 0; - goto next_character; - } -#endif /* COND_REGEXP */ - -#ifdef EXTENDED_GLOB - /* Parse a ksh-style extended pattern matching specification. */ - if MBTEST(extended_glob && PATTERN_CHAR (character)) - { - peek_char = shell_getc (1); - if MBTEST(peek_char == '(') /* ) */ - { - push_delimiter (dstack, peek_char); - ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); - pop_delimiter (dstack); - if (ttok == &matched_pair_error) - return -1; /* Bail immediately. */ - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - token[token_index++] = character; - token[token_index++] = peek_char; - strcpy (token + token_index, ttok); - token_index += ttoklen; - FREE (ttok); - dollar_present = all_digit_token = 0; - goto next_character; - } - else - shell_ungetc (peek_char); - } -#endif /* EXTENDED_GLOB */ - - /* If the delimiter character is not single quote, parse some of - the shell expansions that must be read as a single word. */ - if (shellexp (character)) - { - peek_char = shell_getc (1); - /* $(...), <(...), >(...), $((...)), ${...}, and $[...] constructs */ - if MBTEST(peek_char == '(' || \ - ((peek_char == '{' || peek_char == '[') && character == '$')) /* ) ] } */ - { - if (peek_char == '{') /* } */ - ttok = parse_matched_pair (cd, '{', '}', &ttoklen, P_FIRSTCLOSE); - else if (peek_char == '(') /* ) */ - { - /* XXX - push and pop the `(' as a delimiter for use by - the command-oriented-history code. This way newlines - appearing in the $(...) string get added to the - history literally rather than causing a possibly- - incorrect `;' to be added. ) */ - push_delimiter (dstack, peek_char); - ttok = parse_comsub (cd, '(', ')', &ttoklen, P_COMMAND); - pop_delimiter (dstack); - } - else - ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0); - if (ttok == &matched_pair_error) - return -1; /* Bail immediately. */ - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - token[token_index++] = character; - token[token_index++] = peek_char; - strcpy (token + token_index, ttok); - token_index += ttoklen; - FREE (ttok); - dollar_present = 1; - all_digit_token = 0; - goto next_character; - } - /* This handles $'...' and $"..." new-style quoted strings. */ - else if MBTEST(character == '$' && (peek_char == '\'' || peek_char == '"')) - { - int first_line; - - first_line = line_number; - push_delimiter (dstack, peek_char); - ttok = parse_matched_pair (peek_char, peek_char, peek_char, - &ttoklen, - (peek_char == '\'') ? P_ALLOWESC : 0); - pop_delimiter (dstack); - if (ttok == &matched_pair_error) - return -1; - if (peek_char == '\'') - { - ttrans = ansiexpand (ttok, 0, ttoklen - 1, &ttranslen); - free (ttok); - - /* Insert the single quotes and correctly quote any - embedded single quotes (allowed because P_ALLOWESC was - passed to parse_matched_pair). */ - ttok = sh_single_quote (ttrans); - free (ttrans); - ttranslen = strlen (ttok); - ttrans = ttok; - } - else - { - /* Try to locale-expand the converted string. */ - ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen); - free (ttok); - - /* Add the double quotes back */ - ttok = sh_mkdoublequoted (ttrans, ttranslen, 0); - free (ttrans); - ttranslen += 2; - ttrans = ttok; - } - - RESIZE_MALLOCED_BUFFER (token, token_index, ttranslen + 2, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - strcpy (token + token_index, ttrans); - token_index += ttranslen; - FREE (ttrans); - quoted = 1; - all_digit_token = 0; - goto next_character; - } - /* This could eventually be extended to recognize all of the - shell's single-character parameter expansions, and set flags.*/ - else if MBTEST(character == '$' && peek_char == '$') - { - ttok = (char *)xmalloc (3); - ttok[0] = ttok[1] = '$'; - ttok[2] = '\0'; - RESIZE_MALLOCED_BUFFER (token, token_index, 3, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - strcpy (token + token_index, ttok); - token_index += 2; - dollar_present = 1; - all_digit_token = 0; - FREE (ttok); - goto next_character; - } - else - shell_ungetc (peek_char); - } - -#if defined (ARRAY_VARS) - /* Identify possible array subscript assignment; match [...]. If - parser_state&PST_COMPASSIGN, we need to parse [sub]=words treating - `sub' as if it were enclosed in double quotes. */ - else if MBTEST(character == '[' && /* ] */ - ((token_index > 0 && assignment_acceptable (last_read_token) && token_is_ident (token, token_index)) || - (token_index == 0 && (parser_state&PST_COMPASSIGN)))) - { - ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARRAYSUB); - if (ttok == &matched_pair_error) - return -1; /* Bail immediately. */ - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - token[token_index++] = character; - strcpy (token + token_index, ttok); - token_index += ttoklen; - FREE (ttok); - all_digit_token = 0; - goto next_character; - } - /* Identify possible compound array variable assignment. */ - else if MBTEST(character == '=' && token_index > 0 && (assignment_acceptable (last_read_token) || (parser_state & PST_ASSIGNOK)) && token_is_assignment (token, token_index)) - { - peek_char = shell_getc (1); - if MBTEST(peek_char == '(') /* ) */ - { - ttok = parse_compound_assignment (&ttoklen); - - RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 4, - token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - - token[token_index++] = '='; - token[token_index++] = '('; - if (ttok) - { - strcpy (token + token_index, ttok); - token_index += ttoklen; - } - token[token_index++] = ')'; - FREE (ttok); - all_digit_token = 0; - compound_assignment = 1; -#if 1 - goto next_character; -#else - goto got_token; /* ksh93 seems to do this */ -#endif - } - else - shell_ungetc (peek_char); - } -#endif - - /* When not parsing a multi-character word construct, shell meta- - characters break words. */ - if MBTEST(shellbreak (character)) - { - shell_ungetc (character); - goto got_token; - } - - got_character: - - if (character == CTLESC || character == CTLNUL) - token[token_index++] = CTLESC; - - got_escaped_character: - - all_digit_token &= DIGIT (character); - dollar_present |= character == '$'; - - token[token_index++] = character; - - RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size, - TOKEN_DEFAULT_GROW_SIZE); - - next_character: - if (character == '\n' && SHOULD_PROMPT ()) - prompt_again (); - - /* We want to remove quoted newlines (that is, a \ pair) - unless we are within single quotes or pass_next_character is - set (the shell equivalent of literal-next). */ - cd = current_delimiter (dstack); - character = shell_getc (cd != '\'' && pass_next_character == 0); - } /* end for (;;) */ - -got_token: - - token[token_index] = '\0'; - - /* Check to see what thing we should return. If the last_read_token - is a `<', or a `&', or the character which ended this token is - a '>' or '<', then, and ONLY then, is this input token a NUMBER. - Otherwise, it is just a word, and should be returned as such. */ - if MBTEST(all_digit_token && (character == '<' || character == '>' || \ - last_read_token == LESS_AND || \ - last_read_token == GREATER_AND)) - { - if (legal_number (token, &lvalue) && (int)lvalue == lvalue) - yylval.number = lvalue; - else - yylval.number = -1; - return (NUMBER); - } - - /* Check for special case tokens. */ - result = (last_shell_getc_is_singlebyte) ? special_case_tokens (token) : -1; - if (result >= 0) - return result; - -#if defined (ALIAS) - /* Posix.2 does not allow reserved words to be aliased, so check for all - of them, including special cases, before expanding the current token - as an alias. */ - if MBTEST(posixly_correct) - CHECK_FOR_RESERVED_WORD (token); - - /* Aliases are expanded iff EXPAND_ALIASES is non-zero, and quoting - inhibits alias expansion. */ - if (expand_aliases && quoted == 0) - { - result = alias_expand_token (token); - if (result == RE_READ_TOKEN) - return (RE_READ_TOKEN); - else if (result == NO_EXPANSION) - parser_state &= ~PST_ALEXPNEXT; - } - - /* If not in Posix.2 mode, check for reserved words after alias - expansion. */ - if MBTEST(posixly_correct == 0) -#endif - CHECK_FOR_RESERVED_WORD (token); - - the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC)); - the_word->word = (char *)xmalloc (1 + token_index); - the_word->flags = 0; - strcpy (the_word->word, token); - if (dollar_present) - the_word->flags |= W_HASDOLLAR; - if (quoted) - the_word->flags |= W_QUOTED; /*(*/ - if (compound_assignment && token[token_index-1] == ')') - the_word->flags |= W_COMPASSIGN; - /* A word is an assignment if it appears at the beginning of a - simple command, or after another assignment word. This is - context-dependent, so it cannot be handled in the grammar. */ - if (assignment (token, (parser_state & PST_COMPASSIGN) != 0)) - { - the_word->flags |= W_ASSIGNMENT; - /* Don't perform word splitting on assignment statements. */ - if (assignment_acceptable (last_read_token) || (parser_state & PST_COMPASSIGN) != 0) - the_word->flags |= W_NOSPLIT; - } - - if (command_token_position (last_read_token)) - { - struct builtin *b; - b = builtin_address_internal (token, 0); - if (b && (b->flags & ASSIGNMENT_BUILTIN)) - parser_state |= PST_ASSIGNOK; - else if (STREQ (token, "eval") || STREQ (token, "let")) - parser_state |= PST_ASSIGNOK; - } - - yylval.word = the_word; - - result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT)) - ? ASSIGNMENT_WORD : WORD; - - switch (last_read_token) - { - case FUNCTION: - parser_state |= PST_ALLOWOPNBRC; - function_dstart = line_number; - break; - case CASE: - case SELECT: - case FOR: - if (word_top < MAX_CASE_NEST) - word_top++; - word_lineno[word_top] = line_number; - break; - } - - return (result); -} - -/* Return 1 if TOKSYM is a token that after being read would allow - a reserved word to be seen, else 0. */ -static int -reserved_word_acceptable (toksym) - int toksym; -{ - switch (toksym) - { - case '\n': - case ';': - case '(': - case ')': - case '|': - case '&': - case '{': - case '}': /* XXX */ - case AND_AND: - case BANG: - case BAR_AND: - case DO: - case DONE: - case ELIF: - case ELSE: - case ESAC: - case FI: - case IF: - case OR_OR: - case SEMI_SEMI: - case SEMI_AND: - case SEMI_SEMI_AND: - case THEN: - case TIME: - case TIMEOPT: - case COPROC: - case UNTIL: - case WHILE: - case 0: - return 1; - default: -#if defined (COPROCESS_SUPPORT) - if (last_read_token == WORD && token_before_that == COPROC) - return 1; -#endif - return 0; - } -} - -/* Return the index of TOKEN in the alist of reserved words, or -1 if - TOKEN is not a shell reserved word. */ -int -find_reserved_word (tokstr) - char *tokstr; -{ - int i; - for (i = 0; word_token_alist[i].word; i++) - if (STREQ (tokstr, word_token_alist[i].word)) - return i; - return -1; -} - -#if 0 -#if defined (READLINE) -/* Called after each time readline is called. This insures that whatever - the new prompt string is gets propagated to readline's local prompt - variable. */ -static void -reset_readline_prompt () -{ - char *temp_prompt; - - if (prompt_string_pointer) - { - temp_prompt = (*prompt_string_pointer) - ? decode_prompt_string (*prompt_string_pointer) - : (char *)NULL; - - if (temp_prompt == 0) - { - temp_prompt = (char *)xmalloc (1); - temp_prompt[0] = '\0'; - } - - FREE (current_readline_prompt); - current_readline_prompt = temp_prompt; - } -} -#endif /* READLINE */ -#endif /* 0 */ - -#if defined (HISTORY) -/* A list of tokens which can be followed by newlines, but not by - semi-colons. When concatenating multiple lines of history, the - newline separator for such tokens is replaced with a space. */ -static const int no_semi_successors[] = { - '\n', '{', '(', ')', ';', '&', '|', - CASE, DO, ELSE, IF, SEMI_SEMI, SEMI_AND, SEMI_SEMI_AND, THEN, UNTIL, - WHILE, AND_AND, OR_OR, IN, - 0 -}; - -/* If we are not within a delimited expression, try to be smart - about which separators can be semi-colons and which must be - newlines. Returns the string that should be added into the - history entry. */ -char * -history_delimiting_chars () -{ - register int i; - - if (dstack.delimiter_depth != 0) - return ("\n"); - - /* We look for current_command_line_count == 2 because we are looking to - add the first line of the body of the here document (the second line - of the command). */ - if (parser_state & PST_HEREDOC) - return (current_command_line_count == 2 ? "\n" : ""); - - /* First, handle some special cases. */ - /*(*/ - /* If we just read `()', assume it's a function definition, and don't - add a semicolon. If the token before the `)' was not `(', and we're - not in the midst of parsing a case statement, assume it's a - parenthesized command and add the semicolon. */ - /*)(*/ - if (token_before_that == ')') - { - if (two_tokens_ago == '(') /*)*/ /* function def */ - return " "; - /* This does not work for subshells inside case statement - command lists. It's a suboptimal solution. */ - else if (parser_state & PST_CASESTMT) /* case statement pattern */ - return " "; - else - return "; "; /* (...) subshell */ - } - else if (token_before_that == WORD && two_tokens_ago == FUNCTION) - return " "; /* function def using `function name' without `()' */ - - else if (token_before_that == WORD && two_tokens_ago == FOR) - { - /* Tricky. `for i\nin ...' should not have a semicolon, but - `for i\ndo ...' should. We do what we can. */ - for (i = shell_input_line_index; whitespace (shell_input_line[i]); i++) - ; - if (shell_input_line[i] && shell_input_line[i] == 'i' && shell_input_line[i+1] == 'n') - return " "; - return ";"; - } - else if (two_tokens_ago == CASE && token_before_that == WORD && (parser_state & PST_CASESTMT)) - return " "; - - for (i = 0; no_semi_successors[i]; i++) - { - if (token_before_that == no_semi_successors[i]) - return (" "); - } - - return ("; "); -} -#endif /* HISTORY */ - -/* Issue a prompt, or prepare to issue a prompt when the next character - is read. */ -static void -prompt_again () -{ - char *temp_prompt; - - if (interactive == 0 || expanding_alias()) /* XXX */ - return; - - ps1_prompt = get_string_value ("PS1"); - ps2_prompt = get_string_value ("PS2"); - - if (!prompt_string_pointer) - prompt_string_pointer = &ps1_prompt; - - temp_prompt = *prompt_string_pointer - ? decode_prompt_string (*prompt_string_pointer) - : (char *)NULL; - - if (temp_prompt == 0) - { - temp_prompt = (char *)xmalloc (1); - temp_prompt[0] = '\0'; - } - - current_prompt_string = *prompt_string_pointer; - prompt_string_pointer = &ps2_prompt; - -#if defined (READLINE) - if (!no_line_editing) - { - FREE (current_readline_prompt); - current_readline_prompt = temp_prompt; - } - else -#endif /* READLINE */ - { - FREE (current_decoded_prompt); - current_decoded_prompt = temp_prompt; - } -} - -int -get_current_prompt_level () -{ - return ((current_prompt_string && current_prompt_string == ps2_prompt) ? 2 : 1); -} - -void -set_current_prompt_level (x) - int x; -{ - prompt_string_pointer = (x == 2) ? &ps2_prompt : &ps1_prompt; - current_prompt_string = *prompt_string_pointer; -} - -static void -print_prompt () -{ - fprintf (stderr, "%s", current_decoded_prompt); - fflush (stderr); -} - -/* Return a string which will be printed as a prompt. The string - may contain special characters which are decoded as follows: - - \a bell (ascii 07) - \d the date in Day Mon Date format - \e escape (ascii 033) - \h the hostname up to the first `.' - \H the hostname - \j the number of active jobs - \l the basename of the shell's tty device name - \n CRLF - \r CR - \s the name of the shell - \t the time in 24-hour hh:mm:ss format - \T the time in 12-hour hh:mm:ss format - \@ the time in 12-hour hh:mm am/pm format - \A the time in 24-hour hh:mm format - \D{fmt} the result of passing FMT to strftime(3) - \u your username - \v the version of bash (e.g., 2.00) - \V the release of bash, version + patchlevel (e.g., 2.00.0) - \w the current working directory - \W the last element of $PWD - \! the history number of this command - \# the command number of this command - \$ a $ or a # if you are root - \nnn character code nnn in octal - \\ a backslash - \[ begin a sequence of non-printing chars - \] end a sequence of non-printing chars -*/ -#define PROMPT_GROWTH 48 -char * -decode_prompt_string (string) - char *string; -{ - WORD_LIST *list; - char *result, *t; - struct dstack save_dstack; - int last_exit_value; -#if defined (PROMPT_STRING_DECODE) - int result_size, result_index; - int c, n, i; - char *temp, octal_string[4]; - struct tm *tm; - time_t the_time; - char timebuf[128]; - char *timefmt; - - result = (char *)xmalloc (result_size = PROMPT_GROWTH); - result[result_index = 0] = 0; - temp = (char *)NULL; - - while (c = *string++) - { - if (posixly_correct && c == '!') - { - if (*string == '!') - { - temp = savestring ("!"); - goto add_string; - } - else - { -#if !defined (HISTORY) - temp = savestring ("1"); -#else /* HISTORY */ - temp = itos (history_number ()); -#endif /* HISTORY */ - string--; /* add_string increments string again. */ - goto add_string; - } - } - if (c == '\\') - { - c = *string; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - strncpy (octal_string, string, 3); - octal_string[3] = '\0'; - - n = read_octal (octal_string); - temp = (char *)xmalloc (3); - - if (n == CTLESC || n == CTLNUL) - { - temp[0] = CTLESC; - temp[1] = n; - temp[2] = '\0'; - } - else if (n == -1) - { - temp[0] = '\\'; - temp[1] = '\0'; - } - else - { - temp[0] = n; - temp[1] = '\0'; - } - - for (c = 0; n != -1 && c < 3 && ISOCTAL (*string); c++) - string++; - - c = 0; /* tested at add_string: */ - goto add_string; - - case 'd': - case 't': - case 'T': - case '@': - case 'A': - /* Make the current time/date into a string. */ - (void) time (&the_time); - tm = localtime (&the_time); - - if (c == 'd') - n = strftime (timebuf, sizeof (timebuf), "%a %b %d", tm); - else if (c == 't') - n = strftime (timebuf, sizeof (timebuf), "%H:%M:%S", tm); - else if (c == 'T') - n = strftime (timebuf, sizeof (timebuf), "%I:%M:%S", tm); - else if (c == '@') - n = strftime (timebuf, sizeof (timebuf), "%I:%M %p", tm); - else if (c == 'A') - n = strftime (timebuf, sizeof (timebuf), "%H:%M", tm); - - if (n == 0) - timebuf[0] = '\0'; - else - timebuf[sizeof(timebuf) - 1] = '\0'; - - temp = savestring (timebuf); - goto add_string; - - case 'D': /* strftime format */ - if (string[1] != '{') /* } */ - goto not_escape; - - (void) time (&the_time); - tm = localtime (&the_time); - string += 2; /* skip { */ - timefmt = xmalloc (strlen (string) + 3); - for (t = timefmt; *string && *string != '}'; ) - *t++ = *string++; - *t = '\0'; - c = *string; /* tested at add_string */ - if (timefmt[0] == '\0') - { - timefmt[0] = '%'; - timefmt[1] = 'X'; /* locale-specific current time */ - timefmt[2] = '\0'; - } - n = strftime (timebuf, sizeof (timebuf), timefmt, tm); - free (timefmt); - - if (n == 0) - timebuf[0] = '\0'; - else - timebuf[sizeof(timebuf) - 1] = '\0'; - - if (promptvars || posixly_correct) - /* Make sure that expand_prompt_string is called with a - second argument of Q_DOUBLE_QUOTES if we use this - function here. */ - temp = sh_backslash_quote_for_double_quotes (timebuf); - else - temp = savestring (timebuf); - goto add_string; - - case 'n': - temp = (char *)xmalloc (3); - temp[0] = no_line_editing ? '\n' : '\r'; - temp[1] = no_line_editing ? '\0' : '\n'; - temp[2] = '\0'; - goto add_string; - - case 's': - temp = base_pathname (shell_name); - temp = savestring (temp); - goto add_string; - - case 'v': - case 'V': - temp = (char *)xmalloc (16); - if (c == 'v') - strcpy (temp, dist_version); - else - sprintf (temp, "%s.%d", dist_version, patch_level); - goto add_string; - - case 'w': - case 'W': - { - /* Use the value of PWD because it is much more efficient. */ - char t_string[PATH_MAX]; - int tlen; - - temp = get_string_value ("PWD"); - - if (temp == 0) - { - if (getcwd (t_string, sizeof(t_string)) == 0) - { - t_string[0] = '.'; - tlen = 1; - } - else - tlen = strlen (t_string); - } - else - { - tlen = sizeof (t_string) - 1; - strncpy (t_string, temp, tlen); - } - t_string[tlen] = '\0'; - -#define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0) -#define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0) - /* Abbreviate \W as ~ if $PWD == $HOME */ - if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0)) - { - if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0) - { - t = strrchr (t_string, '/'); - if (t) - strcpy (t_string, t + 1); - } - } -#undef ROOT_PATH -#undef DOUBLE_SLASH_ROOT - else - /* polite_directory_format is guaranteed to return a string - no longer than PATH_MAX - 1 characters. */ - strcpy (t_string, polite_directory_format (t_string)); - - temp = trim_pathname (t_string, PATH_MAX - 1); - /* If we're going to be expanding the prompt string later, - quote the directory name. */ - if (promptvars || posixly_correct) - /* Make sure that expand_prompt_string is called with a - second argument of Q_DOUBLE_QUOTES if we use this - function here. */ - temp = sh_backslash_quote_for_double_quotes (t_string); - else - temp = savestring (t_string); - - goto add_string; - } - - case 'u': - if (current_user.user_name == 0) - get_current_user_info (); - temp = savestring (current_user.user_name); - goto add_string; - - case 'h': - case 'H': - temp = savestring (current_host_name); - if (c == 'h' && (t = (char *)strchr (temp, '.'))) - *t = '\0'; - goto add_string; - - case '#': - temp = itos (current_command_number); - goto add_string; - - case '!': -#if !defined (HISTORY) - temp = savestring ("1"); -#else /* HISTORY */ - temp = itos (history_number ()); -#endif /* HISTORY */ - goto add_string; - - case '$': - t = temp = (char *)xmalloc (3); - if ((promptvars || posixly_correct) && (current_user.euid != 0)) - *t++ = '\\'; - *t++ = current_user.euid == 0 ? '#' : '$'; - *t = '\0'; - goto add_string; - - case 'j': - temp = itos (count_all_jobs ()); - goto add_string; - - case 'l': -#if defined (HAVE_TTYNAME) - temp = (char *)ttyname (fileno (stdin)); - t = temp ? base_pathname (temp) : "tty"; - temp = savestring (t); -#else - temp = savestring ("tty"); -#endif /* !HAVE_TTYNAME */ - goto add_string; - -#if defined (READLINE) - case '[': - case ']': - if (no_line_editing) - { - string++; - break; - } - temp = (char *)xmalloc (3); - n = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE; - i = 0; - if (n == CTLESC || n == CTLNUL) - temp[i++] = CTLESC; - temp[i++] = n; - temp[i] = '\0'; - goto add_string; -#endif /* READLINE */ - - case '\\': - case 'a': - case 'e': - case 'r': - temp = (char *)xmalloc (2); - if (c == 'a') - temp[0] = '\07'; - else if (c == 'e') - temp[0] = '\033'; - else if (c == 'r') - temp[0] = '\r'; - else /* (c == '\\') */ - temp[0] = c; - temp[1] = '\0'; - goto add_string; - - default: -not_escape: - temp = (char *)xmalloc (3); - temp[0] = '\\'; - temp[1] = c; - temp[2] = '\0'; - - add_string: - if (c) - string++; - result = - sub_append_string (temp, result, &result_index, &result_size); - temp = (char *)NULL; /* Freed in sub_append_string (). */ - result[result_index] = '\0'; - break; - } - } - else - { - RESIZE_MALLOCED_BUFFER (result, result_index, 3, result_size, PROMPT_GROWTH); - result[result_index++] = c; - result[result_index] = '\0'; - } - } -#else /* !PROMPT_STRING_DECODE */ - result = savestring (string); -#endif /* !PROMPT_STRING_DECODE */ - - /* Save the delimiter stack and point `dstack' to temp space so any - command substitutions in the prompt string won't result in screwing - up the parser's quoting state. */ - save_dstack = dstack; - dstack = temp_dstack; - dstack.delimiter_depth = 0; - - /* Perform variable and parameter expansion and command substitution on - the prompt string. */ - if (promptvars || posixly_correct) - { - last_exit_value = last_command_exit_value; - list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0); - free (result); - result = string_list (list); - dispose_words (list); - last_command_exit_value = last_exit_value; - } - else - { - t = dequote_string (result); - free (result); - result = t; - } - - dstack = save_dstack; - - return (result); -} - -/************************************************ - * * - * ERROR HANDLING * - * * - ************************************************/ - -/* Report a syntax error, and restart the parser. Call here for fatal - errors. */ -int -yyerror (msg) - const char *msg; -{ - report_syntax_error ((char *)NULL); - reset_parser (); - return (0); -} - -static char * -error_token_from_token (tok) - int tok; -{ - char *t; - - if (t = find_token_in_alist (tok, word_token_alist, 0)) - return t; - - if (t = find_token_in_alist (tok, other_token_alist, 0)) - return t; - - t = (char *)NULL; - /* This stuff is dicy and needs closer inspection */ - switch (current_token) - { - case WORD: - case ASSIGNMENT_WORD: - if (yylval.word) - t = savestring (yylval.word->word); - break; - case NUMBER: - t = itos (yylval.number); - break; - case ARITH_CMD: - if (yylval.word_list) - t = string_list (yylval.word_list); - break; - case ARITH_FOR_EXPRS: - if (yylval.word_list) - t = string_list_internal (yylval.word_list, " ; "); - break; - case COND_CMD: - t = (char *)NULL; /* punt */ - break; - } - - return t; -} - -static char * -error_token_from_text () -{ - char *msg, *t; - int token_end, i; - - t = shell_input_line; - i = shell_input_line_index; - token_end = 0; - msg = (char *)NULL; - - if (i && t[i] == '\0') - i--; - - while (i && (whitespace (t[i]) || t[i] == '\n')) - i--; - - if (i) - token_end = i + 1; - - while (i && (member (t[i], " \n\t;|&") == 0)) - i--; - - while (i != token_end && (whitespace (t[i]) || t[i] == '\n')) - i++; - - /* Return our idea of the offending token. */ - if (token_end || (i == 0 && token_end == 0)) - { - if (token_end) - msg = substring (t, i, token_end); - else /* one-character token */ - { - msg = (char *)xmalloc (2); - msg[0] = t[i]; - msg[1] = '\0'; - } - } - - return (msg); -} - -static void -print_offending_line () -{ - char *msg; - int token_end; - - msg = savestring (shell_input_line); - token_end = strlen (msg); - while (token_end && msg[token_end - 1] == '\n') - msg[--token_end] = '\0'; - - parser_error (line_number, "`%s'", msg); - free (msg); -} - -/* Report a syntax error with line numbers, etc. - Call here for recoverable errors. If you have a message to print, - then place it in MESSAGE, otherwise pass NULL and this will figure - out an appropriate message for you. */ -static void -report_syntax_error (message) - char *message; -{ - char *msg; - - if (message) - { - parser_error (line_number, "%s", message); - if (interactive && EOF_Reached) - EOF_Reached = 0; - last_command_exit_value = EX_BADUSAGE; - return; - } - - /* If the line of input we're reading is not null, try to find the - objectionable token. First, try to figure out what token the - parser's complaining about by looking at current_token. */ - if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token))) - { - parser_error (line_number, _("syntax error near unexpected token `%s'"), msg); - free (msg); - - if (interactive == 0) - print_offending_line (); - - last_command_exit_value = EX_BADUSAGE; - return; - } - - /* If looking at the current token doesn't prove fruitful, try to find the - offending token by analyzing the text of the input line near the current - input line index and report what we find. */ - if (shell_input_line && *shell_input_line) - { - msg = error_token_from_text (); - if (msg) - { - parser_error (line_number, _("syntax error near `%s'"), msg); - free (msg); - } - - /* If not interactive, print the line containing the error. */ - if (interactive == 0) - print_offending_line (); - } - else - { - msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error"); - parser_error (line_number, "%s", msg); - /* When the shell is interactive, this file uses EOF_Reached - only for error reporting. Other mechanisms are used to - decide whether or not to exit. */ - if (interactive && EOF_Reached) - EOF_Reached = 0; - } - - last_command_exit_value = EX_BADUSAGE; -} - -/* ??? Needed function. ??? We have to be able to discard the constructs - created during parsing. In the case of error, we want to return - allocated objects to the memory pool. In the case of no error, we want - to throw away the information about where the allocated objects live. - (dispose_command () will actually free the command.) */ -static void -discard_parser_constructs (error_p) - int error_p; -{ -} - -/************************************************ - * * - * EOF HANDLING * - * * - ************************************************/ - -/* Do that silly `type "bye" to exit' stuff. You know, "ignoreeof". */ - -/* A flag denoting whether or not ignoreeof is set. */ -int ignoreeof = 0; - -/* The number of times that we have encountered an EOF character without - another character intervening. When this gets above the limit, the - shell terminates. */ -int eof_encountered = 0; - -/* The limit for eof_encountered. */ -int eof_encountered_limit = 10; - -/* If we have EOF as the only input unit, this user wants to leave - the shell. If the shell is not interactive, then just leave. - Otherwise, if ignoreeof is set, and we haven't done this the - required number of times in a row, print a message. */ -static void -handle_eof_input_unit () -{ - if (interactive) - { - /* shell.c may use this to decide whether or not to write out the - history, among other things. We use it only for error reporting - in this file. */ - if (EOF_Reached) - EOF_Reached = 0; - - /* If the user wants to "ignore" eof, then let her do so, kind of. */ - if (ignoreeof) - { - if (eof_encountered < eof_encountered_limit) - { - fprintf (stderr, _("Use \"%s\" to leave the shell.\n"), - login_shell ? "logout" : "exit"); - eof_encountered++; - /* Reset the parsing state. */ - last_read_token = current_token = '\n'; - /* Reset the prompt string to be $PS1. */ - prompt_string_pointer = (char **)NULL; - prompt_again (); - return; - } - } - - /* In this case EOF should exit the shell. Do it now. */ - reset_parser (); - exit_builtin ((WORD_LIST *)NULL); - } - else - { - /* We don't write history files, etc., for non-interactive shells. */ - EOF_Reached = 1; - } -} - -/************************************************ - * * - * STRING PARSING FUNCTIONS * - * * - ************************************************/ - -/* It's very important that these two functions treat the characters - between ( and ) identically. */ - -static WORD_LIST parse_string_error; - -/* Take a string and run it through the shell parser, returning the - resultant word list. Used by compound array assignment. */ -WORD_LIST * -parse_string_to_word_list (s, flags, whom) - char *s; - int flags; - const char *whom; -{ - WORD_LIST *wl; - int tok, orig_current_token, orig_line_number, orig_input_terminator; - int orig_line_count; - int old_echo_input, old_expand_aliases; -#if defined (HISTORY) - int old_remember_on_history, old_history_expansion_inhibited; -#endif - -#if defined (HISTORY) - old_remember_on_history = remember_on_history; -# if defined (BANG_HISTORY) - old_history_expansion_inhibited = history_expansion_inhibited; -# endif - bash_history_disable (); -#endif - - orig_line_number = line_number; - orig_line_count = current_command_line_count; - orig_input_terminator = shell_input_line_terminator; - old_echo_input = echo_input_at_read; - old_expand_aliases = expand_aliases; - - push_stream (1); - last_read_token = WORD; /* WORD to allow reserved words here */ - current_command_line_count = 0; - echo_input_at_read = expand_aliases = 0; - - with_input_from_string (s, whom); - wl = (WORD_LIST *)NULL; - - if (flags & 1) - parser_state |= PST_COMPASSIGN|PST_REPARSE; - - while ((tok = read_token (READ)) != yacc_EOF) - { - if (tok == '\n' && *bash_input.location.string == '\0') - break; - if (tok == '\n') /* Allow newlines in compound assignments */ - continue; - if (tok != WORD && tok != ASSIGNMENT_WORD) - { - line_number = orig_line_number + line_number - 1; - orig_current_token = current_token; - current_token = tok; - yyerror (NULL); /* does the right thing */ - current_token = orig_current_token; - if (wl) - dispose_words (wl); - wl = &parse_string_error; - break; - } - wl = make_word_list (yylval.word, wl); - } - - last_read_token = '\n'; - pop_stream (); - -#if defined (HISTORY) - remember_on_history = old_remember_on_history; -# if defined (BANG_HISTORY) - history_expansion_inhibited = old_history_expansion_inhibited; -# endif /* BANG_HISTORY */ -#endif /* HISTORY */ - - echo_input_at_read = old_echo_input; - expand_aliases = old_expand_aliases; - - current_command_line_count = orig_line_count; - shell_input_line_terminator = orig_input_terminator; - - if (flags & 1) - parser_state &= ~(PST_COMPASSIGN|PST_REPARSE); - - if (wl == &parse_string_error) - { - last_command_exit_value = EXECUTION_FAILURE; - if (interactive_shell == 0 && posixly_correct) - jump_to_top_level (FORCE_EOF); - else - jump_to_top_level (DISCARD); - } - - return (REVERSE_LIST (wl, WORD_LIST *)); -} - -static char * -parse_compound_assignment (retlenp) - int *retlenp; -{ - WORD_LIST *wl, *rl; - int tok, orig_line_number, orig_token_size, orig_last_token, assignok; - char *saved_token, *ret; - - saved_token = token; - orig_token_size = token_buffer_size; - orig_line_number = line_number; - orig_last_token = last_read_token; - - last_read_token = WORD; /* WORD to allow reserved words here */ - - token = (char *)NULL; - token_buffer_size = 0; - - assignok = parser_state&PST_ASSIGNOK; /* XXX */ - - wl = (WORD_LIST *)NULL; /* ( */ - parser_state |= PST_COMPASSIGN; - - while ((tok = read_token (READ)) != ')') - { - if (tok == '\n') /* Allow newlines in compound assignments */ - { - if (SHOULD_PROMPT ()) - prompt_again (); - continue; - } - if (tok != WORD && tok != ASSIGNMENT_WORD) - { - current_token = tok; /* for error reporting */ - if (tok == yacc_EOF) /* ( */ - parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'")); - else - yyerror(NULL); /* does the right thing */ - if (wl) - dispose_words (wl); - wl = &parse_string_error; - break; - } - wl = make_word_list (yylval.word, wl); - } - - FREE (token); - token = saved_token; - token_buffer_size = orig_token_size; - - parser_state &= ~PST_COMPASSIGN; - - if (wl == &parse_string_error) - { - last_command_exit_value = EXECUTION_FAILURE; - last_read_token = '\n'; /* XXX */ - if (interactive_shell == 0 && posixly_correct) - jump_to_top_level (FORCE_EOF); - else - jump_to_top_level (DISCARD); - } - - last_read_token = orig_last_token; /* XXX - was WORD? */ - - if (wl) - { - rl = REVERSE_LIST (wl, WORD_LIST *); - ret = string_list (rl); - dispose_words (rl); - } - else - ret = (char *)NULL; - - if (retlenp) - *retlenp = (ret && *ret) ? strlen (ret) : 0; - - if (assignok) - parser_state |= PST_ASSIGNOK; - - return ret; -} - -/************************************************ - * * - * SAVING AND RESTORING PARTIAL PARSE STATE * - * * - ************************************************/ - -sh_parser_state_t * -save_parser_state (ps) - sh_parser_state_t *ps; -{ -#if defined (ARRAY_VARS) - SHELL_VAR *v; -#endif - - if (ps == 0) - ps = (sh_parser_state_t *)xmalloc (sizeof (sh_parser_state_t)); - if (ps == 0) - return ((sh_parser_state_t *)NULL); - - ps->parser_state = parser_state; - ps->token_state = save_token_state (); - - ps->input_line_terminator = shell_input_line_terminator; - ps->eof_encountered = eof_encountered; - - ps->current_command_line_count = current_command_line_count; - -#if defined (HISTORY) - ps->remember_on_history = remember_on_history; -# if defined (BANG_HISTORY) - ps->history_expansion_inhibited = history_expansion_inhibited; -# endif -#endif - - ps->last_command_exit_value = last_command_exit_value; -#if defined (ARRAY_VARS) - v = find_variable ("PIPESTATUS"); - if (v && array_p (v) && array_cell (v)) - ps->pipestatus = array_copy (array_cell (v)); - else - ps->pipestatus = (ARRAY *)NULL; -#endif - - ps->last_shell_builtin = last_shell_builtin; - ps->this_shell_builtin = this_shell_builtin; - - ps->expand_aliases = expand_aliases; - ps->echo_input_at_read = echo_input_at_read; - - return (ps); -} - -void -restore_parser_state (ps) - sh_parser_state_t *ps; -{ -#if defined (ARRAY_VARS) - SHELL_VAR *v; -#endif - - if (ps == 0) - return; - - parser_state = ps->parser_state; - if (ps->token_state) - { - restore_token_state (ps->token_state); - free (ps->token_state); - } - - shell_input_line_terminator = ps->input_line_terminator; - eof_encountered = ps->eof_encountered; - - current_command_line_count = ps->current_command_line_count; - -#if defined (HISTORY) - remember_on_history = ps->remember_on_history; -# if defined (BANG_HISTORY) - history_expansion_inhibited = ps->history_expansion_inhibited; -# endif -#endif - - last_command_exit_value = ps->last_command_exit_value; -#if defined (ARRAY_VARS) - v = find_variable ("PIPESTATUS"); - if (v && array_p (v) && array_cell (v)) - { - array_dispose (array_cell (v)); - var_setarray (v, ps->pipestatus); - } -#endif - - last_shell_builtin = ps->last_shell_builtin; - this_shell_builtin = ps->this_shell_builtin; - - expand_aliases = ps->expand_aliases; - echo_input_at_read = ps->echo_input_at_read; -} - -/************************************************ - * * - * MULTIBYTE CHARACTER HANDLING * - * * - ************************************************/ - -#if defined (HANDLE_MULTIBYTE) -static void -set_line_mbstate () -{ - int i, previ, len, c; - mbstate_t mbs, prevs; - size_t mbclen; - - if (shell_input_line == NULL) - return; - len = strlen (shell_input_line); /* XXX - shell_input_line_len ? */ - FREE (shell_input_line_property); - shell_input_line_property = (char *)xmalloc (len + 1); - - memset (&prevs, '\0', sizeof (mbstate_t)); - for (i = previ = 0; i < len; i++) - { - mbs = prevs; - - c = shell_input_line[i]; - if (c == EOF) - { - int j; - for (j = i; j < len; j++) - shell_input_line_property[j] = 1; - break; - } - - mbclen = mbrlen (shell_input_line + previ, i - previ + 1, &mbs); - if (mbclen == 1 || mbclen == (size_t)-1) - { - mbclen = 1; - previ = i + 1; - } - else if (mbclen == (size_t)-2) - mbclen = 0; - else if (mbclen > 1) - { - mbclen = 0; - previ = i + 1; - prevs = mbs; - } - else - { - /* XXX - what to do if mbrlen returns 0? (null wide character) */ - int j; - for (j = i; j < len; j++) - shell_input_line_property[j] = 1; - break; - } - - shell_input_line_property[i] = mbclen; - } -} -#endif /* HANDLE_MULTIBYTE */ diff --git a/tests/run-histexpand.debug b/tests/run-histexpand.debug deleted file mode 100644 index 16b325fae..000000000 --- a/tests/run-histexpand.debug +++ /dev/null @@ -1,4 +0,0 @@ -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