내가 읽고 있는 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.