나는 보통 사용한다
./aaa.sh 2>&1 | tee -a log
그러나 더 간단해 보이는 새로운 명령을 찾았습니다.
./aaa.sh &> log
그렇다면 두 번째 경우에는 무엇을 포기해야 할까요?
답변1
사과와 오렌지. 하지만 먼저...
2>&1
vs에 관한 한 &>
둘 다 지휘자 역할을 합니다.표준 에러같은 곳으로표준 출력지시를 받고 있습니다.
그러나 두 번째 것은 POSIX와 호환되지 않고 이를 사용하는 스크립트는 이를 지원하는 셸에서만 작동하기 때문에 이식성을 포기하게 됩니다.
Bash 매뉴얼 페이지에 설명된 대로 "의미상 동일"합니다...
표준 출력과 표준 오류를 리디렉션하는 데는 두 가지 형식이 있습니다.
&>word and >&word
두 가지 형식 중 첫 번째 형식이 선호됩니다. 이는 의미상 다음과 동일합니다.
>word 2>&1
두 번째 형식을 사용할 때 단어는 숫자나 -로 확장될 수 없습니다. 그렇다면 호환성 이유로 인해 다른 리디렉션 연산자가 적용됩니다(아래 파일 설명자 복사 참조).
그러나 해야 할 일이 더 있습니다. 또한 tee
첫 번째 버전에 추가 기능을 추가하는 명령을 사용했습니다 . 그것은 걸릴 것이다표준 입력입력하고 두 개의 다른 장소로 이동하십시오.표준 출력(이 명령을 대화식으로 실행하는 경우 일반적으로 화면/터미널) 및 데이터가 포함된 지정된 파일추가의그것에( -a
덮어쓰지 않고 추가한다고 말함).
이를 결합한 두 번째 버전과 비교해 보세요.표준 출력그리고표준 에러파일이 덮어쓰기 log
되어 화면/터미널에 표시되지 않습니다.
결론: 처음에 언급했듯이 실제로는 서로 다른 두 명령이지만 동등성의 개념을 확장하면일반적으로 말하면첫 번째 버전은 휴대성이 뛰어났기 때문에 우수했습니다.그리고aaa.sh
파일에 저장되어 있어도 출력을 볼 수 있습니다. 물론, 보고 싶지 않거나 이전 파일 내용을 삭제하고 싶다면 그것은 다른 문제입니다. 사과와 오렌지.
답변2
두가지:
tee
입력을 지정된 파일로 인쇄합니다.그리고실제로 터미널로 표준 출력됩니다.>
또는 와 같은 직접 리디렉션을&>
사용하면 파일이 기록되기만 합니다.tee -a
추가지정된 파일의 경우>
또는&>
리디렉션이 해당 파일을 덮어씁니다. 리디렉션을 사용>>
하거나 추가&>>
합니다>> file 2>&1
.