execの`exec FD>`形式について

execの`exec FD>`形式について

zshマニュアルページには、次のような(例えば)動作を正確に説明しているものは何も見つかりません。

exec 3> /tmp/foo

私が見つけることができる適切なドキュメントはすべて、の後に「単純なコマンド」が続くexec形式を参照しています。(例:execman 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/fooexec date

答え1

コマンドの有無の意味execは無関係です。組み込み名がオーバーロードされているのは、1 つの意味がコマンドありでは意味をなさず、もう 1 つの意味がコマンドなしでは意味をなさないためだと思います。そのため、この方法にすると、別のコマンドに使用できない新しい名前を作成する必要がなくなります。

マニュアル状態:

もし指示省略されているがリダイレクトが指定されている場合は、リダイレクトは現在のシェルで有効になります。

これは、exec 3> /tmp/foo実行中のシェル プロセスでファイル記述子 3 が指すものを変更することを意味します。 のようなシェル スニペットは、/bin/somecommand 3>/tmp/foo次のことを意味します。

  1. サブプロセスを作成します。
  2. /tmp/fooサブプロセス内のファイル記述子 3 を書き込み用に開きます。
  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

関連情報