파일 디스크립터 닫기> &-vs <&-


49

내가 읽고있는 bash 튜토리얼에서 읽을 파일 설명자를 열면

exec 3< echolist

그런 다음 이렇게 닫아야합니다.

exec 3<&-

그러나 쓰기 위해 파일 디스크립터를 열면 다음과 같이 닫아야합니다.

exec 3>&-

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

exec 3>&- 

참고 : 튜토리얼에 따르면을 사용해야합니다 exec 3<&1.

내 질문은 exec n>&-n이 파일 설명자 번호 인 곳을 통해 모든 파일 설명자를 닫을 수 있습니까? 읽기, 쓰기 또는 둘 다로 열 었는지 여부에 관계없이?


21
유일한 차이점 >&-<&-(지정되지 않은 기본 전략 중입니다 >&-입니다 1>&-동안이 <&-됩니다 0<&-). 제공되지 않은 경우 x>&yx<&y제외하고 는 동일합니다 x.
Stéphane Chazelas 17:01에

답변:


48

당신은 모두를 사용하여 파일 디스크립터를 닫을 수 <&->&-, bash같은과 같은 두 가지 구문을 분석 할 것이다.

소스 코드의 파일 y.tab.c 에서 bash:

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
무슨 말인지 알 수 없어 예를 들어주세요
./

1
나는 그것이 내가 의미 한 바라고 생각하지 않습니다. 3> &-및 3 <&-를 사용하여 읽기 쓰기 파일 디스크립터를 닫을 수 있습니다.
CMCDragonkai

15

지금까지 내가 볼, 수 exec 3>&-exec 3<&-관계없이 연 방법입니다 같은 및 파일 기술자에서 사용할 수 있습니다. 섹션 2.7.6과의 POSIX 정의의 2.7.5에 따르면 셸 명령 언어 :

2.7.5 입력 파일 디스크립터 복제

리디렉션 연산자 :

[n] <& 단어

[...한조각...]

단어가 '-'로 평가되면 파일 설명자 n 또는 n이 지정되지 않은 경우 표준 입력이 닫힙니다. 열려 있지 않은 파일 디스크립터를 닫으려고 시도해도 오류가 아닙니다. 단어가 다른 것으로 평가되면 동작이 지정되지 않습니다.

2.7.6 출력 파일 디스크립터 복제

리디렉션 연산자 :

[n]> & 단어

[...한조각...]

단어가 '-'로 평가되면 파일 설명자 n 또는 n이 지정되지 않은 경우 표준 출력이 닫힙니다. 열려 있지 않은 파일 디스크립터를 닫으려고 시도해도 오류가 아닙니다. 단어가 다른 것으로 평가되면 동작이 지정되지 않습니다.

파일 디스크립터 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가 정확히 동일한 작업을 수행함을 보여줍니다.

두 가지 재미있는 사실


1
bash 매뉴얼 페이지는 링크를 인용하여 닫는 것을 언급했습니다 : 단어가 '-'로 평가되면 파일 설명자 n이 닫힙니다.
studog

@studog 소스를 확인해 주셔서 감사합니다! 나는 여기에서 일어난 것은 내가 배쉬 3 로컬 맨을보고하고, 폐쇄에 대한 구가의 설명은 생략 된 이전 배쉬 3 문서에서 배쉬 4. 위해이었다 온라인 설명서, 연결되었다 생각 [N]>&WORD: 자식을 .savannah.gnu.org / cgit / bash.git / tree / doc /…
Steven 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.