존재하다이 스레드stdout
그리고 다른 스레드에서는 리디렉션 및 stderr
파일에 대한 다음 명령을 보았습니다 .
그것들은 모두 동등합니까? 그들 사이에 어떤 차이가 있나요?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
답변1
이제 태그를 지정했으므로 zsh
3개의 리디렉션이 모두 정확히 동일한 방식으로 작동한다는 점을 알려드리겠습니다. 두 개의 중복된 게시물(댓글에 있는 게시물과 게시물에 있는 게시물)을 읽었을 수 있듯이 둘 다 "로그 파일" 파일로 리디렉션 stderr
됩니다 stdout
(즉, 로그 파일에는 출력과 오류가 포함됩니다). ).
그러나 해당 동작은 현재 사용 중인 셸에 따라 크게 달라집니다.
bash
리디렉션하는 세 가지 방법 모두 동일한 방식으로 잘 작동합니다.zsh
하지만:
>&
또는에만 적용 됩니다 csh
.tcsh
[soum@server ~]$ ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$
ksh
2>&1
작품 에서만 .
$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1] 23039
$ 1 2 3 4 5 6 logfile test.sh
ls: cannot access ttr: No such file or directory
[1] + Done(2) ./test.sh &> logfile
싫어 ksh
. >&
방금 오류가 발생했지만 명령 &>
의 일부가 백그라운드에서 실행되어 로그 파일이 지워졌습니다(비어 있지 않은 경우).
답변2
&>
및 >&
준등가(클로버)
이것zsh
수동 리디렉션 섹션설명하다:
&>
>&
동등합니다.
> file
둘 다 파일을 손상시킵니다 . STDIN 전용 경우 처럼 파일에 쓰기 전에 0바이트로 자릅니다 .
하지만, 이것bash
수동 리디렉션 섹션추가됨:
두 가지 형식 중 첫 번째 형식이 선호됩니다. 이는 의미상 다음과 동일합니다.
>word 2>&1
두 번째 형태를 사용할 때,단어숫자나 로 확장할 수 없습니다
-
. 그렇다면 호환성 이유로 인해 다른 리디렉션 연산자가 적용됩니다(아래 파일 설명자 복사 참조).
따라서 표시할 때 zsh
누군가 스크립트를 작성하는 경우 첫 번째 형태로 손가락 기억을 가져오는 것이 좋은 습관일 수 있습니다 bash
.
>> logfile 2>&1
및 &>>
이에 상응하는 것(추가)
여기서는 logfile
덮어쓰는 대신 파일 끝에 쓰기가 열립니다. 즉, 추가 모드( O_APPEND
)입니다.
두 가지에 해당하는 것은 다음 과 같습니다 {ba,z}sh
.
command1 &>> logfile
존재하다 bash
:
추가 표준 출력 및 표준 오류의 형식은 다음과 같습니다.
&>>word
이는 의미상 다음과 동일합니다.
>>word 2>&1
(아래 파일 설명자 복사 참조)
(참고: 추가 방법이 하나뿐이므로 위 섹션에서는 over를 사용하는 것이 다시 권장됩니다 &>
.)>&
bash
zsh
&>>
사용 및 형식 모두 >>&
허용됩니다.