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

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

그냥 차이점을 찾아보면

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

tcshBourne 쉘이 아닌 쉘(예 : 등) mksh로의 이식성 .

답변1

배경:

  • 번호 1= 표준 출력(예: STDOUT)
  • 2 번= 표준 오류(예: STDERR)
  • 숫자를 명시적으로 지정하지 않은 경우번호 1쉘(bash)에 의해 가정됨

먼저 해당 기능을 살펴보겠습니다. 참고로 다음을 참조하세요.고급 Bash 스크립팅 가이드.

기능

2>&-

이것의 일반적인 형태는 이며 M>&-, 여기서"중"파일 설명자입니다. 그러면 참조된 파일 설명자의 출력이 닫힙니다."중".

2>/dev/null

이것의 일반적인 형태는 이며 M>/dev/null, 여기서"중"파일 설명자입니다. 그러면 파일 설명자가 리디렉션됩니다."중", 도착하다 /dev/null.

2>&1

이것의 일반적인 형태는 이며 M>&N, 여기서"중"&"N"파일 설명자 번호입니다. 파일 설명자의 출력을 결합합니다."중"그리고"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 등에 이식 가능

csh나는 외부의 다른 쉘을 많이 다루지 않았습니다 tcsh. Bash의 리디렉션 연산자와 비교할 때 이 두 가지 작업에 대한 내 경험에 따르면 bash는 이 점에서 우수합니다. 보다tcsh 매뉴얼 페이지자세한 내용은.

csh/tcsh는 귀하가 요청한 명령을 직접 지원하지 않습니다. 유사한 함수를 구성하려면 다른 구문을 사용해야 합니다.

답변2

이는 STDERR 및 STDOUT을 리디렉션하는 것입니다.

  • 2>/dev/null

    STDERR을 /dev/null로 리디렉션(콘솔에 표시되지 않음)

  • |&

    STDERR 및 STDOUT을 파이프 명령(cmd1 |& cmd2)의 STDIN으로 리디렉션합니다.

  • &>/dev/null

    STDERR 및 STDOUT을 /dev/null로 리디렉션합니다(콘솔에 아무것도 표시되지 않음).

  • >/dev/null

    STDOUT을 /dev/null로 리디렉션(콘솔에는 STDERR만 나타남)

  • 2>&-

    리디렉션과 함께 사용되는 파일 설명자를 닫는 데 사용됩니다.

이는 Bourne 쉘의 표준 리디렉션 방법입니다.

답변3

선택한 답변에 대한 부록을 고려하십시오. 어떤 형식이 POSIX이고 어떤 형식이 아닌지 궁금할 것입니다.

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

2.7.2 출력 리디렉션

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

[n]>단어

[n]>|단어

선택적 n은 파일 설명자 번호를 나타냅니다. 이 숫자가 생략되면 리디렉션은 표준 출력(파일 설명자 1)을 참조해야 합니다.

noclobber 옵션이 설정되어 있고(set -C 설명 참조) 단어 확장자로 명명된 파일이 존재하고 일반 파일인 경우 ">" 형식을 사용한 출력 리디렉션이 실패합니다. 그렇지 않은 경우 ">" 또는 ">|" 리디렉션 형식을 사용하면 단어 확장으로 인해 이름이 지정된 파일이 생성되어 지정된 파일 설명자에서 출력되거나 지정되지 않은 경우 표준 출력으로 열립니다. 파일이 없으면 파일이 생성되고, 그렇지 않으면 열 때 빈 파일로 잘립니다.

-

2.7.6 출력 파일 설명자 복사

리디렉션 연산자:

[n]>단어(&W)

출력 파일 설명자는 다른 출력 파일 설명자에서 복사해야 하거나 출력 파일 설명자를 닫아야 합니다. word가 하나 이상의 숫자로 평가되면 n 또는 표준 출력(n이 지정되지 않은 경우)으로 표시되는 파일 설명자는 word의 숫자가 For를 사용하여 열린 파일을 나타내지 않으면 word로 표시되는 파일 설명자의 복사본이 됩니다. 출력 파일 설명자에서 리디렉션 오류가 발생합니다. 셸 오류의 결과를 참조하세요. 단어가 "-"로 평가되면 파일 설명자 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를 사용할 수도 있습니다).

관련 정보