次: File System Conventions, 前: Here-Documents, 上: 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を参照してください.