次: Limitations of Builtins, 前: Parentheses, 上: Portable Shell
シェルの動作に深く影響するため,使用すべきではないシェル変数もあります. シェルからまともな動作に戻るため,unsetすべき変数もありますが, unsetは移植性が無く(see Limitations of Builtins),代替値が 必要になります.これらの変数を以下にリストアップします.
CDPATHcdが相対的なファイル名で呼び
出されるときに検索するディレクトリのリストを設定します.POSIX
1003.1-2001では,CDPATHで空ではないディレクトリ名が正しく使用され
ている場合,cdは絶対的なファイル名を結果として出力することになっ
ています.残念ながらこの出力では,absがパスを二回受けとるので,
`abs=`cd src && pwd`'のような慣用句が駄目になります.また,多くのシェ
ルは,この部分のPOSIXに準拠していません.例えば,zsh
は,.以外のディレクトリ名がCDPATHで選択されている場合以外,
結果を出力しません.
実際,この問題があるシェルはunsetもサポートしているので,以下 のようにしてその問題を回避することが可能です.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
Autoconfが生成したスクリプトは自動的にCDPATHをunsetするので,これ
らのスクリプトのこの問題を心配する必要はありません.
IFSIFSの最初の文字をバックスラッシュに設定しないでください.実際,
`"$@"'で要素を加えるときは,Bourneシェルは最初の文字(バックスラッ
シュ)を使用し,そして,バックスラッシュエスケープをもう一度解釈する(!)
シェルもあり,そのため,バックスペースとその他の奇妙な文字で終ることが可
能になっています.
(splitを実行していないとき,標準的なコードの)IFSの適切な値は,
`<SPC><TAB><RET>'です.`@*'の引数を連結するために
使用するので,最初の文字は特に重要です.
LANGLC_ALLLC_COLLATELC_CTYPELC_MESSAGESLC_MONETARYLC_NUMERICLC_TIMELANGUAGELC_ADDRESSLC_IDENTIFICATIONLC_MEASUREMENTLC_NAMELC_PAPERLC_TELEPHONELINENOLINENOで提供しています.
その値は,現在のコマンドの最初の行番号です.Autoconfは近代的なシェルで
configureの実行を試みます.利用可能なそのようなシェルが無い場
合,それぞれの文字列$LINENO(英数文字が続かない)をインスタンスを行
番号で置換するために,Sedに前もって渡す手法を用いて,LINENOの実装
を試みます.
実行時の動作が異なるので,evalでLINENOに依存すべきでは
ありません.また,Sedに前もって渡す手法を用いる可能性は,引用符で囲んで
いるとき,ヒアドキュメントのとき,または行を跨るほど長いコマンドのとき,
$LINENOに依存すべきではないことを意味しています.ただし,サブシェ
ルは問題ありません.以下の例では,一行目,六行目,そして九行目は移植性が
ありますが,それ以外のLINENOのインスタンスは移植性がありません.
$ 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
NULLCMDNULLCMDが`:'だと考えますが,
zshはBourneシェル互換モードでも,NULLCMDを`cat'に
設定します.NULLCMDの設定を忘れた場合,スクリプトは標準入力からの
データ待ちのためサスペンド状態になるかもしれません.
ENVMAILMAILPATHPS1PS2PS4 (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
PS1='$ '
PS2='> '
PS4='+ '
PWDstatuszsh(少なくとも3.1.6)での`$?'へのエイリアスで,そ
のため読み出し専用になっています.使用しないでください.
PATH_SEPARATORPATH_SEPARATOR出力変数をそれに応じて設定し
ます.
DJGPPシステムでは,パス分離子を制御するために,PATH_SEPARATOR環境
変数をbashが(PATHのような)特定の環境変数を設定するため
に使用している`:'または`;'のいずれかに設定することが可能です.
これはbash内部でのみ動作するので,パス分離子として`;'がサ
ポートされていないファイル内で代入する方が安全だろうという理由から,
configureで標準的なDOSのパス分離子(`;')を検出し
たいことでしょう.そのため,この変数をunsetするか,`;'に設定してく
ださい.
RANDOMRANDOMを提供するシェルも多くあり,その変数は使用するたびに異なる
整数を返します.その値が使用されていないとき,変更さることはほとんどあり
ませんが,irixq 6.5では毎回値が変更されます.これは,set
を使用して監視すべきです.