Bash의 출력 리디렉션 - >>와 >&, 리디렉션과 복사의 차이점은 무엇입니까?

Bash의 출력 리디렉션 - >>와 >&, 리디렉션과 복사의 차이점은 무엇입니까?

출력 리디렉션을 이해하려고 노력하고 있지만 어려움을 겪고 있습니다. 나는 그 차이를 정말로 이해하지 못한다고 생각합니다.

1 > file        # -  redirect stdout to file (override mode)
1 >> file       # -  redirect stdout to file (append mode)
2 > 1           # 1) would that also redirect stderr to stdout, replacing stdout?
2 >> 1          # 2) would this redirect stderr to stdout (appending to it,
                #    i.e. haivng both sent to stdout?)
1>&9            # -  duplicates stdout to file descriptor (pointer) 9 
                # 3) what's the difference of 2>&1 to a 2 >> 1? Does >> only run at the end
                #     of output?
echo foo > file # -  redirects output to file (override mode)
>file 2>&1      # -  duplicates stderr to stdout, then redirects to file in override mode 
                # 4) why is this giving me stdout, too, when the syntax is 2>&1, 
                #    i.e. duplicate stderr into stdout - not merge 2 into 1?

&앰퍼샌드는 리디렉션이 아니라 복제를 의미한다고 가정합니다 . 하지만 ( 동일하게 유지됩니까?) a로 리디렉션하는 것과 ( 동일하게 유지됩니까?) 로 복사 하는 것의 차이점은 무엇입니까 ? 효과적으로 리디렉션하고 병합하는 것 같습니다 . 즉, 들어가야 할 콘텐츠가 이제 거기에 있지만 ... 왜일까요 ?baabab2>&121211

혼란스러워요 ...

답변1

우선 뭐든지뒤쪽에 >또는 >>파일 이름 > 1이므로 1.

예제에 제공된 다른 형태의 숫자는 파일 설명자입니다. 기본적으로 프로그램은 연결된 파일 설명자 0(표준 입력), 1(표준 출력) 및 2(표준 오류)로 시작합니다. 대화형 셸에서 프로그램을 시작하면 이러한 프로그램은 터미널의 입력 및 출력(사용자는 ls -l /proc/$$/fdLinux에서 실행하면 이러한 내용을 볼 수 있습니다).

앞에 숫자를 지정 >하거나 작업하려는 파일 설명자를 지정하십시오. 숫자는 기호 앞에 있어야 >>합니다 . 그러므로>&>

echo Example 2> stderr

"example"을 인쇄하고 빈 stderr파일을 만듭니다(표준 오류로 전송된 모든 내용 포함).

파일 설명자는 기본적으로 파일을 가리키는 테이블의 항목으로 생각할 수 있습니다.

  • 0분 ~/dev/tty
  • 1분 ~/dev/tty
  • 2분/dev/tty

를 가리키도록 파일 설명자 1을 업데이트하도록 지정합니다 1> file(또는 간단하게 ) . 잘림 모드에서 열립니다(해당 내용이 대체됨). 파일 설명자 2가 잘림 모드에서 열린 이름의 파일을 가리키도록 업데이트되도록 지정합니다 .> filefile2> 11

>&파일 설명자를 복사하는 방법(또는 이것이 선호되는 형식)을 사용하면 &>다른 파일 설명자가 가리키는 항목을 가리키도록 하나의 파일 설명자를 업데이트하기만 하면 됩니다. 마지막 예에서는 > file파일 설명자 1이 업데이트되었습니다.

  • 0분 ~/dev/tty
  • 1분 ~file
  • 2분/dev/tty

그런 다음 2>&1파일 설명자 2를 업데이트합니다.

  • 0분 ~/dev/tty
  • 1분 ~file
  • 2분file

(순서가 중요합니다. > file 2>&1위의 내용을 생성하면 2>&1 > file파일 설명자 1만 결국 리디렉션됩니다.)

1>&9형식은 파일 설명자 9가 열려 있는 경우에만 유효합니다.예를 들어파일 설명자 1을 여기에 복사하거나( 9>&1) 파일을 엽니다( 9> file). 이러한 유형의 구성은 리디렉션될 때 파일 설명자의 원래 내용을 추적하는 데 유용하므로 스크립트에서 1과 2를 안전하게 복사하고 stdout 및 오류를 필요한 목적으로 리디렉션한 다음 복원할 수 있습니다.

이것배쉬 매뉴얼모든 세부 사항이 있습니다.

답변2

몇 가지 잘못된 가정이 있습니다.


리디렉션의 일반적인 구문은 다음과 같습니다.

[n]redirection-operator word

여기서 n파일 설명자를 나타내는 10진수입니다. 와 사이에는 공백 이 n없습니다 redirection-operator.


표준 출력을 파일로 리디렉션하려면 다음이 필요합니다.

> file

또는:

1> file

1 > file명령을 실행 1하고 출력을 로 리디렉션 file하거나 명시적으로 다음과 동일함을 의미합니다.

1 1> file

2> file표준 오류와 연산자도 마찬가지입니다 >>.


파일 설명자를 복사하려면 다음을 사용합니다.

  • [n]<&word입력 파일 설명자용
  • [n]>&word출력 파일 설명자의 경우
  • [n]<>word읽고 쓰기 위해 파일 설명자를 엽니다.

위의 모든 구문은 표준 구문이며 스크립트 에 사용하면 #!/bin/sh작동합니다 .

일부 셸에는 표준 출력 및 표준 오류를 리디렉션하고 bash명령 이 완료될 때 오프셋으로 자르는 것과 같은 자체 확장이 있습니다 .>&ksh93<>;


이제 차이점을 볼 수 있습니다.

이것복사연산자는 파일 설명자에서만 작동하지만리디렉션Operator는 파일(뒤에서 파일 설명자에 매핑됨)에 대해서만 작동합니다.

관련 정보