파일 설명자 닫기, >&- 및 <&-

파일 설명자 닫기, >&- 및 <&-

내가 읽고 있는 bash 튜토리얼에서는 읽기 위해 파일 설명자를 열면 다음과 같이 말합니다.

exec 3< echolist

그럼 이렇게 닫아야 하는데,

exec 3<&-

그러나 쓰기 위해 파일 설명자를 연 경우 다음과 같이 닫아야 합니다.

exec 3>&-

그러나 인터넷을 보면 사람들이 다음과 같은 방법으로 파일을 열고 닫는 것을 볼 수 있습니다.

exec 3>&- 

노트:튜토리얼에 따르면 언제 사용해야 합니까 exec 3<&1?

exec n>&-그래서 내 질문은 n이 파일 설명자 번호인 곳에서 모든 파일 설명자를 닫는 것이 가능합니까? 읽기, 쓰기 또는 둘 다 가능합니까?

답변1

<&-파일 설명자를 사용하고 닫을 수 >&-있으며 bash두 구문 모두 동일하게 구문 분석됩니다.

파일에서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

내가 아는 한, exec 3>&-exec 3<&-는 동일하며 파일이 열린 방법에 관계없이 모든 파일 설명자에서 사용할 수 있습니다. POSIX 정의의 섹션 2.7.6 및 2.7.5에 따르면쉘 명령 언어:

2.7.5 입력 파일 설명자 복사

리디렉션 연산자:

[n]<& 단어

[...자르다...]

단어가 "-"로 평가되면 파일 설명자 n 또는 표준 입력(n이 지정되지 않은 경우)을 닫아야 합니다. 열리지 않은 파일 설명자를 닫으려고 시도하는 것은 오류로 간주되어서는 안 됩니다. 단어가 다른 것으로 평가되면 동작이 지정되지 않습니다.

2.7.6 출력 파일 설명자 복사

리디렉션 연산자:

[n]>단어(&W)

[...자르다...]

단어가 "-"로 평가되면 파일 설명자 n 또는 표준 출력(n이 지정되지 않은 경우)이 닫힙니다. 열리지 않은 파일 설명자를 닫으려고 시도하는 것은 오류로 간주되어서는 안 됩니다. 단어가 다른 것으로 평가되면 동작이 지정되지 않습니다.

두 파일 모두 파일 설명자 n이 처음 열리는 방법에 대해 아무것도 지정하지 않습니다. 이는 다음 사실과 일치합니다.닫기(2)파일을 어떻게 여는지는 상관하지 않습니다.

다음을 빠르게 추적하세요.

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

이와 대조적으로:

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

두 경우 모두 Bash가 정확히 동일한 작업을 수행함을 보여주세요.

다소 흥미로운 사실 ​​두 가지

  • 이것파일 설명자 복사에 대한 bash 매뉴얼 페이지[n]>&-파일 설명자를 닫는 것에 대한 언급이 없습니다 .
  • 리디렉션을 처리하는 Bash 코드(redir.c)에서 다음을 찾을 수 있습니다.

    738      /* XXX - what to do with [N]<&$w- where w is unset or null?  ksh93
    739               closes N. */
    

답변3

cuonglm은 '<>' FD를 닫는 예를 이해합니다.

이것은 고급 Bash 스크립팅 가이드에서 인용되었습니다.http://tldp.org/LDP/abs/html/io-redirection.html

[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.

관련 정보