web-dev-qa-db-ja.com

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

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

exec 3< echolist

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

exec 3<&-

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

exec 3>&-

しかし、インターネットを見ると、人々がファイルを開いてからこれを閉じるのを目にしています。

exec 3>&- 

注:チュートリアルによると、exec 3<&1

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

50
Jason

<&->&-の両方を使用してファイル記述子を閉じることができます。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);
51
cuonglm

私が見る限り、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つの軽度に興味深い事実

16
Steven D

Cuonglmが「<>」FDを閉じることを理解するための例。

これは 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.
7
DMW