이 표현에 약간 혼란 스러웠습니다.
gcc -c -g program.c >& compiler.txt
&>filename
stdout과 stderr을 모두 file로 리디렉션한다는 것을 알고 있습니다 filename
. 그러나이 경우 앰퍼샌드는보다 큼 기호 뒤에 있습니다. M>&N
, where M
and N
are file descriptors 형식처럼 보입니다 .
위의 스 니펫에서 does M=1
및 N='compiler.txt'
? 이것이 정확히 어떻게 다른지 :
gcc -c -g program.c > compiler.txt (ampersand removed)
내 이해는 각 열린 파일이 2보다 큰 파일 설명자와 연관되어 있다는 것입니다. 이것이 맞습니까?
그렇다면 파일 이름이 리디렉션 대상인 파일 설명자와 상호 교환 될 수 있습니까?
답변
이것은 &>
. bash 맨 페이지에서 :
표준 출력 및 표준 오류 리디렉션이 구조를 사용하면 표준 출력 (파일 설명자 1)과 표준 오류 출력 (파일 설명자 2) 모두 이름이 단어 확장 인 파일로 리디렉션 될 수 있습니다.
There are two formats for redirecting standard output and standard error: &>word and >&word Of the two forms, the first is preferred. This is semantically equiva- lent to >word 2>&1
답변
&>
vs >&
: 선호하는 버전은 &>
(clobber)
에 관해서:
&>
>&
둘 다 파일을 방해합니다 > file
. STDIN 전용의 경우 처럼 파일을 쓰기 전에 0 바이트로 자릅니다 .
그러나 의 bash
수동 리디렉션 섹션 이 추가한다 :
두 가지 형태 중 첫 번째가 선호됩니다. 이것은 의미 적으로 다음과 같습니다.
>word 2>&1
두 번째 형식을 사용할 때 단어 는 숫자 또는
-
. 그렇다면 호환성을 위해 다른 리디렉션 연산자가 적용됩니다 (아래의 파일 설명자 복제 참조).
(참고 : 에 zsh
모두 동일합니다 .)
다음 &>
과 같은 이유로 첫 번째 ( ) 형식으로 손가락 메모리를 얻는 것이 좋습니다 .
지원 되지 않는 용도 &>>
로 사용 (추가)>>&
bash
추가 양식은 하나뿐입니다.
표준 출력 및 표준 오류를 추가하는 형식은 다음과 같습니다.
&>>word
이것은 의미 적으로 다음과 같습니다.
>>word 2>&1
(아래의 파일 설명자 복제 참조).
노트 :
- 를 추가하는 방법이 한 가지뿐이므로 위 섹션에서
&>
over>&
를 사용하는 것이 좋습니다bash
. zsh
&>>
및>>&
양식을 모두 허용합니다 .