Next: , Previous: Here-Documents, Up: Portable Shell


10.3 ファイルディスクリプタ

システムによっては,明らかに不可解なのですが,特殊な目的で使用しているた め,ファイルディスクリプタには使用すべきではないものもあります.

     
     
     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を参照してください.