실제로 두 가지 질문이 있습니다.
>&
쉘 스크립트에서 이는 무엇을 의미합니까/usr/bin/x_app >& /tmp/blog.txt
?&
stdout/error로 만들려면 끝에 숫자가 있어야 하지 않나요 ?내가 아는 한 이는
>
덮어쓰기 및>>
추가이므로2>&1
stdout을 stderr로 대체해야 하지만 대신 stdout과 stderr을 함께 사용하는 것을 의미합니다. 왜 우리는 그것을 사용하지 않습니까>>
? 내 말은, "추가"가 "함께 합치다"는 의미는 아니지만 "덮어쓰기"보다는 그것에 더 가깝다는 뜻이죠, 그렇죠?
답변1
>& file
stdout 및 stderr을 로 리디렉션하는 csh 연산자(70년대 후반)입니다 file
. Bourne 쉘(역시 70년대 후반)은 fd 1을 로 리디렉션한 다음 fd 2를 동일한 주소로 리디렉션하는 > file 2>&1
, 또는 와 같습니다.2> file >&1
file
파일 설명 열기혹은 그 반대로도.
zsh
bash
Korn1 쉘(Bourne 쉘 확장)과 csh의 기능을 채택하고 >&
Bourne/Korn 연산자 외에 csh 연산자를 지원하는 두 개의 쉘(1980년대 후반, 1990년대 초반)이 있습니다 .[i]>&j
하지만 둘은 갈등을 겪는다.
cmd >& "$var"
$var
숫자가 포함되면 결국 Bourne/Korn 리디렉션이 수행되고, 그렇지 않으면 csh 리디렉션이 수행됩니다.
실제로 cmd > "$var2" 2>&1
이러한 셸에서는 csh 연산자를 사용하지 않고 Bourne 구문( )을 사용하여 놀라움을 피하는 것이 가장 좋습니다.
csh 는 처음에는 bash
지원되지 않지만 >&
동일한 &>
기능이 지원됩니다. 이는 Bourne 구문과도 충돌합니다. Bourne 쉘에서 병렬로 실행 cmd &> file
합니다 cmd
. 호환성을 위해 후자에 대한 지원도 추가되었습니다 .> file
zsh
&>
bash
다양한 쉘에서 다양한 구문을 찾을 수 있습니다. rc
(1980년대 후반) 및 파생어( , ) 에서는 es
Bourne 구문이 작성되었습니다 akanga
(그리고 파이프의 양쪽 끝에서 fd를 지정하는 것이 더 쉬워졌습니다: (fd 3의 fd 3을 via 파이프의 fd 4에 연결). 이것이 Bourne의 구문입니다. 구문을 작성해야 합니다).2>&1
>[2=1]
cmd1 |[3=4] cmd2
cmd1
cmd2
{ cmd1 3>&1 >&5 5>&- | 4<&0 <&6 6<&- cmd2; } 5>&1 6<&0
fish
다양한 변형이 있는 주택 (2000년대 중반)I/O 리디렉션 구문 Bourne 쉘에서.
1 Korn 셸(1980년대 초반)은 Bourne 셸을 기반으로 하지만 별칭, 물결표 확장, 중괄호 확장 등 csh의 기능도 차용했습니다.