795 lines
31 KiB
Text
795 lines
31 KiB
Text
This is the Bash FAQ, version 1.2, for Bash version 1.14.6.
|
|
|
|
This document contains a set of frequently-asked questions concerning
|
|
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
|
|
interpreter with advanced features for both interactive use and shell
|
|
programming.
|
|
|
|
Another good source of basic information about shells is the collection
|
|
of FAQ articles periodically posted to comp.unix.shell.
|
|
|
|
Questions and comments concerning this document should be set to
|
|
chet@po.cwru.edu.
|
|
|
|
Contents:
|
|
1) What is it?
|
|
2) What's the latest version?
|
|
3) Where can I get it?
|
|
4) What's the `Posix 1003.2 standard'?
|
|
5) On what machines will bash run?
|
|
6) How does bash differ from sh, the Bourne shell?
|
|
7) How does bash differ from the Korn shell?
|
|
8) What is the bash `posix mode'?
|
|
9) How can I build bash with gcc?
|
|
10) Why does bash run a different version of `command' than
|
|
`which command' says it will?
|
|
11) How can I make my csh aliases work when I convert to bash?
|
|
12) Now that I've converted from ksh to bash, are there equivalents to
|
|
ksh features like autoloaded functions and the `whence' command?
|
|
13) Why is the bash builtin `test' slightly different from /bin/test?
|
|
14) Why does bash sometimes say `Broken pipe'?
|
|
15) How can I get bash to read and display eight-bit characters?
|
|
16) Why can't I use command line editing in my `cmdtool'?
|
|
17) How do I write a function `x' to replace builtin command `x', but
|
|
still invoke the command from within the function?
|
|
18) When I have terminal escape sequences in my prompt, why does bash
|
|
wrap lines at the wrong column?
|
|
19) I built bash on Solaris 2. Why do globbing expansions and filename
|
|
completion chop off the first few characters of each filename?
|
|
20) Why doesn't bash treat brace expansions exactly like csh?
|
|
21) Why does bash dump core after I interrupt username completion?
|
|
22) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
|
23) How can I find the value of a shell variable whose name is the value
|
|
of another shell variable?
|
|
24) If I pipe the output of a command into `read variable', why doesn't
|
|
the output show up in $variable when the read command finishes?
|
|
25) I just changed my shell to bash, and now I can't FTP into my machine.
|
|
Why not?
|
|
26) I have a bunch of shell scripts that use backslash-escaped characters
|
|
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
|
not, and how can I make it understand them?
|
|
27) Why doesn't bash have csh variable modifiers?
|
|
28) Why does bash report syntax errors when my C News scripts use a
|
|
redirection before a subshell command?
|
|
29) How do I report bugs in bash, and where should I look for fixes and
|
|
advice?
|
|
30) What kind of bash documentation is there?
|
|
31) What's coming in future versions?
|
|
32) What's on the bash `wish list'?
|
|
33) When will the next release appear?
|
|
|
|
1) What is it?
|
|
|
|
Bash is a Unix command interpreter (shell). It is an implementation of
|
|
the Posix 1003.2 shell standard, and resembles the Korn and System V
|
|
shells.
|
|
|
|
Bash contains a number of enhancements over those shells, both
|
|
for interactive use and shell programming. Features geared
|
|
toward interactive use include command line editing, command
|
|
history, job control, aliases, and prompt expansion. Programming
|
|
features include additional variable expansions, shell
|
|
arithmetic, and a number of variables and options to control
|
|
shell behavior.
|
|
|
|
Bash was originally written by Brian Fox of the Free Software
|
|
Foundation. The current developer and maintainer is Chet Ramey
|
|
of Case Western Reserve University.
|
|
|
|
2) What's the latest version?
|
|
|
|
The latest version is 1.14.6, first made available on December 19, 1995.
|
|
|
|
3) Where can I get it?
|
|
|
|
Bash is the GNU project's shell, and so is available from the
|
|
master GNU archive site, prep.ai.mit.edu, and its mirrors. The
|
|
latest version is also available for FTP from slc2.ins.cwru.edu,
|
|
the maintainer's machine. The following URLs tell how to get
|
|
version 1.14.6:
|
|
|
|
ftp://prep.ai.mit.edu/pub/gnu/bash-1.14.6.tar.gz
|
|
ftp://slc2.ins.cwru.edu/pub/dist/bash-1.14.6.tar.gz
|
|
|
|
4) What's the `Posix 1003.2 standard'?
|
|
|
|
POSIX is a name originally coined by Richard Stallman for a
|
|
family of open system standards based on UNIX. There are a
|
|
number of aspects of UNIX under consideration for
|
|
standardization, from the basic system services at the system
|
|
call and C library level to applications and tools to system
|
|
administration and management. Each area of standardization is
|
|
assigned to a working group in the 1003 series.
|
|
|
|
The POSIX Shell and Utilities standard has been developed by IEEE
|
|
Working Group 1003.2 (POSIX.2). It concentrates on the command
|
|
interpreter interface and utility programs commonly executed from
|
|
the command line or by other programs. An initial version of the
|
|
standard has been approved and published by the IEEE, and work is
|
|
currently underway to update it.
|
|
|
|
Bash is concerned with the aspects of the shell's behavior
|
|
defined by POSIX.2. The shell command language has of course
|
|
been standardized, including the basic flow control and program
|
|
execution constructs, I/O redirection and pipelining, argument
|
|
handling, variable expansion, and quoting.
|
|
|
|
The `special' builtins, which must be implemented as part of the
|
|
shell to provide the desired functionality, are specified as
|
|
being part of the shell; examples of these are `eval' and
|
|
`export'. Other utilities appear in the sections of POSIX.2 not
|
|
devoted to the shell which are commonly (and in some cases must
|
|
be) implemented as builtin commands, such as `read' and `test'.
|
|
POSIX.2 also specifies aspects of the shell's interactive
|
|
behavior as part of the UPE, including job control and command
|
|
line editing. Only vi-style line editing commands have been
|
|
standardized; emacs editing commands were left out due to
|
|
objections.
|
|
|
|
5) On what machines will bash run?
|
|
|
|
Bash has been ported to nearly every version of UNIX. All you
|
|
should have to do to build it on a machine for which a port
|
|
exists is to type `make'. The build process will attempt to
|
|
discover the version of UNIX you have and tailor itself
|
|
accordingly, using a combination of saved definitions in the file
|
|
`machines.h' and a file `sysdefs.h' created by inspecting the
|
|
environment for various things.
|
|
|
|
More information appears in the file `INSTALL' in the distribution.
|
|
|
|
6) How does bash differ from sh, the Bourne shell?
|
|
|
|
This is a non-comprehensive list of features that differentiate bash
|
|
from the SVR4 shell. The bash manual page explains these completely.
|
|
|
|
Things bash has that sh does not:
|
|
long invocation options
|
|
`!' reserved word to invert pipeline return value
|
|
the select compound command
|
|
the $(...) form of command substitution
|
|
the ${#param} parameter value length operator
|
|
expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
|
|
variables: BASH, BASH_VERSION, UID, EUID, REPLY, PPID, PWD,
|
|
OLDPWD, SHLVL, RANDOM, SECONDS, LINENO, HISTCMD,
|
|
HOSTTYPE, OSTYPE, ENV, MAIL_WARNING, PS3, PS4,
|
|
HISTSIZE, HISTFILE, HISTFILESIZE, PROMPT_COMMAND,
|
|
FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, HISTCONTROL,
|
|
command_oriented_history, allow_null_glob_expansion,
|
|
glob_dot_filenames, histchars, nolinks, auto_resume,
|
|
HOSTFILE, noclobber, TMOUT, no_exit_on_failed_exec,
|
|
cdable_vars
|
|
redirections: <>, &>, >|
|
|
prompt string special char translation and variable expansion
|
|
auto-export of modified values of variables in initial environment
|
|
command search finds functions before builtins
|
|
bash return builtin will exit a file sourced with `.'
|
|
builtins: cd -, exec -, echo -e/-E, export -n/-f/-p/name=value,
|
|
pwd -P, read -r, readonly -f, trap -l, ulimit -n/-p/-u,
|
|
set -b/-m/-o option/-p/-l/-d/-C/-H/-P, unset -f/-v,
|
|
umask -S, type -all/-path/-type, suspend -f, kill -s
|
|
bash reads ~/.bashrc for interactive shells, $ENV for non-interactive
|
|
bash restricted shell mode is more extensive
|
|
bash allows functions and variables with the same name
|
|
brace expansion
|
|
tilde expansion
|
|
arithmetic expansion and `let' builtin
|
|
process substitution
|
|
aliases and alias/unalias builtins
|
|
local variables in functions and `local' builtin
|
|
readline and command-line editing
|
|
history and history/fc builtins
|
|
csh-like history expansion
|
|
other new bash builtins: bind, command, builtin, declare/typeset,
|
|
dirs, enable, fc, help, history, logout,
|
|
popd, pushd
|
|
exported functions
|
|
filename generation when using output redirection (command >a*)
|
|
|
|
Things sh has that bash does not:
|
|
uses variable SHACCT to do shell accounting
|
|
includes `stop' builtin (bash can use alias stop='kill -s STOP')
|
|
`newgrp' builtin
|
|
turns on job control if called as `jsh'
|
|
ulimit attempts to set both soft & hard limits if -S/-H not given
|
|
|
|
New things in the SVR4.2 sh:
|
|
internationalization: $LANG, $LC_CTYPE, $LC_MESSAGES, setlocale, etc.
|
|
$TIMEOUT (like bash $TMOUT)
|
|
new builtins: mldmode, priv
|
|
`read' builtin has -r
|
|
cannot trap SIGALRM or SIGCHLD
|
|
kill -s is present
|
|
|
|
Implementation differences:
|
|
redirection to/from compound commands causes sh to create a subshell
|
|
bash does not allow unbalanced quotes; sh silently inserts them at EOF
|
|
bash does not mess with signal 11
|
|
sh sets (euid, egid) to (uid, gid) if -p not supplied and uid < 100
|
|
bash splits only the results of expansions on IFS
|
|
sh does not allow MAILCHECK to be unset (?)
|
|
|
|
7) How does bash differ from the Korn shell?
|
|
|
|
Things bash has or uses that ksh does not:
|
|
long invocation options
|
|
`!' reserved word
|
|
posix mode and posix conformance
|
|
command hashing
|
|
tilde expansion for assignment statements that look like $PATH
|
|
process substitution with named pipes if /dev/fd is not available
|
|
variables: BASH, BASH_VERSION, UID, EUID, SHLVL, HISTCMD, HOSTTYPE,
|
|
OSTYPE, MAIL_WARNING, HISTFILESIZE, OPTERR,
|
|
PROMPT_COMMAND, IGNOREEOF, FIGNORE, INPUTRC, HISTCONTROL,
|
|
notify, command_oriented_history, glob_dot_filenames,
|
|
allow_null_glob_expansion, histchars, nolinks, HOSTFILE,
|
|
noclobber, auto_resume, no_exit_on_failed_exec, cdable_vars
|
|
prompt expansion with backslash escapes and command substitution
|
|
redirection: &> (stdout and stderr)
|
|
more extensive and extensible editing and completion
|
|
builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
|
|
exec -, fc -s, export -n/-f/-p, hash, help, history,
|
|
jobs -x, kill -s, local, logout, popd, pushd,
|
|
readonly -n/-f/-p, set -o braceexpand/-o histexpand/
|
|
-o interactive-comments/-o notify/-o physical/-o posix/
|
|
-l/-d/-C/-b/-H/-P, suspend, trap -l, type, ulimit -u,
|
|
umask -S
|
|
$[...] synonym for $((...))
|
|
`!' csh-style history expansion
|
|
|
|
Things ksh has or uses that bash does not:
|
|
new version of test: [[...]]
|
|
((...)) equivalent to let "..."
|
|
time keyword to let pipelines be timed
|
|
tracked aliases
|
|
$(<file)
|
|
one-dimensional arrays and appropriate expansions
|
|
variables: ERRNO, FPATH, COLUMNS, LINES, EDITOR, VISUAL
|
|
extended pattern matching with egrep-style pattern lists
|
|
co-processes (|&, >&p, <&p)
|
|
weirdly-scoped functions
|
|
typeset +f to list all function names without definitions
|
|
text of command history kept in a file, not memory
|
|
builtins: alias -x, cd old new, fc -e -, newgrp, print,
|
|
read -p/-s/u/var?prompt, set -A/-o gmacs/-o keyword/
|
|
-o bgnice/-o markdirs/-o nolog/-o trackall/-o viraw/-s,
|
|
typeset -H/-L/-R/-A/-ft/-fu/-fx/-l/-u/-t, whence
|
|
|
|
Implementation differences:
|
|
ksh runs last command of a pipeline in parent shell context
|
|
ksh ulimit sets hard and soft limits by default
|
|
bash has brace expansion by default
|
|
bash has fixed startup file for all interactive shells; ksh reads $ENV
|
|
bash has exported functions
|
|
bash command search finds functions before builtins
|
|
|
|
8) What is the bash `posix mode'?
|
|
|
|
Although bash is an implementation of the Posix.2 shell
|
|
specification, there are areas where the bash default behavior
|
|
differs from that spec. The bash `posix mode' changes the bash
|
|
behavior in these areas so that it obeys the spec more closely.
|
|
|
|
Posix mode is entered by starting bash with the -posix option or
|
|
executing `set -o posix' after bash is running.
|
|
|
|
The specific aspects of bash which change when posix mode is
|
|
active are listed in the file CWRU/POSIX.NOTES in the bash
|
|
distribution.
|
|
|
|
9) How can I build bash with gcc?
|
|
|
|
Type
|
|
make CC=gcc CPPNAME='$(CC) -E'
|
|
|
|
10) Why does bash run a different version of `command' than
|
|
`which command' says it will?
|
|
|
|
`which' is actually a csh script that assumes you're running csh.
|
|
It reads the csh startup files from your home directory and uses
|
|
those to determine which `command' will be invoked. Since bash
|
|
doesn't use any of those startup files, there's a good chance
|
|
that your bash environment differs from your csh environment.
|
|
|
|
11) How can I make my csh aliases work when I convert to bash?
|
|
|
|
Bash uses a different syntax to support aliases than csh does.
|
|
The details can be found in the documentation. We have provided
|
|
a shell script which does most of the work of conversion for you;
|
|
this script can be found in ./examples/alias-conv.sh. Here is
|
|
how you use it:
|
|
|
|
Start csh in the normal way for you. (e.g., `csh')
|
|
|
|
Pipe the output of `alias' through `alias-conv.sh', saving the
|
|
results into `bash_aliases':
|
|
|
|
alias | alias-conv.sh >bash_aliases
|
|
|
|
Edit `bash_aliases', carefully reading through any created
|
|
functions. You will need to change the names of csh specific
|
|
variables (like $cwd) to the bash equivalents (like $PWD). You
|
|
will also need to remove recursive references to commands which
|
|
are defined as functions. For example, the csh alias:
|
|
|
|
alias cd 'cd \!*;echo $cwd'
|
|
|
|
is converted to the bash function:
|
|
|
|
cd ()
|
|
{
|
|
cd $*;
|
|
echo $cwd
|
|
}
|
|
|
|
This function contains a self-pointing reference to `cd', which
|
|
should be changed to use the `builtin' version. It also uses
|
|
the csh variable `$cwd' which has an equivalent in bash.
|
|
Precede the recursive reference with the word `builtin', and
|
|
change the name of the variable:
|
|
|
|
cd () { builtin cd $*; echo $PWD; }
|
|
|
|
Merge the edited file into your ~/.bashrc.
|
|
|
|
12) Now that I've converted from ksh to bash, are there equivalents to
|
|
ksh features like autoloaded functions and the `whence' command?
|
|
|
|
There are features in ksh-88 that do not have direct bash equivalents.
|
|
Most, however, can be emulated with very little trouble.
|
|
|
|
ksh-88 feature Bash equivalent
|
|
-------------- ---------------
|
|
[[...]] can usually use [...]; minor differences
|
|
compiled-in aliases set up aliases in .bashrc; some ksh aliases are
|
|
bash builtins (hash, history, type)
|
|
$(<file) $(cat file)
|
|
arrays no good subsitute yet
|
|
((...)) let "..."
|
|
time use external command; GNU time is particularly useful
|
|
use time bash -c '...' for complicated constructs
|
|
extended patterns no good substitute
|
|
coprocesses named pipe pairs (one for read, one for write)
|
|
typeset +f declare -f |
|
|
sed -n 's:^declare -[a-z]* \([^ ]*\).*$:\1:p'
|
|
cd, print, whence function subsitutes in examples/functions/kshenv
|
|
autoloaded functions examples/functions/autoload is the same as typeset -fu
|
|
read var?prompt [ -t 0 ] && echo -n prompt >&2; read var
|
|
|
|
13) Why is the bash builtin `test' slightly different from /bin/test?
|
|
|
|
The specific example used here is [ ! x -o x ], which is false.
|
|
|
|
Bash's builtin `test' implements the Posix.2 spec, which can be
|
|
summarized as follows (the wording is due to David Korn):
|
|
|
|
Here is the set of rules for processing test arguments.
|
|
|
|
0 Args: False
|
|
1 Arg: True iff argument is not null.
|
|
2 Args: If first arg is !, True iff second argument is null.
|
|
If first argument is unary, then true if unary test is true
|
|
Otherwise error.
|
|
3 Args: If second argument is a binary operator, do binary test of $1 $3
|
|
If first argument is !, negate two argument test of $2 $3
|
|
Otherwise error.
|
|
4 Args: If first argument is !, negate three argument test of $2 $3 $4.
|
|
Otherwise unspecified
|
|
5 or more Args: unspecified. (Historical shells would use their
|
|
current algorithm).
|
|
|
|
The operators -a and -o are considered binary operators for the purpose
|
|
of the 3 Arg case.
|
|
|
|
As you can see, the test becomes (not (x or x)), which is false.
|
|
|
|
14) Why does bash sometimes say `Broken pipe'?
|
|
|
|
If a sequence of commands appear in a pipeline, and one of the
|
|
reading commands finishes before the writer has finished, the
|
|
writer receives a SIGPIPE signal. Many other shells special-case
|
|
SIGPIPE as an exit status in the pipeline and do not report it.
|
|
For example, in:
|
|
|
|
ps -aux | head
|
|
|
|
`head' can finish before `ps' writes all of its output, and ps
|
|
will try to write on a pipe without a reader. In that case, bash
|
|
will print `Broken pipe' to stderr when ps is killed by a
|
|
SIGPIPE.
|
|
|
|
15) How can I get bash to read and display eight-bit characters?
|
|
|
|
This is a process requiring several steps.
|
|
|
|
First, you must ensure that the `physical' data path is a full eight
|
|
bits. For xterms, for example, the `vt100' resources `eightBitInput'
|
|
and `eightBitOutput' should be set to `true'.
|
|
|
|
Once you have set up an eight-bit path, you must tell the kernel and
|
|
tty driver to leave the eigth bit of characters alone when processing
|
|
keyboard input. Use `stty' to do this:
|
|
|
|
stty cs8 -istrip -parenb
|
|
|
|
For old BSD-style systems, you can use
|
|
|
|
stty pass8
|
|
|
|
You may also need
|
|
|
|
stty even odd
|
|
|
|
Finally, you need to tell readline that you will be inputting and
|
|
displaying eight-bit characters. You use readline variables to do
|
|
this. These variables can be set in your .inputrc or using the bash
|
|
`bind' builtin. Here's an example using `bind':
|
|
|
|
bash$ bind 'set convert-meta off'
|
|
bash$ bind 'set meta-flag on'
|
|
bash$ bind 'set output-meta on'
|
|
|
|
The `set' commands between the single quotes may also be placed
|
|
in ~/.inputrc.
|
|
|
|
16) Why can't I use command line editing in my `cmdtool'?
|
|
|
|
The problem is `cmdtool' and bash fighting over the input. When
|
|
scrolling is enabled in a cmdtool window, cmdtool puts the tty in
|
|
`raw mode' to permit command-line editing using the mouse for
|
|
applications that cannot do it themselves. As a result, bash and
|
|
cmdtool each try to read keyboard input immediately, with neither
|
|
getting enough of it to be useful.
|
|
|
|
This mode also causes cmdtool to not implement many of the
|
|
terminal functions and control sequences appearing in the
|
|
`sun-cmd' termcap entry. For a more complete explanation, see
|
|
that file examples/suncmd.termcap in the bash distribution.
|
|
|
|
`xterm' is a better choice, and gets along with bash much more
|
|
smoothly.
|
|
|
|
17) How do I write a function `x' to replace builtin command `x', but
|
|
still invoke the command from within the function?
|
|
|
|
This is what the `command' and `builtin' builtins are for. The
|
|
`command' builtin executes the command supplied as its first
|
|
argument, skipping over any function defined with that name. The
|
|
`builtin' builtin executes the builtin command given as its first
|
|
argument directly.
|
|
|
|
For example, to write a function to replace `cd' that writes the
|
|
hostname and current directory to an xterm title bar, use
|
|
something like the following:
|
|
|
|
cd()
|
|
{
|
|
builtin cd "$@" && xtitle $HOST: $PWD
|
|
}
|
|
|
|
This could also be written using `command' instead of `builtin';
|
|
the version above is marginally more efficient.
|
|
|
|
18) When I have terminal escape sequences in my prompt, why does bash
|
|
wrap lines at the wrong column?
|
|
|
|
Bash does not know that the terminal escape sequences do not take
|
|
up space on the screen. The redisplay code assumes, unless told
|
|
otherwise, that each character in the prompt is a `printable'
|
|
character that takes up one character position on the screen.
|
|
|
|
You can use the bash prompt expansion facility (see the PROMPTING
|
|
section in the manual page) to tell readline that sequences of
|
|
characters in the prompt strings take up no screen space.
|
|
|
|
Use the \[ escape to begin a sequence of non-printing characters,
|
|
and the \] escape to signal the end of such a sequence.
|
|
|
|
19) I built bash on Solaris 2. Why do globbing expansions and filename
|
|
completion chop off the first few characters of each filename?
|
|
|
|
This is the consequence of building bash on SunOS 5 and linking
|
|
with the libraries in /usr/ucblib, but using the definitions
|
|
and strutures from files in /usr/include.
|
|
|
|
The actual conflict is between the dirent structure in
|
|
/usr/include/dirent.h and the struct returned by the version of
|
|
`readdir' in libucb.a (a 4.3-BSD style `struct direct').
|
|
|
|
Make sure you've got /usr/ccs/bin ahead of /usr/ucb in your $PATH
|
|
when building bash. This will ensure that you use /usr/ccs/bin/cc
|
|
or acc instead of /usr/ucb/cc and that you link with libc before
|
|
libucb.
|
|
|
|
If you have installed the Sun C compiler, you may also need to
|
|
put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
|
|
/usr/ucb.
|
|
|
|
20) Why doesn't bash treat brace expansions exactly like csh?
|
|
|
|
The only difference between bash and csh brace expansion is that
|
|
bash requires a brace expression to contain at least on unquoted
|
|
comma if it is to be expanded. Any brace-surrounded word not
|
|
containing an unquoted comma is left unchanged by the brace
|
|
expansion code. This affords the greatest degree of sh
|
|
compatibility.
|
|
|
|
Bash, ksh, zsh, and pd-ksh all implement brace expansion this way.
|
|
|
|
21) Why does bash dump core after I interrupt username completion on a
|
|
machine running NIS?
|
|
|
|
This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
|
|
client library, which is part of libc.
|
|
|
|
The YP library code keeps static state -- a pointer into the data
|
|
returned from the server. When YP initializes itself (setpwent),
|
|
it looks at this pointer and calls free on it if it's non-null.
|
|
So far, so good.
|
|
|
|
If one of the YP functions is interrupted during getpwent (the
|
|
exact function is interpretwithsave()), and returns NULL, the
|
|
pointer is freed without being reset to NULL, and the function
|
|
returns. The next time getpwent is called, it sees that this
|
|
pointer is non-null, calls free, and the bash free() blows up
|
|
because it's being asked to free freed memory.
|
|
|
|
The traditional Unix mallocs allow memory to be freed multiple
|
|
times; that's probably why this has never been fixed. You can
|
|
probably stop it by adding an #undef USE_GNU_MALLOC to the
|
|
appropriate machine description in machines.h.
|
|
|
|
22) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
|
|
|
The `@' character is the default `line kill' character in most
|
|
versions of System V, including SVR4.2. You can change this
|
|
character to whatever you want using `stty'. For example, to
|
|
change the line kill character to control-u, type
|
|
|
|
stty kill ^U
|
|
|
|
where the `^' and `U' can be two separate characters.
|
|
|
|
23) How can I find the value of a shell variable whose name is the value
|
|
of another shell variable?
|
|
|
|
Use the `eval' builtin. The important thing to remember is that
|
|
`eval' expands the arguments you give it again, so you need to
|
|
quote the parts of the arguments that you want `eval' to act on.
|
|
|
|
For example, this expression prints the value of the last positional
|
|
parameter:
|
|
|
|
eval echo \$\{$#\}
|
|
|
|
The expansion of the quoted portions of this expression will be
|
|
deferred until `eval' runs, while the `$#' will be expanded
|
|
before `eval' is executed.
|
|
|
|
24) If I pipe the output of a command into `read variable', why doesn't
|
|
the output show up in $variable when the read command finishes?
|
|
|
|
This has to do with the parent-child relationship between Unix
|
|
processes.
|
|
|
|
Each element of a pipeline runs in a separate process, a child of
|
|
the shell running the pipeline. A subprocess cannot affect its
|
|
parent's environment. When the `read' command sets the variable
|
|
to the input, that variable is set only in the subshell, not the
|
|
parent shell. When the subshell exits, the value of the variable
|
|
is lost.
|
|
|
|
Many pipelines that end with `read variable' can be converted
|
|
into command substitutions, which will capture the output into a
|
|
variable:
|
|
|
|
grep ^gnu /usr/lib/news/active | wc -l | read ngroup
|
|
|
|
can be converted into
|
|
|
|
ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
|
|
|
|
This does not, unfortunately, work to split the text among
|
|
multiple variables, as read does when given multiple variable
|
|
arguments.
|
|
|
|
25) I just changed my shell to bash, and now I can't FTP into my machine.
|
|
Why not?
|
|
|
|
You must add the full pathname to bash to the file /etc/shells.
|
|
Many versions of ftpd use this file to prohibit `special' users
|
|
such as `uucp' and `news' from using FTP.
|
|
|
|
26) I have a bunch of shell scripts that use backslash-escaped characters
|
|
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
|
not, and how can I make it understand them?
|
|
|
|
This is the behavior of echo on most Unix System V machines.
|
|
|
|
The bash builtin `echo' is modelled after the 9th Edition
|
|
Research Unix version of `echo'. It does not interpret
|
|
backslash-escaped characters in its argument strings by default,
|
|
but requires the use of the -e option to enable the
|
|
interpretation. The System V echo provides no way to disable the
|
|
special characters; the bash echo has a -E option to disable
|
|
them.
|
|
|
|
There is a compile-time option that will make bash behave like
|
|
the System V echo and interpret things like \t by default.
|
|
Change config.h so that DEFAULT_ECHO_TO_USG is defined, remove
|
|
builtins/libbuiltins.a and builtins/echo.o, and rebuild.
|
|
|
|
27) Why doesn't bash have csh variable modifiers?
|
|
|
|
Posix has specified a more powerful, albeit somewhat more confusing,
|
|
mechanism cribbed from ksh, and bash implements it.
|
|
|
|
${parameter%word}
|
|
Remove smallest suffix pattern. The WORD is expanded to produce
|
|
a pattern. It then expands to the value of PARAMETER, with the
|
|
smallest portion of the suffix matched by the pattern deleted.
|
|
|
|
x=file.c
|
|
echo ${x%.c}.o
|
|
-->file.o
|
|
|
|
${parameter%%word}
|
|
|
|
Remove largest suffix pattern. The WORD is expanded to produce
|
|
a pattern. It then expands to the value of PARAMETER, with the
|
|
largest portion of the suffix matched by the pattern deleted.
|
|
|
|
x=posix/src/std
|
|
echo ${x%%/*}
|
|
-->posix
|
|
|
|
${parameter#word}
|
|
Remove smallest prefix pattern. The WORD is expanded to produce
|
|
a pattern. It then expands to the value of PARAMETER, with the
|
|
smallest portion of the prefix matched by the pattern deleted.
|
|
|
|
x=$HOME/src/cmd
|
|
echo ${x#$HOME}
|
|
-->/src/cmd
|
|
|
|
${parameter##word}
|
|
Remove largest prefix pattern. The WORD is expanded to produce
|
|
a pattern. It then expands to the value of PARAMETER, with the
|
|
largest portion of the prefix matched by the pattern deleted.
|
|
|
|
x=/one/two/three
|
|
echo ${x##*/}
|
|
-->three
|
|
|
|
|
|
Given
|
|
a=/a/b/c/d
|
|
b=b.xxx
|
|
|
|
csh bash result
|
|
--- ---- ------
|
|
$a:h ${a%/*} /a/b/c
|
|
$a:t ${a##*/} d
|
|
$b:r ${b%.*} b
|
|
$b:e ${b##*.} xxx
|
|
|
|
|
|
28) Why does bash report syntax errors when my C News scripts use a
|
|
redirection before a subshell command?
|
|
|
|
The actual command in question is something like
|
|
|
|
< file ( command )
|
|
|
|
According to the grammar given in the Posix.2 standard, this construct
|
|
is, in fact, a syntax error. Redirections may only precede `simple
|
|
commands'. A subshell construct such as the above is one of the shell's
|
|
`compound commands'. A redirection may only follow a compound command.
|
|
|
|
The file CWRU/sh-redir-hack in the 1.14.6 distribution is an (unofficial)
|
|
patch to parse.y that will modify the grammar to support this construct.
|
|
Note that if you apply this, you must recompile with -DREDIRECTION_HACK.
|
|
This introduces a large number of reduce/reduce conflicts into the shell
|
|
grammar.
|
|
|
|
29) How do I report bugs in bash, and where should I look for fixes and
|
|
advice?
|
|
|
|
Use the `bashbug' script to report bugs. It is built and
|
|
installed at the same time as bash. It provides a standard
|
|
template for reporting a problem and automatically includes
|
|
information about your configuration and build environment.
|
|
|
|
`bashbug' sends its reports to bug-bash@prep.ai.mit.edu, which
|
|
is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
|
|
|
|
Bug fixes, answers to questions, and announcements of new releases
|
|
are all posted to gnu.bash.bug. Discussions concerning bash features
|
|
and problems also take place there.
|
|
|
|
To reach the bash maintainers directly, send mail to
|
|
bash-maintainers@prep.ai.mit.edu.
|
|
|
|
30) What kind of bash documentation is there?
|
|
|
|
First, look in the documentation directory in the bash distribution.
|
|
It should contain the following files:
|
|
|
|
bash.1 an extensive, thorough Unix-style manual page
|
|
builtins.1 a manual page covering just bash builtin commands
|
|
features.texi a Gnu-style info file overview
|
|
FAQ this file
|
|
article.ms text of an article written for The Linux Journal
|
|
readline.3 a man page describing readline
|
|
|
|
Postscript files created from the above source are also present in
|
|
the distribution.
|
|
|
|
There is additional documentation available for anonymous FTP from host
|
|
slc2.ins.cwru.edu in the `pub/bash' directory.
|
|
|
|
Cameron Newham is in the midst of writing a book on bash, to be
|
|
published by O'Reilly and Associates. Look for it sometime this
|
|
year.
|
|
|
|
31) What's coming in future versions?
|
|
|
|
There will be no new features in future releases of version 1.14.
|
|
|
|
The next major release, bash-2.0, will contain extensive changes and new
|
|
features. Here's a short list:
|
|
|
|
one-dimensional arrays with a new compound assignment statement,
|
|
appropriate expansion constructs and modifications to some
|
|
of the builtins (read, declare, etc.) to use them
|
|
new expansions to do ANSI-C string expansion, substring extraction,
|
|
pattern replacement, and indirect variable expansion
|
|
new builtins: `disown' and `shopt'
|
|
new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK
|
|
special handling of many unused or redundant variables removed
|
|
dynamic loading of new builtin commands; many loadable examples provided
|
|
new prompt expansions: \e, \n, \H, \T
|
|
new readline variables: enable-keypad, mark-directories, input-meta
|
|
new readline commands to manipulate the mark and operate on the region
|
|
new readline emacs mode commands and bindings for ksh-88 compatibility
|
|
updated and extended builtins
|
|
new DEBUG trap
|
|
expanded (and now documented) restricted shell mode
|
|
|
|
implementation stuff:
|
|
autoconf-based configuration
|
|
nearly all of the bugs reported since version 1.14 have been fixed
|
|
most builtins converted to use builtin `getopt' for consistency
|
|
most builtins use -p option to display output in a reusable form
|
|
(for consistency)
|
|
grammar tighter and smaller (66 reduce-reduce conflicts gone)
|
|
lots of code now smaller and faster
|
|
test suite greatly expanded
|
|
|
|
32) What's on the bash `wish list'?
|
|
|
|
internationalization with a variable expansion to translate a string
|
|
according to a particular message catalog
|
|
Programmable completion a la zsh
|
|
menu completion a la tcsh
|
|
the ksh egrep-style extended pattern matching operators
|
|
associative arrays (not really all that hard)
|
|
breaking some of the shell functionality into embeddable libraries
|
|
a bash debugger
|
|
|
|
Much of this will not be in bash-2.0.
|
|
|
|
33) When will the next release appear?
|
|
|
|
Version 1.14.6 will probably be the last release for version 1.14.
|
|
|
|
The next version will appear sometime in 1996. Never make predictions.
|
|
|
|
|
|
This document is copyright Chester Ramey, 1995.
|
|
|
|
Permission is hereby granted, without written agreement and
|
|
without license or royalty fees, to use, copy, and distribute
|
|
this document for any purpose, provided that the above copyright
|
|
notice appears in all copies of this document and that the
|
|
contents of this document remain unaltered.
|