From: Chet Ramey
Date: Tue, 13 Dec 2011 03:36:21 +0000 (-0500)
Subject: bash-4.2 stray file cleanup
X-Git-Tag: bash-4.3-alpha~136
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d4634252f0a1c2f1fd8cb64da2bff49c42d83fb;p=thirdparty%2Fbash.git
bash-4.2 stray file cleanup
---
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:
-
-
-
-
-
-
-
-
-
-
-
-
-
-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
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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
-
-
-
-
-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.
-
-
-
-
-
-
- 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:
-
-
-
--
-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.
-
-
-
-
-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).
-
-
-
-
-Parses the tokens into simple and compound commands
-(see section 3.2 Shell Commands).
-
-
-
-
-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.
-
-
-
-
-Performs any necessary redirections (see section 3.6 Redirections) and removes
-the redirection operators and their operands from the argument list.
-
-
-
-
-Executes the command (see section 3.7 Executing Commands).
-
-
-
-
-Optionally waits for the command to complete and collects its exit
-status (see section 3.7.5 Exit Status).
-
-
-
-
-
-
-
-
-
- 3.1.2 Quoting
-
-
-
-
-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.
-
-
-
-
-
-
- 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).
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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).
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
-
-command2 is executed if, and only if, command1
-returns an exit status of zero.
-
-
-An OR list has the form
-
-
-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.
-
-
-
-
-
-
- 3.2.4 Compound 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
- |
-
-
((...))
-
-
-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
-
See section 4.2 Bash Builtin Commands, for a full description of the let builtin.
-
-
-
[[...]]
--
-
-
-
-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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-()
-
-
-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.
-
-
-
{}
--
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 3.4 Shell Parameters
-
-
-
-
-
-
-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
-
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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-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.
-
-
-
-
-
-
- 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}}
- |
-
-
-
-
-
- 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'
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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:
-
or
-
-
-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.
-
-
-
-
-
-
- 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:
-
-
-
-
-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.
-
-
-
-
-
-
- 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
-
or
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 3.5.8 Filename Expansion
-
-
-
-
-
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
directs both standard output (file descriptor 1) and standard error
-(file descriptor 2) to the file dirlist, while the command
-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.
-
-
-
-
-
- 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:
-
-
-
-
-
- 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:
-
-
-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.
-
-
-
-
-
- 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:
-
-
-
-
-
- 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:
-
and
-Of the two forms, the first is preferred.
-This is semantically equivalent to
-
-
-
-
-
- 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.
-
-
-
-
-
- 3.6.6 Here Strings
-
-A variant of here documents, the format is:
-
-
-The word is expanded and supplied to the command on its standard
-input.
-
-
-
-
-
- 3.6.7 Duplicating File Descriptors
-
-The redirection operator
-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
-
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.
-
-
-
-
-
- 3.6.8 Moving File Descriptors
-
-The redirection operator
-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
-
moves the file descriptor digit to file descriptor n,
-or the standard output (file descriptor 1) if n is not specified.
-
-
-
-
-
- 3.6.9 Opening File Descriptors for Reading and Writing
-
-The redirection operator
-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.
-
-
-
-
-
-
- 3.7 Executing Commands
-
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
--
-The words that the parser has marked as variable assignments (those
-preceding the command name) and redirections are saved for later
-processing.
-
-
-
-
-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.
-
-
-
-
-Redirections are performed as described above (see section 3.6 Redirections).
-
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
--
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-If the command was not begun asynchronously, the shell waits for
-the command to complete and collects its exit status.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
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.
-
-
-
-
-
-
- 4. Shell Builtin Commands
-
-
-
-
-
-
-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.
-
-
-
-
-
-
- 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)
--
-Do nothing beyond expanding arguments and performing redirections.
-The return status is zero.
-
-
-
. (a period)
--
-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
--
-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
--
-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
--
-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
--
-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 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
--
-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
--
-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 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
--
-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
--
-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
--
-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.
-
-
-
-
-
-
-
- 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
--
-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
--
-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
--
-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
--
-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
--
-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.
-
-
-
-
-
-
-
-
-
- 4.3 Modifying Shell Behavior
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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:
-
-
-
--
-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.
-
-
-
-
-If the command run by the
DEBUG trap returns a non-zero value, the
-next command is skipped and not executed.
-
-
-
-
-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.
-
-
-
-
-
BASH_ARGC and BASH_ARGV are updated as described in their
-descriptions (see section 5.2 Bash Variables).
-
-
-
-
-Function tracing is enabled: command substitution, shell functions, and
-subshells invoked with
( command ) inherit the
-DEBUG and RETURN traps.
-
-
-
-
-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.
-
-
-
-
-
-
-
-
-
- 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:
-
-
-
--
-Special builtins are found before shell functions during command lookup.
-
-
-
-
-If a special builtin returns an error status, a non-interactive shell exits.
-
-
-
-
-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
- |
-
-
-
-
-
- 5. Shell Variables
-
-
-
-
-
-
-This chapter describes the shell variables that Bash uses.
-Bash automatically assigns default values to a number of variables.
-
-
-
-
-
-
- 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 `> '.
-
-
-
-
-
-
-
-
-
- 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
-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.
-
-
-
-
-
-
-
-
-
- 6. Bash Features
-
-
-
-This section describes features unique to Bash.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 6.3 Interactive Shells
-
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
- |
-
-
-
-
-
- 6.3.3 Interactive Shell Behavior
-
-
-
-When the shell is running interactively, it changes its behavior in
-several ways.
-
-
-
--
-Startup files are read and executed as described in 6.2 Bash Startup Files.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-Bash executes the value of the
PROMPT_COMMAND variable as a command
-before printing the primary prompt, $PS1
-(see section 5.2 Bash Variables).
-
-
-
-
-Readline (see section 8. Command Line Editing) is used to read commands from
-the user's terminal.
-
-
-
-
-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).
-
-
-
-
-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.
-
-
-
-
-Alias expansion (see section 6.6 Aliases) is performed by default.
-
-
-
-
-In the absence of any traps, Bash ignores
SIGTERM
-(see section 3.7.6 Signals).
-
-
-
-
-In the absence of any traps,
SIGINT is caught and handled
-((see section 3.7.6 Signals).
-SIGINT will interrupt some shell builtins.
-
-
-
-
-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).
-
-
-
-
-The `-n' invocation option is ignored, and `set -n' has
-no effect (see section 4.3.1 The Set Builtin).
-
-
-
-
-Bash will check for mail periodically, depending on the values of the
-
MAIL, MAILPATH, and MAILCHECK shell variables
-(see section 5.2 Bash Variables).
-
-
-
-
-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).
-
-
-
-
-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).
-
-
-
-
-Redirection errors encountered by shell builtins will not cause the
-shell to exit.
-
-
-
-
-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).
-
-
-
-
-A failed
exec will not cause the shell to exit
-(see section 4.1 Bourne Shell Builtins).
-
-
-
-
-Parser syntax errors will not cause the shell to exit.
-
-
-
-
-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).
-
-
-
-
-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).
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
-
-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
-
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.
-
-
-
-
-
-
- 6.8 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.
-
-
-
-
-
-
- 6.8.1 Directory Stack Builtins
-
-
-
-
-
-dirs
--
-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
--
-
-
-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.
-
-
-
-
-
-
-
-
-
-
- 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).
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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:
-
-
-
--
-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'.
-
-
-
-
-The message printed by the job control code and builtins when a job
-exits with a non-zero status is `Done(status)'.
-
-
-
-
-The message printed by the job control code and builtins when a job
-is stopped is `Stopped(signame)', where signame is, for
-example,
SIGTSTP.
-
-
-
-
-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.
-
-
-
-
-Reserved words appearing in a context where reserved words are recognized
-do not undergo alias expansion.
-
-
-
-
-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.
-
-
-
-
-The POSIX startup files are executed (
$ENV) rather than
-the normal Bash files.
-
-
-
-
-Tilde expansion is only performed on assignments preceding a command
-name, rather than on all assignment statements on the line.
-
-
-
-
-The default history file is `~/.sh_history' (this is the
-default value of
$HISTFILE).
-
-
-
-
-The output of `kill -l' prints all the signal names on a single line,
-separated by spaces, without the `SIG' prefix.
-
-
-
-
-The
kill builtin does not accept signal names with a `SIG'
-prefix.
-
-
-
-
-Non-interactive shells exit if filename in
. filename
-is not found.
-
-
-
-
-Non-interactive shells exit if a syntax error in an arithmetic expansion
-results in an invalid expression.
-
-
-
-
-Redirection operators do not perform filename expansion on the word
-in the redirection unless the shell is interactive.
-
-
-
-
-Redirection operators do not perform word splitting on the word in the
-redirection.
-
-
-
-
-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.
-
-
-
-
-POSIX special builtins are found before shell functions
-during command lookup.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-Process substitution is not available.
-
-
-
-
-Assignment statements preceding POSIX special builtins
-persist in the shell environment after the builtin completes.
-
-
-
-
-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.
-
-
-
-
-The
export and readonly builtin commands display their
-output in the format required by POSIX.
-
-
-
-
-The
trap builtin displays signal names without the leading
-SIG.
-
-
-
-
-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.
-
-
-
-
-The
. and source builtins do not search the current directory
-for the filename argument if it is not found by searching PATH.
-
-
-
-
-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.
-
-
-
-
-Alias expansion is always enabled, even in non-interactive shells.
-
-
-
-
-When the
alias builtin displays alias definitions, it does not
-display them with a leading `alias ' unless the `-p' option
-is supplied.
-
-
-
-
-When the
set builtin is invoked without options, it does not display
-shell function names and definitions.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-When the
pwd builtin is supplied the `-P' option, it resets
-$PWD to a pathname containing no symlinks.
-
-
-
-
-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.
-
-
-
-
-When listing the history, the
fc builtin does not include an
-indication of whether or not a history entry has been modified.
-
-
-
-
-The default editor used by
fc is ed.
-
-
-
-
-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.
-
-
-
-
-The
vi editing mode will invoke the vi editor directly when
-the `v' command is run, instead of checking $FCEDIT and
-$EDITOR.
-
-
-
-
-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:
-
-
-
-
--
-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.
-
-
-
-
-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).
-
-
-
-
-
-
- 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
-
-
-
-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:
-
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.
-
-
-
-
-
-
- 7.2 Job Control Builtins
-
-
-
-
-
-bg
--
-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
--
-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 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-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.
-
-
-
-
-
-
- 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
-
-
-
-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.)
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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
-
-
-
-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:
-
-
-
-
-Here, for example, is how to
-change from the default Emacs-like key binding to use
-vi line editing commands:
-
-
-
-
-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:
-
-
-
-
-
-
-
-
-
- 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':
-
-
-
-
-
-
-
- 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
- |
-
-
-
-
-
- 8.4 Bindable Readline 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
- 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).
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-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.
-
-
-
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-These are installation instructions for Bash.
-
-
-The simplest way to compile Bash is:
-
-
-
--
-
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.
-
-
-
-
-Type `make' to compile Bash and build the
bashbug bug
-reporting script.
-
-
-
-
-Optionally, type `make tests' to run the Bash test suite.
-
-
-
-
-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'.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
- 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).
-
-
-
-
-
-
-
- C. Copying This Manual
-
-
-
-
-
-
-
-
-
-
- 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.
- |
-
-
--
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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:
-
-
-
--
-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.
-
-
-
-
-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.
-
-
-
-
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-
-
-
-Preserve all the copyright notices of the Document.
-
-
-
-
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-
-
-
-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.
-
-
-
-
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-
-
-
-Include an unaltered copy of this License.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-Delete any section Entitled "Endorsements". Such a section
-may not be included in the Modified Version.
-
-
-
-
-Do not retitle any existing section to be Entitled "Endorsements" or
-to conflict in title with any Invariant Section.
-
-
-
-
-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.
-
-
-
-
-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."
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-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.
-
-
-
-
-
-
- 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.
-
-
-
-
-
-
- D. Indexes
-
-
-
-
-
-
-
-
-
-
- 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
-
- |
|---|
-| Jump to: | .
-
-:
-
-[
-
-
-A
-
-B
-
-C
-
-D
-
-E
-
-F
-
-G
-
-H
-
-J
-
-K
-
-L
-
-P
-
-R
-
-S
-
-T
-
-U
-
-W
-
- |
|---|
-
-
-
-
-
- D.2 Index of Shell Reserved Words
-
-| Jump to: | !
-
-[
-
-]
-
-{
-
-}
-
-
-C
-
-D
-
-E
-
-F
-
-I
-
-S
-
-T
-
-U
-
-W
-
- |
|---|
-| Jump to: | !
-
-[
-
-]
-
-{
-
-}
-
-
-C
-
-D
-
-E
-
-F
-
-I
-
-S
-
-T
-
-U
-
-W
-
- |
|---|
-
-
-
-
-
- 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
-
- |
|---|
-| Jump to: | !
-
-#
-
-$
-
-*
-
--
-
-0
-
-?
-
-@
-
-_
-
-
-A
-
-B
-
-C
-
-D
-
-E
-
-F
-
-G
-
-H
-
-I
-
-K
-
-L
-
-M
-
-O
-
-P
-
-R
-
-S
-
-T
-
-U
-
-V
-
- |
|---|
-
-
-
-
-
- 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-<) | 8.4.2 Commands For Manipulating The History |
- | beginning-of-history (M-<) | 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->) | 8.4.2 Commands For Manipulating The History |
- | end-of-history (M->) | 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-&) | 8.4.8 Some Miscellaneous Commands |
- | tilde-expand (M-&) | 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
-
- |
|---|
-
-
-
-
-
- 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 expansion | 6.6 Aliases |
- | arithmetic evaluation | 6.5 Shell Arithmetic |
- | arithmetic expansion | 3.5.5 Arithmetic Expansion |
- | arithmetic, shell | 6.5 Shell Arithmetic |
- | arrays | 6.7 Arrays |
-
|
-| B | | |
- | background | 7.1 Job Control Basics |
- | Bash configuration | 10.1 Basic Installation |
- | Bash installation | 10.1 Basic Installation |
- | Bourne shell | 3. Basic Shell Features |
- | brace expansion | 3.5.1 Brace Expansion |
- | builtin | 2. Definitions |
-
|
-| C | | |
- | command editing | 8.2.1 Readline Bare Essentials |
- | command execution | 3.7.2 Command Search and Execution |
- | command expansion | 3.7.1 Simple Command Expansion |
- | command history | 9.1 Bash History Facilities |
- | command search | 3.7.2 Command Search and Execution |
- | command substitution | 3.5.4 Command Substitution |
- | command timing | 3.2.2 Pipelines |
- | commands, compound | 3.2.4 Compound Commands |
- | commands, conditional | 3.2.4.2 Conditional Constructs |
- | commands, grouping | 3.2.4.3 Grouping Commands |
- | commands, lists | 3.2.3 Lists of Commands |
- | commands, looping | 3.2.4.1 Looping Constructs |
- | commands, pipelines | 3.2.2 Pipelines |
- | commands, shell | 3.2 Shell Commands |
- | commands, simple | 3.2.1 Simple Commands |
- | comments, shell | 3.1.3 Comments |
- | completion builtins | 8.7 Programmable Completion Builtins |
- | configuration | 10.1 Basic Installation |
- | control operator | 2. Definitions |
-
|
-| D | | |
- | directory stack | 6.8 The Directory Stack |
-
|
-| E | | |
- | editing command lines | 8.2.1 Readline Bare Essentials |
- | environment | 3.7.4 Environment |
- | evaluation, arithmetic | 6.5 Shell Arithmetic |
- | event designators | 9.3.1 Event Designators |
- | execution environment | 3.7.3 Command Execution Environment |
- | exit status | 2. Definitions |
- | exit status | 3.7.5 Exit Status |
- | expansion | 3.5 Shell Expansions |
- | expansion, arithmetic | 3.5.5 Arithmetic Expansion |
- | expansion, brace | 3.5.1 Brace Expansion |
- | expansion, filename | 3.5.8 Filename Expansion |
- | expansion, parameter | 3.5.3 Shell Parameter Expansion |
- | expansion, pathname | 3.5.8 Filename Expansion |
- | expansion, tilde | 3.5.2 Tilde Expansion |
- | expressions, arithmetic | 6.5 Shell Arithmetic |
- | expressions, conditional | 6.4 Bash Conditional Expressions |
-
|
-| F | | |
- | FDL, GNU Free Documentation License | C.1 GNU Free Documentation License |
- | field | 2. Definitions |
- | filename | 2. Definitions |
- | filename expansion | 3.5.8 Filename Expansion |
- | foreground | 7.1 Job Control Basics |
- | functions, shell | 3.3 Shell Functions |
-
|
-| H | | |
- | history builtins | 9.2 Bash History Builtins |
- | history events | 9.3.1 Event Designators |
- | history expansion | 9.3 History Expansion |
- | history list | 9.1 Bash History Facilities |
- | History, how to use | 8.7 Programmable Completion Builtins |
-
|
-| I | | |
- | identifier | 2. Definitions |
- | initialization file, readline | 8.3 Readline Init File |
- | installation | 10.1 Basic Installation |
- | interaction, readline | 8.2 Readline Interaction |
- | interactive shell | 6.1 Invoking Bash |
- | interactive shell | 6.3 Interactive Shells |
- | internationalization | 3.1.2.5 Locale-Specific Translation |
-
|
-| J | | |
- | job | 2. Definitions |
- | job control | 2. Definitions |
- | job control | 7.1 Job Control Basics |
-
|
-| K | | |
- | kill ring | 8.2.3 Readline Killing Commands |
- | killing text | 8.2.3 Readline Killing Commands |
-
|
-| L | | |
- | localization | 3.1.2.5 Locale-Specific Translation |
- | login shell | 6.1 Invoking Bash |
-
|
-| M | | |
- | matching, pattern | 3.5.8.1 Pattern Matching |
- | metacharacter | 2. Definitions |
-
|
-| N | | |
- | name | 2. Definitions |
- | native languages | 3.1.2.5 Locale-Specific Translation |
- | notation, readline | 8.2.1 Readline Bare Essentials |
-
|
-| O | | |
- | operator, shell | 2. Definitions |
-
|
-| P | | |
- | parameter expansion | 3.5.3 Shell Parameter Expansion |
- | parameters | 3.4 Shell Parameters |
- | parameters, positional | 3.4.1 Positional Parameters |
- | parameters, special | 3.4.2 Special Parameters |
- | pathname expansion | 3.5.8 Filename Expansion |
- | pattern matching | 3.5.8.1 Pattern Matching |
- | pipeline | 3.2.2 Pipelines |
- | POSIX | 2. Definitions |
- | POSIX Mode | 6.11 Bash POSIX Mode |
- | process group | 2. Definitions |
- | process group ID | 2. Definitions |
- | process substitution | 3.5.6 Process Substitution |
- | programmable completion | 8.6 Programmable Completion |
- | prompting | 6.9 Controlling the Prompt |
-
|
-| Q | | |
- | quoting | 3.1.2 Quoting |
- | quoting, ANSI | 3.1.2.4 ANSI-C Quoting |
-
|
-| R | | |
- | Readline, how to use | 7.3 Job Control Variables |
- | redirection | 3.6 Redirections |
- | reserved word | 2. Definitions |
- | restricted shell | 6.10 The Restricted Shell |
- | return status | 2. Definitions |
-
|
-| S | | |
- | shell arithmetic | 6.5 Shell Arithmetic |
- | shell function | 3.3 Shell Functions |
- | shell script | 3.8 Shell Scripts |
- | shell variable | 3.4 Shell Parameters |
- | shell, interactive | 6.3 Interactive Shells |
- | signal | 2. Definitions |
- | signal handling | 3.7.6 Signals |
- | special builtin | 2. Definitions |
- | special builtin | 4.4 Special Builtins |
- | startup files | 6.2 Bash Startup Files |
- | suspending jobs | 7.1 Job Control Basics |
-
|
-| T | | |
- | tilde expansion | 3.5.2 Tilde Expansion |
- | token | 2. Definitions |
- | translation, native languages | 3.1.2.5 Locale-Specific Translation |
-
|
-| V | | |
- | variable, shell | 3.4 Shell Parameters |
- | variables, readline | 8.3.1 Readline Init File Syntax |
-
|
-| W | | |
- | word | 2. Definitions |
- | word splitting | 3.5.7 Word Splitting |
-
|
-| Y | | |
- | yanking text | 8.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
-
- |
|---|
-
-
-
-
-Table of Contents
-
-
-
-
-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
-
-
-
-
-
-
-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