[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some shell variables should not be used, since they can have a deep
influence on the behavior of the shell. In order to recover a sane
behavior from the shell, some variables should be unset, but
unset
is not portable (see section 10.8 Limitations of Shell Builtins) and a
fallback value is needed. We list these values below.
CDPATH
cd
with a relative filename. POSIX
1003.1-2001 says that if a nonempty directory name from CDPATH
is used successfully, cd
prints the resulting absolute
filename. Unfortunately this output can break idioms like
`abs=`cd src && pwd`' because abs
receives the path twice.
Also, many shells do not conform to this part of POSIX; for
example, zsh
prints the result only if a directory name
other than `.' was chosen from CDPATH
.
In practice the shells that have this problem also support
unset
, so you can work around the problem as follows:
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH |
Autoconf-generated scripts automatically unset CDPATH
if
possible, so you need not worry about this problem in those scripts.
IFS
IFS
to backslash. Indeed,
Bourne shells use the first character (backslash) when joining the
components in `"$@"' and some shells then re-interpret (!) the
backslash escapes, so you can end up with backspace and other strange
characters.
The proper value for IFS
(in regular code, not when performing
splits) is `SPCTABRET'. The first character is
especially important, as it is used to join the arguments in `@*'.
LANG
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LC_MONETARY
LC_NUMERIC
LC_TIME
Autoconf-generated scripts normally set all these variables to `C' because so much configuration code assumes the C locale and POSIX requires that locale environment variables be set to `C' if the C locale is desired. However, some older, nonstandard systems (notably SCO) break if locale environment variables are set to `C', so when running on these systems Autoconf-generated scripts unset the variables instead.
LANGUAGE
LANGUAGE
is not specified by POSIX, but it is a GNU
extension that overrides LC_ALL
in some cases, so
Autoconf-generated scripts set it too.
LC_ADDRESS
LC_IDENTIFICATION
LC_MEASUREMENT
LC_NAME
LC_PAPER
LC_TELEPHONE
These locale environment variables are GNU extensions. They
are treated like their POSIX brethren (LC_COLLATE
,
etc.) as described above.
LINENO
LINENO
.
Its value is the line number of the beginning of the current command.
Autoconf attempts to execute configure
with a modern shell.
If no such shell is available, it attempts to implement LINENO
with a Sed prepass that replaces each instance of the string
$LINENO
(not followed by an alphanumeric character) with the
line's number.
You should not rely on LINENO
within eval
, as the
behavior differs in practice. Also, the possibility of the Sed
prepass means that you should not rely on $LINENO
when quoted,
when in here-documents, or when in long commands that cross line
boundaries. Subshells should be OK, though. In the following
example, lines 1, 6, and 9 are portable, but the other instances of
LINENO
are not:
$ cat lineno echo 1. $LINENO cat <<EOF 3. $LINENO 4. $LINENO EOF ( echo 6. $LINENO ) eval 'echo 7. $LINENO' echo 8. '$LINENO' echo 9. $LINENO ' 10.' $LINENO $ bash-2.05 lineno 1. 1 3. 2 4. 2 6. 6 7. 1 8. $LINENO 9. 9 10. 9 $ zsh-3.0.6 lineno 1. 1 3. 2 4. 2 6. 6 7. 7 8. $LINENO 9. 9 10. 9 $ pdksh-5.2.14 lineno 1. 1 3. 2 4. 2 6. 6 7. 0 8. $LINENO 9. 9 10. 9 $ sed '=' <lineno | > sed ' > N > s,$,-, > : loop > s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3, > t loop > s,-$,, > s,^[0-9]*\n,, > ' | > sh 1. 1 3. 3 4. 4 6. 6 7. 7 8. 8 9. 9 10. 10 |
NULLCMD
zsh
executes
`$NULLCMD >foo'. The Bourne shell considers NULLCMD
to be
`:', while zsh
, even in Bourne shell compatibility mode,
sets NULLCMD
to `cat'. If you forgot to set NULLCMD
,
your script might be suspended waiting for data on its standard input.
ENV
MAIL
MAILPATH
PS1
PS2
PS4
ksh
) gets confused about
whether it is interactive, which means that (for example) a PS1
with a side effect can unexpectedly modify `$?'. To work around
this bug, Autoconf-generated scripts do something like this:
(unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' |
PWD
cd
and
pwd
must update the PWD
environment variable to point
to the logical path to the current directory, but traditional shells
do not support this. This can cause confusion if one shell instance
maintains PWD
but a subsidiary and different shell does not know
about PWD
and executes cd
; in this case PWD
will
point to the wrong directory. Use ``pwd`' rather than
`$PWD'.
status
zsh
(at least 3.1.6),
hence read-only. Do not use it.
PATH_SEPARATOR
configure
will detect the appropriate path
separator for the build system and set the PATH_SEPARATOR
output
variable accordingly.
On DJGPP systems, the PATH_SEPARATOR
environment variable can be
set to either `:' or `;' to control the path separator
bash
uses to set up certain environment variables (such as
PATH
). Since this only works inside bash
, you want
configure
to detect the regular DOS path separator
(`;'), so it can be safely substituted in files that may not support
`;' as path separator. So it is recommended to either unset this
variable or set it to `;'.
RANDOM
RANDOM
, a variable that returns a different
integer each time it is used. Most of the time, its value does not
change when it is not used, but on IRIX 6.5 the value changes all
the time. This can be observed by using set
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |