2> &-, 2> / dev / null, | &, &> / dev / null과> / dev / null 2> & 1의 차이점


192

그냥 차이점을 찾고

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

와 휴대 성 non-Bourne shellstcsh, mksh


2
mksh는 &>GNU bash 호환성을 지원 하지만 구문 분석시 기존 POSIX 스크립트의 의미를 손상시킬 수 있으므로 mksh는 이미 POSIX 모드에서이를 비활성화하므로이 기능을 사용하지 않는 것이 좋습니다.
mirabilos

나는 또한 ^ /dev/null무엇을하는지 보았 습니까?
balupton

답변:


241

배경 :

  • 번호 1 = 표준 출력 (즉, STDOUT)
  • 번호 2 = 표준 오류 (예 : STDERR)
  • 숫자가 명시 적으로 주어지지 않으면 쉘 (bash)은 숫자 1 을 가정합니다.

먼저 이들의 기능을 다루겠습니다. 자세한 내용은 Advanced Bash-Scripting Guide 를 참조하십시오 .

기능

2>&-

이 형식의 일반적인 형식은입니다 M>&-. 여기서 "M" 은 파일 설명자 번호입니다. 이렇게하면 참조 된 파일 설명자 (예 : "M")에 대한 출력이 닫힙니다 .

2>/dev/null

이 형식의 일반적인 형식은입니다 M>/dev/null. 여기서 "M" 은 파일 설명자 번호입니다. 파일 디스크립터 "M" 이로 리디렉션 됩니다 /dev/null.

2>&1

이 하나의 일반적인 형태는 M>&N여기서, "M""N"이 파일 디스크립터 번호이다. 파일 디스크립터 "M""N" 의 출력을 단일 스트림으로 결합합니다.

|&

이것은의 약어 일뿐입니다 2>&1 |. Bash 4에 추가되었습니다.

&>/dev/null

이것은의 약어 일뿐입니다 >/dev/null 2>&1. 파일 디스크립터 2 (STDERR) 및 디스크립터 1 (STDOUT)을로 재 지정합니다 /dev/null.

>/dev/null

이것은의 약어 일뿐입니다 1>/dev/null. 파일 디스크립터 1 (STDOUT)을로 경로 재 지정합니다 /dev/null.

비 bash, tcsh, mksh 등으로의 이식성

나는 이외의 다른 조개와 많이 처리하지 한 cshtcsh. bash의 리디렉션 연산자와 비교하여 2에 대한 나의 경험은 bash가 그 점에서 우수하다는 것입니다. 자세한 내용은 tcsh 매뉴얼 페이지 를 참조하십시오.

아무것도 요청하지 않은 명령 중 csh / tcsh가 직접 지원합니다. 비슷한 함수를 구성하려면 다른 구문을 사용해야합니다.


우리는 승자가 있습니다. 그러나 성능 차이 또는 2>&-vs 와의 차이가 없습니다 2>/dev/null(일부 "불량한"작문 프로그램이 2>&-올바르게 이해 하지 못하는 것 제외)?
Det

3
성능 차이가 없어야합니다.
slm

5
&>에서했다 bash(비록 타격을받을 가능성이며, 거기에 뭔가 다른 의미로 Bourne 씨와 POSIX 호환성을 나누기) 시작부터. >&|&출신 (t)csh(그리고 열려진 리디렉션하는 유일한 방법입니다). 그들은 zsh처음부터 시작했으며 최근에에 추가되었습니다 bash. rc더 나은 설계 운영자를 참조하십시오 .
Stéphane Chazelas

1
업데이트 : 성능 문제에 관해서는 여기에서도 확인됩니다 : unix.stackexchange.com/questions/163955/…
Det

1
안녕 @ slm, 연락 주셔서 감사합니다. 내 레포가 바뀌지 않아서 기쁘다 (+2-2=0). 이제 에디션 부분에서는 많이 편집하지 않지만이 경우 작업 후 데이터가에 있음을 명확히하기 때문에이 경우에는 그렇게합니다 N. 나는 당신이 대답을 읽었으며 모든면에서 매우 훌륭합니다. 이 작은 모호함만으로도 생각하게되었습니다. 그러나 원하는대로 다시 추가하거나 거부 할 수 있습니다. 요점을 설명 할 수 있기를 바랍니다. 좋은 일을 계속하십시오.
Dr Beco

11

STDERR & STDOUT을 리디렉션하기위한 것입니다.

  • 2>/dev/null

    STDERR을 / dev / null로 리디렉션하십시오 (콘솔에 표시되지 않도록 함)

  • |&

    파이프 명령의 STDERR 및 STDOUT을 STDIN으로 경로 재 지정 (cmd1 | & cmd2)

  • &>/dev/null

    STDERR 및 STDOUT을 / dev / null로 리디렉션하십시오 (콘솔에 아무것도 표시되지 않음)

  • >/dev/null

    STDOUT을 / dev / null로 경로 재 지정 (STDERR 만 콘솔에 표시됨)

  • 2>&-

    리디렉션에 사용되는 파일 디스크립터를 닫는 데 사용됩니다

이들은 Bourne 쉘에 대한 모든 표준 리디렉션 방법입니다.


4
|&하고 &>/dev/null있습니다 하지 휴대용.
Chris Down

4

선택한 답변에 대한 부록을 고려하십시오. POSIX 양식과 그렇지 않은 양식을 알고 싶을 수 있습니다.

두 가지 POSIX 양식이 관련됩니다.

출력 리디렉션

출력 리디렉션의 두 가지 일반적인 형식은 다음과 같습니다.

[n]> 단어

[n]> | 단어

여기서 선택적 n은 파일 디스크립터 번호를 나타냅니다. 숫자를 생략하면 표준 출력 (파일 설명자 1)을 참조해야합니다.

noclobber 옵션이 설정되고 (set -C 설명 참조) 단어 확장으로 명명 된 파일이 존재하고 일반 파일 인 경우 '>'형식을 사용한 출력 리디렉션이 실패합니다. 그렇지 않으면 '>'또는 "> |"를 사용하여 리디렉션 형식은 단어 확장으로 인해 이름이 지정된 파일이 지정된 파일 디스크립터에서 출력하기 위해 작성되고 열리거나 지정되지 않은 경우 표준 출력이되게합니다. 파일이 존재하지 않으면 파일을 작성해야한다. 그렇지 않으면 파일을 연 후 빈 파일로 잘립니다.

-

2.7.6 출력 파일 디스크립터 복제

리디렉션 연산자 :

[n]> & 단어

하나의 출력 파일 디스크립터를 다른 출력 파일 디스크립터와 복제하거나 하나를 닫아야합니다. 워드가 하나 이상의 숫자로 평가되는 경우, n으로 표시되는 파일 디스크립터 또는 n이 지정되지 않은 경우 표준 출력은 워드로 표시되는 파일 디스크립터의 사본이되어야합니다. 워드의 숫자가 출력을 위해 이미 열린 파일 디스크립터를 나타내지 않으면, 리디렉션 에러가 발생한다; 쉘 오류의 결과를 참조하십시오. 단어가 '-'로 평가되면 파일 설명자 n 또는 n이 지정되지 않은 경우 표준 출력이 닫힙니다. 열려 있지 않은 파일 디스크립터를 닫으려고 시도해도 오류가 아닙니다. 단어가 다른 것으로 평가되면 동작이 지정되지 않습니다.

따라서:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

마지막 줄은 원래 질문에 없지만 bash에서 불만없이 작동합니다. / dev / null 대신 / dev / tty와 함께 작동합니다.


1
난 항상 더 알고 싶어
Det
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.