ファイル記述子を閉じる、>&-vs <&-


49

私が読んでいるbashチュートリアルでは、読み取りのためにファイル記述子を開くと、つまり

exec 3< echolist

次に、このように閉じなければなりません、

exec 3<&-

ただし、ファイル記述子を書き込み用に開く場合は、次のように閉じる必要があります。

exec 3>&-

しかし、私がインターネットで見ると、人々がファイルを開いて、これでファイルを閉じているのが見えます:

exec 3>&- 

注:チュートリアルに従って、を使用する必要がある場合exec 3<&1

だから私の質問は、exec n>&-nがファイル記述子番号である場合、すべてのファイル記述子を閉じることができますか?読み取り、書き込み、またはその両方で開かれたかどうかに関係なく?


21
唯一の違い>&-とは、<&-指定されていないデフォルトのFD(で>&-ある1>&-つつ<&-あります0<&-)。同じ場合x>&yは、x<&ywhen xが指定されていないことを除いて同じです。
ステファンシャゼル

回答:


48

あなたは両方を使用してファイルディスクリプタを閉じることができます<&-し、>&-bash同じように2つの構文を解析します。

ファイルからy.tab.cbashソースコード:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

2
これは、<>ファイル記述子でも使用できます。
CMCDragonkai

1
ことはできませんませんが、のようないかなるもの3>&-か、3<&-ディスクリプタをクローズするように見えます。
CMCDragonkai

1
その閉鎖<>は同じ方法で行うことができます。
CMCDragonkai

1
意味がわかりません。例を挙げてください
。/– cuonglm

1
私はそれが私が意図したことだとは思わない。3>&-および3 <&-を使用して、読み取り/書き込みファイル記述子を閉じることができます。
CMCDragonkai

15

私の知る限り見ることができるように、exec 3>&-exec 3<&-同じであり、関係なく、それが開かれたかの、いずれかのファイルディスクリプタで使用することができます。シェルコマンド言語の POSIX定義のセクション2.7.6および2.7.5によると:

2.7.5入力ファイル記述子の複製

リダイレクト演算子:

[n] <&word

[...をちょきちょきと切る...]

wordが '-'に評価される場合、ファイル記述子n、またはnが指定されていない場合は標準入力は閉じられます。開いていないファイル記述子を閉じようとしてもエラーにはなりません。wordが他の何かに評価される場合、動作は指定されていません。

2.7.6出力ファイル記述子の複製

リダイレクト演算子:

[n]>&word

[...をちょきちょきと切る...]

wordが「-」に評価される場合、ファイル記述子n、またはnが指定されていない場合は標準出力が閉じられます。開いていないファイル記述子を閉じようとしてもエラーにはなりません。wordが他の何かに評価される場合、動作は指定されていません。

どちらも、ファイル記述子nが最初に開かれた方法については何も指定しないことに注意してください。これは、close(2)がファイルを開いた方法を気にしないという事実と一致しています。

以下の簡単な痕跡:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

対これ:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

どちらの場合でも、Bashはまったく同じことを行うことを示しています。

2つのやや興味深い事実


1
bashのマニュアルページには、リンクを引用して閉じることについて言及されています:wordが '-'と評価される場合、ファイル記述子nは閉じられます。
ストーグ

@studogソースをチェックしてくれてありがとう!私は何をここで起こったことは、私はバッシュ3用のローカルのmanページを見て、その後、古いバッシュ3ドキュメントでバッシュ4のためだったオンラインドキュメントにリンクしていると思い、決算に関するフレーズがの記述から省略されました[N]>&WORDgitの.savannah.gnu.org / cgit / bash.git / tree / doc /…
スティーブンD

7

「<>」FDを閉じることに関するcuonglmの理解の例。

これは、http://tldp.org/LDP/abs/html/io-redirection.htmlの Advanced Bash-Scripting Guideから引用されています。

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.