zsh
マニュアルページには、次のような(例えば)動作を正確に説明しているものは何も見つかりません。
exec 3> /tmp/foo
私が見つけることができる適切なドキュメントはすべて、の後に「単純なコマンド」が続くexec
形式を参照しています。(例:exec
man zshbuiltins
、 そしてman zshmisc
(このexec FD>
形式については、man zshmisc
ただし、この文章では、この形式は他の場所で完全に適切に文書化されていると想定されているように見えます。
私は、
man zshall | grep -P '\bexec\b'
...しかし、どれも私が探していたものではありません。
不足しているドキュメントの代わりとなる良いものをご存知の方はいらっしゃいますか?
PS: 私にとって「ドキュメントが不足している」ように見えることに対する考えられる説明は、次のようなフォームexec 3> /tmp/foo
が実際にはフォーム「exec
簡単なコマンドしかし、もしそうだとしたら、(1) たとえば が3> /tmp/foo
単純なコマンドである理由 (この「単純なコマンド」をコマンド ラインで実行すると、 を押すまでハングするだけです)、(2) スクリプト内の のようなものが評価された後に のようなコードが実行されるのに、たとえば のようなものが評価された後^C
に のようなコードが実行されない理由を説明するドキュメントを見つけたいと思います。exec 3> /tmp/foo
exec date
答え1
コマンドの有無の意味exec
は無関係です。組み込み名がオーバーロードされているのは、1 つの意味がコマンドありでは意味をなさず、もう 1 つの意味がコマンドなしでは意味をなさないためだと思います。そのため、この方法にすると、別のコマンドに使用できない新しい名前を作成する必要がなくなります。
のマニュアル状態:
もし指示省略されているがリダイレクトが指定されている場合は、リダイレクトは現在のシェルで有効になります。
これは、exec 3> /tmp/foo
実行中のシェル プロセスでファイル記述子 3 が指すものを変更することを意味します。 のようなシェル スニペットは、/bin/somecommand 3>/tmp/foo
次のことを意味します。
- サブプロセスを作成します。
/tmp/foo
サブプロセス内のファイル記述子 3 を書き込み用に開きます。/bin/somecommand
サブプロセスでファイルを実行します。
exec 3>/tmp/foo
ステップ 3 のみを実行し、プロセスについては何も行いません。
の後exec 3>/tmp/foo
、シェルとそのサブプロセスからのファイル記述子 3 への後続のすべてのアクセスは/tmp/foo
、他のリダイレクトと同様に に行きます。たとえば、ファイル記述子 3 に何も接続されていないターミナルで次のスクリプトを実行するとします。
echo hello # prints to the terminal
echo nope >&3 # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello # writes to /tmp/out
echo howdy >&3 # writes to /tmp/three
echo wibble >&3 # writes a second line to /tmp/three