Next: File System Conventions, Previous: Here-Documents, Up: Portable Shell
システムによっては,明らかに不可解なのですが,特殊な目的で使用しているた め,ファイルディスクリプタには使用すべきではないものもあります.
3 — それを‘/dev/tty’として開くシステムもあります.
4 — Kubota Titanで使用されています.
Ultrixでは異常終了だと告げられるので,同じファイルディスクリプタに複数回 同じファイルをリダイレクトしないでください.
ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995 UWS V4.4 (Rev. 11) $ eval 'echo matter >fullness' >void illegal io $ eval '(echo matter >fullness)' >void illegal io $ (eval '(echo matter >fullness)') >void Ambiguous output redirect.
それぞれの場合で,期待される結果はもちろん,‘matter’を含んでいる fullnessと,空のvoidです.
コマンドの代入のリダイレクトを標準エラー出力にしないでください.それは, コマンドの代入の内部で行なう必要があります.エラーメッセージを削 除することを期待して‘: `cd /zorglub` 2>/dev/null’を実行しているとき, ‘: `cd /zorglub 2>/dev/null`’は正しく動作します.
(AshでもBashでもない)Zshが割当を可能にすることに注意する価値はあります. ‘foo=`cd /zorglub` 2>/dev/null’.
ほとんどのシェルでは,(Bash,Zsh,Ashを含め)全てではありませんが,標準エ ラー出力を,サブシェルに対しても追跡しています.内部コマンドの標準エラー 出力を得る目的がある場合,これでは結果が望まない内容になるかもしれません.
$ ash -x -c '(eval "echo foo >&2") 2>stderr' $ cat stderr + eval echo foo >&2 + echo foo foo $ bash -x -c '(eval "echo foo >&2") 2>stderr' $ cat stderr + eval 'echo foo >&2' ++ echo foo foo $ zsh -x -c '(eval "echo foo >&2") 2>stderr' # Traces on startup files deleted here. $ cat stderr +zsh:1> eval echo foo >&2 +zsh:1> echo foo foo
様々なレベルの詳細が分かるでしょう...
一つの回避方法は,興味がない行をgrepで削除することで,良い行は削除しない ことを期待しつつ...
‘exec >foo; mv foo bar’のように,開いているファイルの移動/削除の試 みはしないようにしてください.mvの詳細は,Limitations of Builtinsを参照してください.