|
Softpanorama |
May the source be with you, but remember the KISS principle ;-)
Softpanorama Search
|
| 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-2009 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). Site uses AdSense so you need to be aware of Google privacy policy. Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.
Disclaimer:
Last modified: August 10, 2009