스크립트에서“3> & 1 1> & 2 2> & 3”은 무엇을합니까?


답변:


77

숫자는 파일 설명자이며 처음 세 개 (0으로 시작) 만 표준화 된 의미를 갖습니다.

0 - stdin
1 - stdout
2 - stderr

따라서 명령에서 이러한 각 숫자는 파일 설명자를 나타냅니다. 파일 디스크립터를 사용하여 파일로 >리디렉션하거나 다른 파일 디스크립터를 사용하여 다른 파일 디스크립터로 리디렉션 할 수 있습니다>&

3>&1명령 줄에서 새 파일 기술자를 만들고로 리디렉션됩니다 1이다 STDOUT. 지금 1>&2에 파일 기술자 1 리디렉션 STDERR2>&33에 파일 기술자 2를 리디렉션합니다 STDOUT.

그래서 기본적으로 당신은 전환 STDOUTSTDERR이러한 단계입니다 :

  1. 새 fd 3을 작성하고 fd 1을 가리 킵니다.
  2. 파일 디스크립터 1을 파일 디스크립터 2로 경로 재 지정하십시오. 파일 디스크립터를 3에 저장하지 않으면 대상이 없어집니다.
  3. 파일 디스크립터 2를 파일 디스크립터 3으로 경로 재 지정하십시오. 이제 파일 디스크립터 1과 2가 전환됩니다.

이제 프로그램이 파일 디스크립터 1에 무언가를 인쇄하면 파일 디스크립터 2에 인쇄되고 그 반대로도 인쇄됩니다.


"명령 행에서 3> & 1이 새 파일 디스크립터를 작성하고 STDOUT 인 1로 경로 재 지정합니다"라고 말했습니다. 그러나 1이 STDIN을 의미하지 않습니까?
sofs1

19

stdout와 교환 하고 stderr있습니다.

>name출력을 파일로 리디렉션하는 것을 의미합니다 name.

>&number출력을 파일 디스크립터로 리디렉션하는 것을 의미합니다 number.

따라서 &셸에 파일 이름이 아닌 파일 설명자를 의미해야합니다.

파일 디스크립터는 이미 열린 파일을 나타내는 숫자입니다. 표준은 0표준 입력, 1표준 출력 또는 2표준 오류에 대한 것입니다. 를 사용하여 새 변수를 만들 때와 마찬가지로 다른 숫자를 사용하여 새 파일 설명자를 만듭니다 var=value.

기본적으로 파일 디스크립터 12로 이동하여 새 쉘에서 /dev/tty실행 somecommand 3>&1 1>&2 2>&3하는 경우 아무것도 변경하지 않습니다 (지금은 파일 디스크립터 번호가 3 임).

그러나 스크립트 앞의 어딘가에서 exec (예 :)를 사용하여 리디렉션을 exec 2>error.log수행하거나 리디렉션 (예 ./thescript 2>error.log:)을 포함한 명령 줄로 스크립트를 실행하면 stdout과 stderr를 바꾸면 무언가가 수행됩니다.

특정 경우에 stdout과 stderr가 서로 바뀐 명령은 dialog입니다. 그 살펴보면 man 페이지 , 나는 참조

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

아마도 스크립트를 작성한 사람 은 어떤 이유로 대신에 dialog출력을 원할 stdout것입니다 stderr.

리디렉션 순서 참조


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