|
Softpanorama |
May the source be with you, but remember the KISS principle ;-)
|
| News | Bash | Recommended books | Recommended links | Bash 3.2 | Bash 3.1 | Bash3.0 | ||
| Bash 2.05a | Bash 2.05b | Bash 2.05 | Bash 2.04 | Bash 2.03 | Bash 2.02 | Bash 2.01 |
Differences from Born shell |
Etc |
FSF/Gnu project does extremely dismal job in maintaining and enhancing of key GNU stack applications. Bash is a classic example of semi-abandoned application that does not get the appropriate amount of funding from FSF.
RMS should be held responsible for this "dereliction of duty" and prohibited from traveling abroad for at least a year ;-).
As support from FSF is almost non-existent development is rather slow. Still for the last ten years substantial progress was made and bash 3.2 looks like a pretty promising enterprise-class shell both for interactive work and for simple scripting. Still problems remain. One of the most acute is treatment of the last stage of the pipe as a different process (the major incompatibility with ksh and ksh93).
Some interesting features of bash include:
<(list), >(list) or =(list)
is subject to process substitution. In the case of the < and
> forms, the shell will run process list asynchronously, connected
to a named pipe (FIFO). The name of this pipe will become the argument to the command.
|
Please visit Heiner Steven SHELLdorado the best shell scripting site on the Internet |
> is selected then writing to this file will provide
input for list. This also allows you to use the output of
several commands simultaneously as input for another program. For instance you
can compare the contents of two directories by typing:diff <( ls dir1 ) <( ls dir2 )
That can be used for concatenating input in pipes:
cat <(echo hello) <(echo world) | echo
If < is used, then the file passed as an argument will be a named
pipe connected to the output of the list process.
Another, more complex, example,
paste <(cut -f1 file1) < (cut -f3 file2) | tee >(process1) >(process2) >/dev/null
cuts fields 1 and 3 from the files file1 and file2 respectively, pastes the results together, and sends it to the processes process1 and process2. Note that the file, which is passed as an argument to the command, is a system pipe so programs that expect to lseek(2) on the file will not work. Also note that the previous example can be more compactly and efficiently written as:
paste <(cut -f1 file1) <(cut -f3 file2) >>(process1)
>>(process2)
The shell uses pipes instead of FIFOs to implement the latter two process substitutions
in the above example.
- new `time' reserved word to time pipelines, shell built-ins, and shell functions
- one-dimensional arrays with a new compound assignment statement,
- appropriate expansion constructs and modifications to some of the built-ins (read, declare, etc.)
- new quoting syntaxes for ANSI-C string expansion and locale-specific string translation
- new expansions to do substring extraction, pattern replacement, and indirect variable expansion
- new built-ins: `disown' and `shopt'
- new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK, GLOBIGNORE, MACHTYPE, BASH_VERSINFO
- new prompt expansions: \a, \e, \n, \H, \T, \@, \v, \V
- history and aliases can be used in shell scripts, not only in interective sessions.
- new readline variables: enable-keypad, mark-directories, input-meta, visible-stats, disable-completion, comment-begin
- new readline commands to manipulate the mark and operate on the region
- new DEBUG trap
- expanded (and now documented) restricted shell mode
Due to this bash shell is gradually gaining grounds as the preferred interactive shell for Solaris and other enterprize class Unixes.
Older version of bash (2.x series) are obsolete and should not be used. The recommended version is 3.2 patch level 3 or above. The latter is a recommended version as it's more compatible with ksh93. It supports many important enhancements introduced by ksh93.
a. Changed the parameter pattern replacement functions to not anchor the pattern at the beginning of the string if doing global replacement - that combination doesn't make any sense.
b. When running in `word expansion only' mode (--wordexp option), inhibit process substitution.
c. Loadable builtins now work on MacOS X 10.[34].
d. Shells running in posix mode no longer set $HOME, as POSIX requires.
e. The code that checks for binary files being executed as shell scripts now checks only for NUL rather than any non-printing character.
f. Quoting the string argument to the [[ command's =~ operator now forces string matching, as with the other pattern-matching operators.
2. New Features in Readline
a. Calling applications can now set the keyboard timeout to 0, allowing poll-like behavior.
b. The value of SYS_INPUTRC (configurable at compilation time) is now used as the default last-ditch startup file.
c. The history file reading functions now allow windows-like \r\n line terminators.
a. Bash now understands LC_TIME as a special variable so that time display
tracks the current locale.b. BASH_ARGC, BASH_ARGV, BASH_SOURCE, and BASH_LINENO are no longer created as `invisible' variables and may not be unset.
c. In POSIX mode, if `xpg_echo' option is enabled, the `echo' builtin doesn't try to interpret any options at all, as POSIX requires.
d. The `bg' builtin now accepts multiple arguments, as POSIX seems to specify.
e. Fixed vi-mode word completion and glob expansion to perform tilde expansion.
f. The `**' mathematic exponentiation operator is now right-associative.
g. The `ulimit' builtin has new options: -i (max number of pending signals), -q (max size of POSIX message queues), and -x (max number of file locks).
h. A bare `%' once again expands to the current job when used as a job specifier.
i. The `+=' assignment operator (append to the value of a string or array) is now supported for assignment statements and arguments to built-in commands that accept assignment statements.
j. BASH_COMMAND now preserves its value when a DEBUG trap is executed.
k. The `gnu_errfmt' option is enabled automatically if the shell is running in an emacs terminal window.
l. New configuration option: --single-help-strings. Causes long help text to be written as a single string; intended to ease translation.
m. The COMP_WORDBREAKS variable now causes the list of word break characters to be emptied when the variable is unset.
n. An unquoted expansion of $* when $IFS is empty now causes the positional parameters to be concatenated if the expansion doesn't undergo word splitting.
o. Bash now inherits $_ from the environment if it appears there at startup.
p. New shell option: nocasematch. If non-zero, shell pattern matching ignores case when used by `case' and `[[' commands.
q. The printf builtin takes a new option: -v var. That causes the output to be placed into var instead of on stdout.
r. By default, the shell no longer reports processes dying from SIGPIPE.
s. Bash now sets the extern variable `environ' to the export environment it creates, so C library functions that call getenv() (and can't use the shell-provided replacement) get current values of environment variables.
t. A new configuration option, `--enable-strict-posix-default', which will build bash to be POSIX conforming by default.
u. If compiled for strict POSIX conformance, LINES and COLUMNS may now override the true terminal size.
2. New Features in Readline
a. The key sequence sent by the keypad `delete' key is now automatically bound to delete-char.
b. A negative argument to menu-complete now cycles backward through the completion list.
c. A new bindable readline variable: bind-tty-special-chars. If non-zero, readline will bind the terminal special characters to their readline equivalents when it's called (on by default).
d. New bindable command: vi-rubout. Saves deleted text for possible reinsertion, as with any vi-mode `text modification' command; `X' is bound to this in vi command mode.
e. A new external application-controllable variable that allows the LINES and COLUMNS environment variables to set the window size regardless of what the kernel returns: rl_prefer_env_winsize
cc. The [[ ... ]] command has a new binary `=~' operator that performs extended regular expression (egrep-like) matching.
l. New invocation option: --debugger. Enables debugging and turns on new `extdebug' shell option.
f. HISTCONTROL may now include the `erasedups' option, which causes all lines matching a line being added to be removed from the history list.
j. for, case, select, arithmetic commands now keep line number information for the debugger.
p. `declare -F' now prints out extra line number and source file information if the `extdebug' option is set.
r. New `caller' builtin to provide a call stack for the bash 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.
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.
ee. Subexpressions matched by the =~ operator are placed in the new BASH_REMATCH array variable.
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.
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.
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.
g. History list entries now contain timestamp information; the history file functions know how to read and write timestamp information associated with each entry.
n. When listing completions, directories have a `/' appended if the `mark-directories' option has been enabled.
d. `select' was changed to be more ksh-compatible, in that the menu is reprinted each time through the loop only if REPLY is set to NULL. The previous behavior is available as a compile-time option.
e. `complete -d' and `complete -o dirnames' now force a slash to be appended to names which are symlinks to directories.
g. Added support for ksh93-like [:word:] character class in pattern matching.
h. The $'...' quoting construct now expands \cX to Control-X.
i. A new \D{...} prompt expansion; passes the `...' to strftime and inserts the result into the expanded prompt.
j. The shell now performs arithmetic in the largest integer size the machine supports (intmax_t), instead of long.
k. If a numeric argument is supplied to one of the bash globbing completion functions, a `*' is appended to the word before expansion is attempted.
l. The bash globbing completion functions now allow completions to be listed with double tabs or if `show-all-if-ambiguous' is set.
m. New `-o nospace' option for `complete' and `compgen' builtins; suppresses readline's appending a space to the completed word.
n. New `here-string' redirection operator: <<< word.
o. When displaying variables, function attributes and definitions are shown separately, allowing them to be re-used as input (attempting to re-use the old output would result in syntax errors).
r. `read' has a new `-u fd' option to read from a specified file descriptor.
u. The `printf' %q format specifier now uses $'...' quoting to print the argument if it contains non-printing characters.
v. The `declare' and `typeset' builtins have a new `-t' option. When applied to functions, it causes the DEBUG trap to be inherited by the named function. Currently has no effect on variables.
w. The DEBUG trap is now run *before* simple commands, ((...)) commands, [[...]] conditional commands, and for ((...)) loops.
z. New [n]<&word- and [n]>&word- redirections from ksh93 -- move fds (dup
and close).bb. The `hash' builtin has a new `-l' option to list contents in a reusable format, and a `-d' option to remove a name from the hash table.
dd. All builtins that take operands accept a `--' pseudo-option, except `echo'.
2. New Features in Readline
a. Support for key `subsequences': allows, e.g., ESC and ESC-a to both be bound to readline functions. Now the arrow keys may be used in vi insert mode.
h. Readline now has an overwrite mode, toggled by the `overwrite-mode' bindable command, which could be bound to `Insert'.
i. New application-settable completion variable: rl_completion_suppress_append, inhibits appending of rl_completion_append_character to completed words.
j. New key bindings when reading an incremental search string: ^W yanks the currently-matched word out of the current line into the search string; ^Y yanks the rest of the current line into the search string, DEL or ^H deletes characters from the search string.
Bash 2.05a
This is a terse description of the new features added to bash-2.05a since the release of bash-2.05. As always, the manual page (doc/bash.1) is the place to look for complete descriptions.g. New `\A' prompt string escape sequence; expands to time in 24 HH:MM format.
h. New `-A group/-g' option to complete and compgen; does group name completion.
i. New `-t' option to `hash' to list hash values for each filename argument.
j. New [-+]O invocation option to set and unset `shopt' options at startup.
l. The ksh-like `ERR' trap has been added. The `ERR' trap will be run whenever the shell would have exited if the -e option were enabled. It is not inherited by shell functions.
m. `readonly', `export', and `declare' now print variables which have been given attributes but not set by assigning a value as just a command and a variable name (like `export foo') when listing, as the latest POSIX drafts require.
p. `for' loops now allow empty word lists after `in', like the latest POSIX drafts require.
q. The builtin `ulimit' now takes two new non-numeric arguments: `hard', meaning the current hard limit, and `soft', meaning the current soft limit, in addition to `unlimited'
r. `ulimit' now prints the option letter associated with a particular resource when printing more than one limit.s. `ulimit' prints `hard' or `soft' when a value is not `unlimited' but is one of RLIM_SAVED_MAX or RLIM_SAVED_CUR, respectively.
t. The `printf' builtin now handles the %a and %A conversions if they're implemented by printf(3).
u. The `printf' builtin now handles the %F conversion (just about like %f).
v. The `printf' builtin now handles the %n conversion like printf(3). The corresponding argument is the name of a shell variable to which the value is assigned.
2. New Features in Readline
a. Added extern declaration for rl_get_termcap to readline.h, making it a public function (it was always there, just not in readline.h).
b. New #defines in readline.h: RL_READLINE_VERSION, currently 0x0402,
RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2.c. New readline variable: rl_readline_version, mirrors RL_READLINE_VERSION.
d. New bindable boolean readline variable: match-hidden-files. Controls completion of files beginning with a `.' (on Unix). Enabled by default.
e. The history expansion code now allows any character to terminate a `:first-' modifier, like csh.
f. New bindable variable `history-preserve-point'. If set, the history code attempts to place the user at the same location on each history line retrived with previous-history or next-history.
a. Added a new `--init-file' invocation argument as a synonym for `--rcfile',
per the new GNU coding standards.
b. The /dev/tcp and /dev/udp redirections now accept service names as well
as
port numbers.
c. `complete' and `compgen' now take a `-o value' option, which controls
some
of the aspects of that compspec. Valid values are:
default - perform bash default
completion if programmable
completion produces no matches
dirnames - perform directory name
completion if programmable
completion produces no matches
filenames - tell readline that the
compspec produces filenames,
so it can do things like append slashes to
directory names and suppress trailing spaces
d. A new loadable builtin, realpath, which canonicalizes and expands
symlinks
in pathname arguments.
e. When `set' is called without options, it prints function defintions in
a
way that allows them to be reused as input. This
affects `declare' and
`declare -p' as well. This only happens when the shell
is not in POSIX
mode, since POSIX.2 forbids this behavior.
f. Bash-2.05 once again honors the current locale setting when processing
ranges within pattern matching bracket expressions (e.g.,
[A-Z]).
2. New Features in Readline
a. The blink timeout for paren matching is now settable by applications,
via the rl_set_paren_blink_timeout() function.
b. _rl_executing_macro has been renamed to rl_executing_macro, which means
it's now part of the public interface.
c. Readline has a new variable, rl_readline_state, which is a bitmap that
encapsulates the current state of the library; intended for
use by
callbacks and hook functions.
d. New application-callable function rl_set_prompt(const char *prompt):
expands its prompt string argument and sets rl_prompt to the
result.
e. New application-callable function rl_set_screen_size(int rows, int
cols):
public method for applications to set readline's idea of the
screen
dimensions.
f. New function, rl_get_screen_size (int *rows, int *columns), returns
readline's idea of the screen dimensions.
g. The timeout in rl_gather_tyi (readline keyboard input polling function)
is now settable via a function (rl_set_keyboard_input_timeout()).
h. Renamed the max_input_history variable to history_max_entries; the old
variable is maintained for backwards compatibility.
i. The list of characters that separate words for the history tokenizer is
now settable with a variable: history_word_delimiters.
The default
value is as before.
a. The history builtin has a `-d offset' option to delete the history
entry
at position `offset'.
b. The prompt expansion code has two new escape sequences: \j, the number
of
active jobs; and \l, the basename of the shell's tty device
name.
c. The `bind' builtin has a new `-x' option to bind key sequences to shell
commands.
d. There is a new shell option, no_empty_command_completion, which, when
enabled, disables command completion when TAB is typed on an
empty line.
e. The `help' builtin has a `-s' option to just print a builtin's usage
synopsis.
f. There are several new arithmetic operators: id++, id-- (variable
post-increment/decrement), ++id, --id (variable
pre-increment/decrement),
expr1 , expr2 (comma operator).
g. There is a new ksh-93 style arithmetic for command:
for ((expr1 ; expr2; expr3 )); do
list; done
h. The `read' builtin has a number of new options:
-t timeout
only wait timeout seconds for input
-n nchars
only read nchars from input instead of a full line
-d delim
read until delim rather than newline
-s
don't echo input chars as they are read
i. The redirection code now handles several filenames specially:
/dev/fd/N, /dev/stdin, /dev/stdout, and /dev/stderr, whether
or
not they are present in the file system.
j. The redirection code now recognizes pathnames of the form
/dev/tcp/host/port and /dev/udp/host/port, and tries to open
a socket
of the appropriate type to the specified port on the
specified host.
k. The ksh-93 ${!prefix*} expansion, which expands to the names of all
shell variables with prefix PREFIX, has been implemented.
l. There is a new dynamic variable, FUNCNAME, which expands to the name of
a currently-executing function. Assignments to FUNCNAME
have no effect.
m. The GROUPS variable is no longer readonly; assignments to it are
silently
discarded. This means it can be unset.
n. A new programmable completion facility, with two new builtin commands:
complete and compgen.
o. configure has a new option, `--enable-progcomp', to compile in the
programmable completion features (enabled by default).
p. `shopt' has a new option, `progcomp', to enable and disable
programmable
completion at runtime.
q. Unsetting HOSTFILE now clears the list of hostnames used for completion.
r. configure has a new option, `--enable-bash-malloc', replacing the old
`--with-gnu-malloc' (which is still present for backwards
compatibility).
s. There is a new manual page describing rbash, the restricted shell.
t. `bashbug' has new `--help' and `--version' options.
u. `shopt' has a new `xpg_echo' option, which controls the behavior of
`echo' with respect to backslash-escaped characters at
runtime.
v. If NON_INTERACTIVE_LOGIN_SHELLS is defined, all login shells read the
startup files, even if they are not interactive.
w. The LC_NUMERIC variable is now treated specially, and used to set the
LC_NUMERIC locale category for number formatting, e.g., when
`printf'
displays floating-point numbers.
2. New features in Readline
a. Parentheses matching is now always compiled into readline, and enabled
or disabled when the value of the `blink-matching-paren'
variable is
changed.
b. MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename.
c. MS-DOS systems now use ~/_history as the default history file.
d. history-search-{forward,backward} now leave the point at the end of the
line when the string to search for is empty, like
{reverse,forward}-search-history.
e. history-search-{forward,backward} now leave the last history line found
in the readline buffer if the second or subsequent search
fails.
f. New function for use by applications: rl_on_new_line_with_prompt,
used
when an application displays the prompt itself before calling
readline().
g. New variable for use by applications: rl_already_prompted.
An application
that displays the prompt itself before calling readline()
must set this to
a non-zero value.
h. A new variable, rl_gnu_readline_p, always 1. The intent is that
an
application can verify whether or not it is linked with the
`real'
readline library or some substitute.
a. New `shopt' option, `restricted_shell', indicating whether or not the
shell was started in restricted mode, for use in startup
files.
b. Filename generation is now performed on the words between ( and ) in
array assignments (which it probably should have done all
along).
c. OLDPWD is now auto-exported, as POSIX.2 seems to require.
d. ENV and BASH_ENV are read-only variables in a restricted shell.
e. A change was made to the startup file code so that any shell begun with
the `--login' option, even non-interactive shells, will
source the login
shell startup files.
2. New Features in Readline
a. Many changes to the signal handling:
o Readline now catches SIGQUIT and
cleans up the tty before returning;
o A new variable, rl_catch_signals,
is available to application writers
to indicate to readline
whether or not it should install its own
signal handlers for
SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
SIGTTIN, and SIGTTOU;
o A new variable, rl_catch_sigwinch,
is available to application
writers to indicate to
readline whether or not it should install its
own signal handler for
SIGWINCH, which will chain to the calling
applications's SIGWINCH
handler, if one is installed;
o There is a new function,
rl_free_line_state, for application signal
handlers to call to free
up the state associated with the current
line after receiving a
signal;
o There is a new function,
rl_cleanup_after_signal, to clean up the
display and terminal
state after receiving a signal;
o There is a new function,
rl_reset_after_signal, to reinitialize the
terminal and display
state after an application signal handler
returns and readline
continues
b. There is a new function, rl_resize_terminal, to reset readline's idea
of
the screen size after a SIGWINCH.
c. New public functions: rl_save_prompt and rl_restore_prompt. These
were
previously private functions with a `_' prefix.
d. New function hook: rl_pre_input_hook, called just before readline
starts
reading input, after initialization.
e. New function hook: rl_display_matches_hook, called when readline would
display the list of completion matches. The new
function
rl_display_match_list is what readline uses internally, and
is available
for use by application functions called via this hook.
f. New bindable function, delete-char-or-list, like tcsh.
g. A new variable, rl_erase_empty_line, which, if set by an application
using
readline, will cause readline to erase, prompt and all, lines
on which the
only thing typed was a newline.
h. New bindable variable: `isearch-terminators'.
i. New bindable function: `forward-backward-delete-char' (unbound by
default).
a. A new version of malloc, based on the older GNU malloc, that has many
changes, is more page-based, is more conservative with memory
usage,
and does not `orphan' large blocks when they are freed.
b. A new version of gmalloc, based on the old GLIBC malloc, with many
changes and range checking included by default.
c. A new implementation of fnmatch(3) that includes full POSIX.2 Basic
Regular Expression matching, including character classes,
collating
symbols, equivalence classes, and support for
case-insensitive pattern
matching.
d. ksh-88 egrep-style extended pattern matching ([@+*?!](patlist)) has
been
implemented, controlled by a new `shopt' option, `extglob'.
e. There is a new ksh-like `[[' compound command, which implements
extended `test' functionality.
f. There is a new `printf' builtin, implemented according to the POSIX.2
specification.
g. There is a new feature for command substitution: $(< filename) now
expands
to the contents of `filename', with any trailing newlines
removed
(equivalent to $(cat filename)).
h. There are new tilde prefixes which expand to directories from the
directory stack.
i. There is a new `**' arithmetic operator to do exponentiation.
j. There are new configuration options to control how bash is linked:
`--enable-profiling', to allow bash to be profiled with gprof,
and
`--enable-static-link', to allow bash to be linked
statically.
k. There is a new configuration option, `--enable-cond-command', which
controls whether or not the `[[' command is included.
It is on by
default.
l. There is a new configuration option, `--enable-extended-glob', which
controls whether or not the ksh extended globbing feature is
included.
It is enabled by default.
m. There is a new configuration #define in config.h.top that, when
enabled,
will cause all login shells to source /etc/profile and one of
the user-
specific login shell startup files, whether or not the shell
is
interactive.
n. There is a new invocation option, `--dump-po-strings', to dump
a shell script's translatable strings ($"...") in GNU `po'
format.
o. There is a new `shopt' option, `nocaseglob', to enable case-insensitive
pattern matching when globbing filenames and using the `case'
construct.
p. There is a new `shopt' option, `huponexit', which, when enabled, causes
the shell to send SIGHUP to all jobs when an interactive
login shell
exits.
q. `bind' has a new `-u' option, which takes a readline function name as
an
argument and unbinds all key sequences bound to that function
in a
specified keymap.
r. `disown' now has `-a' and `-r' options, to limit operation to all jobs
and running jobs, respectively.
s. The `shopt' `-p' option now causes output to be displayed in a reusable
format.
t. `test' has a new `-N' option, which returns true if the filename
argument
has been modified since it was last accessed.
u. `umask' now has a `-p' option to print output in a reusable format.
v. A new escape sequence, `\xNNN', has been added to the `echo -e' and
$'...'
translation code. It expands to the character whose
ascii code is NNN
in hexadecimal.
w. The prompt string expansion code has a new `\r' escape sequence.
x. The shell may now be cross-compiled for the CYGWIN32 environment on
a Unix machine.
2. New Features in Readline
a. There is now an option for `iterative' yank-last-arg handline, so a
user
can keep entering `M-.', yanking the last argument of
successive history
lines.
b. New variable, `print-completions-horizontally', which causes completion
matches to be displayed across the screen (like `ls -x')
rather than up
and down the screen (like `ls').
c. New variable, `completion-ignore-case', which causes filename
completion
and matching to be performed case-insensitively.
d. There is a new bindable command, `magic-space', which causes history
expansion to be performed on the current readline buffer and
a space to
be inserted into the result.
e. There is a new bindable command, `menu-complete', which enables tcsh-like
menu completion (successive executions of menu-complete
insert a single
completion match, cycling through the list of possible
completions).
f. There is a new bindable command, `paste-from-clipboard', for use on
Win32
systems, to insert the text from the Win32 clipboard into the
editing
buffer.
g. The key sequence translation code now understands printf-style
backslash
escape sequences, including \NNN octal escapes. These
escape sequences
may be used in key sequence definitions or macro values.
h. An `$include' inputrc file parser directive has been added.
This is a terse description of the new features added to bash-2.01 since
the release of bash-2.0. As always, the manual page (doc/bash.1) is the
place to look for complete descriptions.
1. New Features in Bash
a. There is a new builtin array variable: GROUPS, the set of groups to
which
the user belongs. This is used by the test suite.
2. New Features in Readline
a. If a key sequence bound to `universal-argument' is read while reading a
numeric argument started with `universal-argument', it
terminates the
argument but is otherwise ignored. This provides a way
to insert multiple
instances of a digit string, and is how GNU emacs does it.
-------------------------------------------------------------------------------
This is a terse description of the new features added to bash-2.0 since
the release of bash-1.14.7. As always, the manual page (doc/bash.1) is
the place to look for complete descriptions.
1. New Features in Bash
a. There is a new invocation option, -D, that dumps translatable strings
in a script.
b. The `long' invocation options must now be prefixed with `--'.
c. New long invocation options: --dump-strings, --help, --verbose
d. The `nolineediting' invocation option was renamed to `noediting'.
e. The `nobraceexpansion' and `quiet' long invocation options were removed.
f. The `--help' and `--version' long options now work as the GNU coding
standards specify.
g. If invoked as `sh', bash now enters posix mode after reading the
startup files, and reads and executes commands from the file
named
by $ENV if interactive (as POSIX.2 specifies). A login
shell invoked
as `sh' reads $ENV after /etc/profile and ~/.profile.
h. There is a new reserved word, `time', for timing pipelines, builtin
commands, and shell functions. It uses the value of the
TIMEFORMAT
variable as a format string describing how to print the
timing
statistics.
i. The $'...' quoting syntax expands ANSI-C escapes in ... and leaves the
result single-quoted.
j. The $"..." quoting syntax performs locale-specific translation of ...
and leaves the result double-quoted.
k. LINENO now works correctly in functions.
l. New variables: DIRSTACK, PIPESTATUS, BASH_VERSINFO, HOSTNAME, SHELLOPTS,
MACHTYPE. The first three are array variables.
m. The BASH_VERSION and BASH_VERSINFO variables now include the shell's
`release status' (alpha[N], beta[N], release).
n. Some variables have been removed: MAIL_WARNING, notify,
history_control,
command_oriented_history, glob_dot_filenames,
allow_null_glob_expansion,
nolinks, hostname_completion_file, noclobber,
no_exit_on_failed_exec, and
cdable_vars. Most of them are now implemented with the
new `shopt'
builtin; others were already implemented by `set'.
o. Bash now uses some new variables: LC_ALL, LC_MESSAGES, LC_CTYPE,
LC_COLLATE, LANG, GLOBIGNORE, HISTIGNORE.
p. The shell now supports integer-indexed arrays of unlimited length,
with a new compound assignment syntax and changes to the
appropriate
builtin commands (declare/typeset, read, readonly, etc.).
The array
index may be an arithmetic expression.
q. ${!var}: indirect variable expansion, equivalent to eval \${$var}.
r. ${paramter:offset[:length]}: variable substring extraction.
s. ${parameter/pattern[/[/]string]}: variable pattern substitution.
t. The $[...] arithmetic expansion syntax is no longer supported, in
favor of $((...)).
u. Aliases can now be expanded in shell scripts with a shell option
(shopt expand_aliases).
v. History and history expansion can now be used in scripts with
set -o history and set -H.
w. All builtins now return an exit status of 2 for incorrect usage.
x. Interactive shells resend SIGHUP to all running or stopped children
if (and only if) they exit due to a SIGHUP.
y. New prompting expansions: \a, \e, \H, \T, \@, \v, \V.
z. Variable expansion in prompt strings is now controllable via a shell
option (shopt promptvars).
aa. Bash now defaults to using command-oriented history.
bb. The history file ($HISTFILE) is now truncated to $HISTFILESIZE after
being written.
cc. The POSIX.2 conditional arithmetic evaluation syntax (expr ? expr : expr)
has been implemented.
dd. Each builtin now accepts `--' to signify the end of the options, except
as documented (echo, etc.).
ee. All builtins use -p to display values in a re-readable format where
appropriate, except as documented (echo, type, etc.).
ff. The `alias' builtin has a new -p option.
gg. Changes to the `bind' builtin:
o has new options: -psPSVr.
o the `-d' option was renamed to `-p'
o the `-v' option now dumps variables; the old `-v' is now `-P'
hh. The `bye' synonym for `exit' was removed.
ii. The -L and -P options to `cd' and `pwd' have been documented.
jj. The `cd' builtin now does spelling correction on the directory name
by default. This is settable with a shell option (shopt
cdspell).
kk. The `declare' builtin has new options: -a, -F, -p.
ll. The `dirs' builtin has new options: -c, -p, -v.
mm. The new `disown' builtin removes jobs from the shell's jobs table
or inhibits the resending of SIGHUP when the shell receives a
SIGHUP.
nn. The `echo' builtin has a new escape character: \e.
oo. The `enable' builtin can now load new builtins dynamically from shared
objects on systems with the dlopen/dlsym interface.
There are a number
of examples in the examples/loadables directory. There
are also
new options: -d, -f, -s, -p.
pp. The `-all' option to `enable' was removed in favor of `-a'.
qq. The `exec' builtin has new options: -l, -c, -a.
rr. The `hash' builtin has a new option: -p.
ss. The `history' builtin has new options: -c, -p, -s.
tt. The `jobs' builtin has new options: -r, -s.
uu. The `kill' builtin has new options: -n signum, -l signame.
vv. The `pushd' and `popd' builtins have a new option: -n.
ww. The `read' builtin has new options: -p prompt, -e, -a.
xx. The `readonly' builtin has a new -a option, and the -n option was removed.
yy. Changes to the `set' builtin:
o new options: -B, -o keyword, -o onecmd, -o history
o options removed: -l, -d, -o nohash
o options changed: +o, -h, -o hashall
o now displays variables in a format that can be re-read as input
zz. The new `shopt' builtin controls shell optional behavior previously
done by setting and unsetting certain shell variables.
aaa. The `test' builtin has new operators: -o option, s1 == s2, s1 < s2,
and s1 > s2, where s1 and s2 are strings.
bbb. There is a new trap, DEBUG, executed after every simple command.
ccc. The `trap' builtin has a new -p option.
ddd. The `ulimit' builtin has a new -l option on 4.4BSD-based systems.
eee. The PS1, PS2, PATH, and IFS variables may now be unset.
fff. The restricted shell mode has been expanded and is now documented.
ggg. Security improvements:
o functions are not imported from the environment if running setuid
or with -p
o no startup files are sourced if running setuid or with -p
hhh. The documentation has been overhauled: the texinfo manual was
expanded, and HTML versions of the man page and texinfo
manual
are included.
iii. Changes to Posix mode:
o Command lookup now finds special builtins before shell functions.
o Failure of a special builtin causes a non-interactive shell to
exit. Failures are defined in the POSIX.2 specification.
o If the `cd' builtin finds a directory to change to using $CDPATH,
the value assigned to PWD when `cd' completes does not contain
any symbolic links.
o A non-interactive shell exits if a variable assignment error
occurs when no command name follows the assignment statements.
o A non-interactive shell exits if the interation variable in a
`for' statement or the selection variable in a `select' statement
is read-only or another variable assignment error occurs.
o The `<>' redirection operator now opens a file for both stdin and
stdout by default, not just when in posix mode.
o Assignment statements preceding special builtins now persist in
the shell's environment when the builtin completes.
Posix mode is now completely POSIX.2-compliant (modulo
bugs). When
invoked as sh, bash should be completely
POSIX.2-compliant.
jjj. The default value of PS1 is now "\s-\v\$ ".
kkk. The ksh-like ((...)) arithmetic command syntax has been implemented.
This is exactly equivalent to `let "..."'.
lll. Integer constants have been extended to base 64.
mmm. The `ulimit' builtin now sets both hard and soft limits and reports the
soft limit by default.
2. New Features in Readline
a. New variables: enable-keypad, input-meta (new name for
meta-flag),
mark-directories, visible-stats (now documented),
disable-completion,
comment-begin.
b. New bindable commands: kill-region, copy-region-as-kill,
copy-backward-word, copy-forward-word, set-mark,
exchange-point-and-mark,
character-search, character-search-backward, insert-comment,
glob-expand-word, glob-list-expansions, dump-variables,
dump-macros.
c. New emacs keybindings: delete-horizontal-space (M-\),
insert-completions (M-*), possible-completions (M-=).
d. The history-search-backward and history-search-forward commands were
modified to be the same as previous-line and next-line if
point is at
the start of the line.
e. More file types are available for the visible-stats mode.
3. Changes of interest in the Bash implementation
a. There is a new autoconf-based configuration mechanism.
b. More things have been moved from Posix mode to standard shell behavior.
c. The trace output (set -x) now inserts quotes where necessary so it can
be reused as input.
d. There is a compile-time option for a system-wide interactive shell
startup file (disabled by default).
e. The YACC grammar is smaller and tighter, and all 66 shift-reduce
conflicts are gone. Several parsing bugs have been
fixed.
f. Builtin option parsing has been regularized (using internal_getopt()),
with the exception of `echo', `type', and `set'.
g. Builtins now return standard usage messages constructed from the
`short doc' used by the help builtin.
h. Completion now quotes using backslashes by default, but honors
user-supplied quotes.
i. The GNU libc malloc is available as a configure-time option.
j. There are more internationalization features; bash uses gettext if
it is available. The $"..." translation syntax uses the
current
locale and gettext.
k. There is better reporting of job termination when the shell is not
interactive.
l. The shell is somewhat more efficient: it uses a little less memory and
makes fewer system calls.
4. Changes of interest in the Readline implementation
a. There is now support for readline `callback' functions.
b. There is now support for user-supplied input, redisplay, and terminal
preparation functions.
c. Most of the shell-specific code in readline has been generalized or
removed.
d. Most of the annoying redisplay bugs have been fixed, notably the
problems
with incremental search and excessive redrawing when special
characters
appear in the prompt string.
e. There are new library functions and variables available to application
writers, most having to do with completion and quoting.
f. The NEWLINE character (^J) is now treated as a search terminator by the
incremental search functions.
Bash implements essentially the same grammar, parameter and variable
expansion, redirection, and quoting as the Bourne Shell. Bash uses the POSIX
1003.2 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 as the baseline
reference.
sh behavior (see section
6.11
Bash POSIX Mode).
bind builtin.
complete
and compgen, to manipulate it.
history and fc
builtins to manipulate it.
csh-like history expansion (see section
9.3
History Expansion).
$'...' 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).
$"..." 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).
! 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.
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.
for (( expr1 ; expr2 ;
expr3 )) arithmetic for command, similar to the C language
(see section
3.2.4
Looping Constructs).
select compound command, which allows the
generation of simple menus (see section
3.2.5
Conditional Constructs).
[[ compound command, which makes
conditional testing part of the shell grammar (see section
3.2.5
Conditional Constructs).
alias and
unalias builtins (see section
6.6
Aliases).
(( compound command
(see section
3.2.5
Conditional Constructs), and arithmetic expansion (see section
6.5
Shell Arithmetic).
export
command.
${#xx}, which returns the length of
${xx}, is supported (see section
3.5.3
Shell Parameter 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).
${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).
${!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).
${!word}
(see section
3.5.3
Shell Parameter Expansion).
$9 using
${num}.
$() 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).
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.
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.
extglob shell option is enabled (see section
3.5.8.1 Pattern Matching).
sh does not separate the two name spaces.
local builtin, and thus useful recursive functions may be written
(see section
4.2
Bash Builtin Commands).
sh, all variable assignments preceding
commands are global unless the command is executed from the file system.
noclobber option is available to avoid overwriting
existing files with output redirection (see section
4.3
The Set Builtin). The '>|' redirection operator may be used
to override noclobber.
cd and pwd builtins (see section
4.1
Bourne Shell Builtins) each take -L and -P
options to switch between logical and physical modes.
builtin and command builtins (see section
4.2
Bash Builtin Commands).
command builtin allows selective disabling of functions
when command lookup is performed (see section
4.2
Bash Builtin Commands).
enable
builtin (see section
4.2
Bash Builtin Commands).
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).
export -f (see section
3.3
Shell Functions).
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.
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).
help builtin for quick reference to shell
facilities (see section
4.2
Bash Builtin Commands).
printf builtin is available to display formatted output
(see section
4.2
Bash Builtin Commands).
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.
return builtin may be used to abort execution of
scripts executed with the . or source builtins
(see section
4.1
Bourne Shell Builtins).
shopt builtin, for finer control of shell
optional capabilities (see section
4.2
Bash Builtin Commands), and allows these options to be set and unset at
shell invocation (see section
6.1
Invoking Bash).
set
builtin (see section
4.3
The Set Builtin).
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.
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 after every simple command. The DEBUG
trap is not inherited by shell functions unless the function has been given
the trace attribute. 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.
type builtin is more extensive and gives more
information about the names it finds (see section
4.2
Bash Builtin Commands).
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).
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.
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.
mldmode
and priv) not present in Bash.
stop or newgrp builtins.
SHACCT variable or perform shell
accounting.
sh uses a TIMEOUT variable like
Bash uses TMOUT. More features unique to Bash may be found in section 6 Bash Features.
Since Bash is a completely new implementation, it does not suffer from many of the limitations of the SVR4.2 shell. For instance:
if or while
statement.
EOF under certain
circumstances. This can be the cause of some hard-to-find errors.
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.
-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.
SIGSEGV,
SIGALRM, or SIGCHLD.
IFS, MAILCHECK,
PATH, PS1, or PS2 variables to be
unset.
-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 '-'.
jsh
(it turns on job control). Copyright © 1996-2008 by Dr. Nikolai Bezroukov. www.softpanorama.org was created as a service to the UN Sustainable Development Networking Programme (SDNP) in the author free time. Submit comments This document is an industrial compilation designed and created exclusively for educational use and is placed under the copyright of the Open Content License(OPL). Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.
Standard disclaimer: The statements, views and opinions presented on this web page are those of the author and are not endorsed by, nor do they necessarily reflect, the opinions of the author present and former employers, SDNP or any other organization the author may be associated with. We do not warrant the correctness of the information provided or its fitness for any purpose.
Last modified: March 28, 2008