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
値は次のようになる
>&-
か、<&-
前のものです。{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を$ec
stdinに移動します(stdinをfdのコピーにして$ec
からfdを閉じます$ec
)。シェルは標準入力をプロセス置換に接続し、そこから入力を読み続けます。しかし、ruby
すべてを読み、パイプがEOFを提供し、シェルを終了する可能性があります。
同様に、stdout をexec >&${gr}-
(end) に保存された fd にリダイレクトします。たとえば、fromの追加の一般出力はプロセスの置き換えとに移動するため、目に見える出力は生成されません。$gr
$gr
ls
grep
ls
echo hello
通常どおり数字を含めることができるので、$gr
噴射を避けるためにここに引用する必要があります。IFS
だから書くのが最善です exec >&"${gr}"-
。
変更したいfd番号がリダイレクトの最初に表示され、デフォルトは0
の場合はstdin()<
、の場合はstdout(1
)です>
。