Bash 출력 캡처 구문의 차이점은 무엇입니까?

Bash 출력 캡처 구문의 차이점은 무엇입니까?

나는 보통 사용한다

./aaa.sh 2>&1 | tee -a log

그러나 더 간단해 보이는 새로운 명령을 찾았습니다.

./aaa.sh &> log

그렇다면 두 번째 경우에는 무엇을 포기해야 할까요?

답변1

사과와 오렌지. 하지만 먼저...

2>&1vs에 관한 한 &>둘 다 지휘자 역할을 합니다.표준 에러같은 곳으로표준 출력지시를 받고 있습니다.

그러나 두 번째 것은 POSIX와 호환되지 않고 이를 사용하는 스크립트는 이를 지원하는 셸에서만 작동하기 때문에 이식성을 포기하게 됩니다.

Bash 매뉴얼 페이지에 설명된 대로 "의미상 동일"합니다...

표준 출력과 표준 오류를 리디렉션하는 데는 두 가지 형식이 있습니다.

      &>word    and
      >&word

두 가지 형식 중 첫 번째 형식이 선호됩니다. 이는 의미상 다음과 동일합니다.

      >word 2>&1

두 번째 형식을 사용할 때 단어는 숫자나 -로 확장될 수 없습니다. 그렇다면 호환성 이유로 인해 다른 리디렉션 연산자가 적용됩니다(아래 파일 설명자 복사 참조).

그러나 해야 할 일이 더 있습니다. 또한 tee첫 번째 버전에 추가 기능을 추가하는 명령을 사용했습니다 . 그것은 걸릴 것이다표준 입력입력하고 두 개의 다른 장소로 이동하십시오.표준 출력(이 명령을 대화식으로 실행하는 경우 일반적으로 화면/터미널) 및 데이터가 포함된 지정된 파일추가의그것에( -a덮어쓰지 않고 추가한다고 말함).

이를 결합한 두 번째 버전과 비교해 보세요.표준 출력그리고표준 에러파일이 덮어쓰기 log되어 화면/터미널에 표시되지 않습니다.

결론: 처음에 언급했듯이 실제로는 서로 다른 두 명령이지만 동등성의 개념을 확장하면일반적으로 말하면첫 번째 버전은 휴대성이 뛰어났기 때문에 우수했습니다.그리고aaa.sh파일에 저장되어 있어도 출력을 볼 수 있습니다. 물론, 보고 싶지 않거나 이전 파일 내용을 삭제하고 싶다면 그것은 다른 문제입니다. 사과와 오렌지.

답변2

두가지:

  • tee입력을 지정된 파일로 인쇄합니다.그리고실제로 터미널로 표준 출력됩니다. >또는 와 같은 직접 리디렉션을 &>사용하면 파일이 기록되기만 합니다.

  • tee -a 추가지정된 파일의 경우 >또는 &>리디렉션이 해당 파일을 덮어씁니다. 리디렉션을 사용 >>하거나 추가 &>>합니다 >> file 2>&1.

관련 정보