쉘 명령에서 >&는 무엇을 의미합니까?

쉘 명령에서 >&는 무엇을 의미합니까?

실제로 두 가지 질문이 있습니다.

  1. >&쉘 스크립트에서 이는 무엇을 의미합니까 /usr/bin/x_app >& /tmp/blog.txt? &stdout/error로 만들려면 끝에 숫자가 있어야 하지 않나요 ?

  2. 내가 아는 한 이는 >덮어쓰기 및 >>추가이므로 2>&1stdout을 stderr로 대체해야 하지만 대신 stdout과 stderr을 함께 사용하는 것을 의미합니다. 왜 우리는 그것을 사용하지 않습니까 >>? 내 말은, "추가"가 "함께 합치다"는 의미는 아니지만 "덮어쓰기"보다는 그것에 더 가깝다는 뜻이죠, 그렇죠?

답변1

>& filestdout 및 stderr을 로 리디렉션하는 csh 연산자(70년대 후반)입니다 file. Bourne 쉘(역시 70년대 후반)은 fd 1을 로 리디렉션한 다음 fd 2를 동일한 주소로 리디렉션하는 > file 2>&1, 또는 와 같습니다.2> file >&1file파일 설명 열기혹은 그 반대로도.

zshbashKorn1 쉘(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. 호환성을 위해 후자에 대한 지원도 추가되었습니다 .> filezsh&>bash

다양한 쉘에서 다양한 구문을 찾을 수 있습니다. rc(1980년대 후반) 및 파생어( , ) 에서는 esBourne 구문이 작성되었습니다 akanga(그리고 파이프의 양쪽 끝에서 fd를 지정하는 것이 더 쉬워졌습니다: (fd 3의 fd 3을 via 파이프의 fd 4에 연결). 이것이 Bourne의 구문입니다. 구문을 작성해야 합니다).2>&1>[2=1]cmd1 |[3=4] cmd2cmd1cmd2{ cmd1 3>&1 >&5 5>&- | 4<&0 <&6 6<&- cmd2; } 5>&1 6<&0

fish다양한 변형이 있는 주택 (2000년대 중반)I/O 리디렉션 구문 Bourne 쉘에서.


1 Korn 셸(1980년대 초반)은 Bourne 셸을 기반으로 하지만 별칭, 물결표 확장, 중괄호 확장 등 csh의 기능도 차용했습니다.

관련 정보