stdin/stdoutを閉じずに名前付きファイル記述子を閉じる方法は?

stdin/stdoutを閉じずに名前付きファイル記述子を閉じる方法は?
exec {ec}< <(echo "puts 'hello'") && sudo ruby /proc/$$/fd/${ec}

一度閉じたら

exec <&"${ec}"-

シェルが終了します。

別のケースでは、次のファイル記述子を作成します。

exec {gr}> >(/usr/bin/grep 'hello')

その後、電源を切り、exec >&${gr}-このような単純なコマンドを実行すると、ls何も印刷されません。

私はそれを行うことls >&2ができ、確かに何かを示していますが、明らかにstdoutは今MIAです。


私はこれらのファイルディスクリプタビジネスがどのように機能するかをまだ学んでおり、いくつかのガイドラインが必要です。ありがとうございます。

ベストアンサー1

Bashのマニュアルによると:

値は次のようになる>&-か、<&-前のものです。{varname}変数名閉じるファイル記述子を定義します。

だからexec {fd}>&-(または{fd}<&-)を閉じます。

$ exec {fd}>foo.out
$ echo "$fd"
10
$ echo hi >&"$fd"             # works
$ exec {fd}>&-                # close it
$ echo ho >&"$fd"             # doesn't work any more
bash: "$fd": Bad file descriptor
$ cat foo.out
hi     

exec <&"${ec}"-名前付きfdを$ecstdinに移動します(stdinをfdのコピーにして$ecからfdを閉じます$ec)。シェルは標準入力をプロセス置換に接続し、そこから入力を読み続けます。しかし、rubyすべてを読み、パイプがEOFを提供し、シェルを終了する可能性があります。

同様に、stdout をexec >&${gr}-(end) に保存された fd にリダイレクトします。たとえば、fromの追加の一般出力はプロセスの置き換えとに移動するため、目に見える出力は生成されません。$gr$grlsgreplsecho hello

通常どおり数字を含めることができるので、$gr噴射を避けるためにここに引用する必要があります。IFSだから書くのが最善です exec >&"${gr}"-

変更したいfd番号がリダイレクトの最初に表示され、デフォルトは0の場合はstdin()<、の場合はstdout(1)です>

おすすめ記事