web-dev-qa-db-ja.com

Bashで「exec {fd} </ dev / watchdog」が行うこと

それは文字通りです、{fd}はプレースホルダーではありません。これを実行するスクリプトがあり、何も読み込まず、他の場所で{fd}を参照しません。これは有効なbashですか?

exec {fd}</dev/watchdog

28
Gregg Leventhal

ファイル記述子を選択して、それが利用可能であることを期待する必要はありません。

exec 4< /dev/watchdog  # Was 4 in use? Who knows?

この表記は、シェルに現在使用されていないファイル記述子を選択し、その記述子で読み取るためにファイルを開いて、指定された変数(fd)に番号を割り当てるように要求します。

$ exec {fd}< /dev/watchdog
$ echo $fd
10
34
chepner

フォーム:

{var}<filename

シェルは、ファイル記述子番号を読み取って変数filenameに保存するためにファイルvarを開いた。 {var}とリダイレクト演算子の間にスペースはありません。ファイル記述子番号は10以上になります。

この機能は、kshから(2006年のバージョンksh93rから)オリジナルでした。bashは、2010年からbash-4.1-alphaで大幅にコピーしました。zshも、zsh 4.3.4からbashより早く変更を加えました。

11
cuonglm

これは リダイレクト のBashマニュアルセクションで説明されています。

ファイル記述子番号が前に置かれる可能性のある各リダイレクトの代わりに、{varname}という形式のWordが前に置かれる場合があります。この場合、>&-<&-を除く各リダイレクト演算子に対して、シェルは10より大きいファイル記述子を割り当て、それを{varname}。 >&-または<&-の前に{varname}が付いている場合、varnameの値は、閉じるファイル記述子を定義します。

2
Barmar