리디렉션 3>&2와 3<&2가 다른가요?
차이점이 뭐야?
2
3>&2에서 입력이 열리지 않았기 때문에 오류가 발생해야 한다는 것인가요 ?
비교하다:
{ seq 20 1<&2; } 2>/dev/null
{ seq 20 1>&2; } 2>/dev/null
편집 : 답변
두 명령 모두 1과 2의 동일한 반복을 수행합니다. 출력:
$ strace -f -e trace=dup,dup2 -o o2 sh -c 'seq 20 1>&2'
두 명령은 동일합니다(PID 번호 제외).
답변1
dup2(2, 3)
아니요, 둘은 완전히 동일 합니다 . 쉘은 결국 3>&2
및 3<&2
. 그런 다음 fd는 3
결국 동일한 것을 가리키게 됩니다.파일 설명 열기fd2와 동일합니다. 모드/방향에는 영향을 미치지 않습니다.파일 설명 열기. 열린 파일 설명의 모드/방향을 변경할 수 없습니다.
x>&y
및 연산자는 x<&y
생략된 경우에만 다릅니다. (동일)이지만 (동일)입니다.x
>&y
1>&y
1<&y
<&y
0<&y
0>&y
답변2
하나는 출력을 얻기 위해 stderr을 리디렉션하고, 다른 하나는 입력을 얻기 위해 stderr을 리디렉션합니다.
읽기 및 쓰기를 위해 stderr을 열려면 다음을 사용할 수 있습니다.
2<>/dev/null
로그인한 경우 세 개의 파일 설명자가 모두 읽고 쓰기 위해 열립니다.
dup()
먼저 tty를 연 다음 두 번 호출하면 됩니다 .
주문하다
{ seq 20 1<&2; } 2>/dev/null
그리고
{ seq 20 1>&2; } 2>/dev/null
최종 리디렉션에서 쓸 수 있는 파일 설명자를 생성하므로 동일합니다.
전화하는 경우:
{ truss -o o seq 20 1<&2; } 2>/dev/null
쓰기 호출이 seq
성공한 것을 볼 수 있습니다. btw: 출력은 seq
/dev/null로 이동합니다.