![Bash가 stdout 및 stderr을 파일 설명자 3으로 리디렉션하는 `&>&3`을 허용하지 않는 이유는 무엇입니까?](https://linux55.com/image/27305/Bash%EA%B0%80%20stdout%20%EB%B0%8F%20stderr%EC%9D%84%20%ED%8C%8C%EC%9D%BC%20%EC%84%A4%EB%AA%85%EC%9E%90%203%EC%9C%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EB%8A%94%20%60%26amp%3B%26gt%3B%26amp%3B3%60%EC%9D%84%20%ED%97%88%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
foobar
프롤로그, 기능 및 호출을 제공하십시오.
exec 3>/dev/null
function foobar { echo foo; echo bar >&2; }
foobar >/dev/null
foobar 2>/dev/null
foobar &>/dev/null
foobar &>&3
Bash가 마지막 간단한 명령을 실행하지 않는 이유는 무엇입니까? 대조적으로, Bash가 종료되면:
-bash: syntax error near unexpected token `&'
답변1
운영자가 없기 때문이죠 &>&
.
&> word
stdout과 stderr을 로 리디렉션하는 연산자가 있습니다 word
.
[n]>& word
fd에서 fd를 복사 하는 연산자가 있습니다 n
(기본값). 특별한 경우로, 비어 있고 숫자가 아닌 경우 stdout 및 stderr은 로 리디렉션됩니다.1
word
n
word
word
하지만 그게 다야. 파일 설명자에는 연산자와 결합할 수 있는 특별한 구문이 없습니다. 피연산자를 파일 설명자나 파일 이름으로 해석할 수 있는 연산자만 있습니다. 그리고 &>&
stdout과 stderr을 모두 리디렉션하고 올바른 피연산자를 파일 설명자로 해석하는 연산자 는 없습니다 .
&n
요약: 파일 설명자에는 특별한 구문이 없습니다. &
피연산자가 아닌 연산자 에 속합니다 . 운영자가 없습니다 &>&
.
답변2
왜 그럴까요? "... &>file"은 "... >file 2>&1"의 문법적 설탕일 뿐입니다. 그게 다야. 설명자 2가 3(/dev/null)이 가리키는 위치를 가리키도록 하려면 "... 2>&3"을 사용해야 합니다.