Bashで 'exec {fd} </ dev / watchdog'は何をしますか


28

それはリテラルで{fd}あり、プレースホルダーではありません。これを行うスクリプトがありますが、ソースは何も持たず、他のどこでも{fd}を参照しません。これは有効なbashですか?

exec {fd}</dev/watchdog

回答:


34

ファイル記述子を選択し、それが利用可能であることを期待するのではなく:

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

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

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

(1)どこかで読んだことを思い出し、(2)試しただけだからです(そしてうまくいきます)。しかし、どこにも文書化されていませんでした。(もちろん、回答を投稿する前に検索するのに10分もかかりませんでした。)文書化されている場所への参照を提供できますか?
スコット

2
セクションの2番目の段落のマニュアルページを参照してくださいREDIRECTIONS。明確な例を示していないため、実際に飛び出すことはありません。
-chepner

あなたは正しい、私は男のバッシュでそれを見逃したが、それはあなたが言ったところにある。任意の単語は、だけでなく、FD中括弧で動作することに注目し、しなければならない、それはFD> = 10割り当てられていること
グレッグ・レーベンタール

3
@Scottは、bashだけでなく、bash 4.1以降でのみ使用できます(したがって、MacOSでまだ使用されている3.2リリースでは使用できません)。
チャールズダフィー

2
ただし/dev/watchdog、Mac OS Xにも@CharlesDuffy は存在しません。Linux固有のデバイスです。
夕暮れwuff

11

フォーム:

{var}<filename

シェルをファイルfilenameを開いて読み取り、ファイル記述子番号を変数に保存しましたvar{var}リダイレクト演算子とリダイレクト演算子の間にスペースを入れることはできません。また、ファイル記述子番号はより大きいか等しくなり10ます。

この機能はksh(2006年のバージョンksh93r から)オリジナルbashでありbash-4.1-alpha、2010年からかなり後にコピーされました。zshまた、2007年よりも早く変更さbashzsh 4.3.4ました。


2

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

ファイル記述子番号が前に付く場合がある各リダイレクトは、代わりに{ varname } という形式の単語が前に付く場合があります。この場合、以外の各リダイレクト操作者>&-<&-、シェルが10よりもファイルディスクリプタ大きくを割り当てると{に割り当てVARNAME }。場合>&-又は<&-{が先行するVARNAME }の値VARNAMEが近いファイル記述子を定義します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.