출력 리디렉션에서 정확히 무엇을 의미합니까?


19

stderr을 리디렉션하는 것과 같은 것이 command 1> out있거나있는 2>&1것을 보았지만 때로는 &>자체적으로 도 보입니다 .

이해하는 가장 좋은 방법은 무엇이며 &정확히 무엇을 의미합니까?

답변:


26

&의는 2>&1단순히 수를 말한다 1파일 기술자가 아닌 파일 이름입니다. 이 케이스에서 standard output file descriptor.

을 사용하면 2>1오류가 호출 된 파일로 오류가 리디렉션 1되지만을 사용하면이 파일 2>&1을로 보냅니다 standard output stream.

이것은 어딘가에 와를 &>보내라고 말합니다 . 예를 들어 . 이것을 예로 들어 설명하겠습니다.standard outputstandard errorls <non-existent_file> &> out.file

설정:

  1. 파일 만들기 koko다음 내용을 :

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. 그것을 실행 가능하게 만드십시오 : chmod u+x koko

  3. 이제 j1존재하지 않습니다.

  4. 이제 실행 ./koko &> output

  5. 실행 cat output하면 볼 수 있습니다

    ls: cannot access 'j1': No such file or directory
    koko2
    

standard error( ls: cannot access 'j1': No such file or directory) 및 standard output( koko2) 모두 파일로 전송되었습니다 output.

이제 다시 실행하지만 이번에는 다음과 같이 수행하십시오.

./koko > output

당신 cat outputkoko2같은 것을 볼 수 있습니다. 그러나 ls j1명령 에서 출력 된 오류는 아닙니다 . 그것은 standard error당신이 당신의 터미널에서 보게 될 것으로 보내질 것입니다.

@Byte Commander의 중요한 참고 사항 :

에 있습니다 command >file 2>&1리디렉션의 순서 중요하다. command 2>&1 >file대신 (보통 원하는 것이 아닌) 쓰는 경우 먼저 명령 stdout을 파일로 리디렉션 한 다음 명령 stderr을 현재 미사용으로 리디렉션 stdout하므로 터미널에 표시되므로 파이프로 연결하거나 리디렉션 할 수 있습니다 다시 파일에 기록되지 않습니다.


2
무슨 &>뜻입니까?
AJJ

1
에 있습니다 command >file 2>&1재 지정의 순서 중요하다. command 2>&1 >file대신 (보통 원하는 것이 아닌) 쓰는 경우 먼저 명령의 stdout을 파일로 리디렉션 한 다음 명령의 stderr를 사용하지 않는 stdout으로 리디렉션하므로 터미널에 표시되어 파이프로 연결할 수 있습니다 다시 리디렉션하지만 파일에 기록되지 않습니다.
바이트 사령관

2
" standard output터미널에서 볼 수있는 주소로 전송됩니다 ." 이것이 ""이어서는 안 standard error됩니까?
frarugi87

1
예 @ frarugi87 권리가 수정
조지 Udosen을

1
@George 와우, 당신은 빠르다;) 좋은 일
frarugi87


1

[n]>&word라고 복제 출력 파일 설명자 (참조 섹션 2.7.6 POSIX 쉘 언어 표준의 참조). 이 특정 행동을 포함 포탄, 본 쉘과 같은의 기능으로 ksh, dash그리고 bash; 실제로이 표준은 Bourne shell 및을 기반으로 ksh합니다. 로 찾고 tcsh를 하고 CSH 매뉴얼, 그들은 분명히 그러나의 설명에서, 어떤 파일 기술자를 복제하는 기능을 제공하지 않는 >&이와 같이 동작 &>에서 bash(이다, 리디렉션 오류 및 파일에 정상 출력).

우분투를 포함한 * nix와 같은 시스템에서는 모든 것이 파일이거나 오히려 파일 디스크립터 라고 들었습니다 . 표준 출력을 일정 파일 기술자 1이고, 표준 오차는 파일 기술자 (2) 그래서이고, > FILE 2>&1기술적으로의 환언 파일 기술자 1에 중복 파일 디스크립터 수단 (2) 이 응답 :

2> & 1은 쉘에게 디스크립터 1의 복제 인 파일 디스크립터 2를 제공하도록 지시합니다 (예 : stderr & stdout은 동일한 fd를 가리킴).

여기서 핵심은 설명자 1을 먼저 설정해야한다는 것입니다. 셸 프로세스 리디렉션이 올바른 순서로 남아 있기 때문에,이 command >FILE 2>&1에 대한 재배 선 표준 출력에 쉘을 알려줍니다 command에 갈 FILE첫째, 오직 다음 설명이이 같은 위치에 1, 2 점 1의 사본이 될 수 있습니다 - FILE.

물론 이것은 표준 오류 및 표준 출력을 뛰어 넘습니다. 에서 쇼로 이 답변 , 수행하여3&>2

... 파일 디스크립터 2를 파일 디스크립터 3에 복제하고 (dup2), 파일 디스크립터 3이 이미 열려 있으면 닫을 수 있습니다.

많은 것들 중에서 파일 디스크립터를 조작하는 예는 명령의 출력 을 변수로 캡처하는 것입니다dialog

또한 &>특정에 주목할 가치가 bash있습니다. 에서는 zsh이 동일하게 동작하지만, 문서에 따르면, "... multios의 존재와 같은 효과가 '워드 2>> & 1'않는다". POSIX 호환에서는 /bin/sh백그라운드로 명령을 넣을 때 정기적 인 리디렉션으로 처리됩니다. 구문 상 유효한 bash 코드가 아닌 sh 코드가 있습니까?를 참조하십시오 . .

또한보십시오:

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