출력 리디렉션을 이해하려고 노력하고 있지만 어려움을 겪고 있습니다. 나는 그 차이를 정말로 이해하지 못한다고 생각합니다.
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
로 리디렉션하는 것과 ( 동일하게 유지됩니까?) 로 복사 하는 것의 차이점은 무엇입니까 ? 효과적으로 리디렉션하고 병합하는 것 같습니다 . 즉, 들어가야 할 콘텐츠가 이제 거기에 있지만 ... 왜일까요 ?b
a
a
b
a
b
2>&1
2
1
2
1
1
혼란스러워요 ...
답변1
우선 뭐든지뒤쪽에 >
또는 >>
파일 이름 > 1
이므로 1
.
예제에 제공된 다른 형태의 숫자는 파일 설명자입니다. 기본적으로 프로그램은 연결된 파일 설명자 0(표준 입력), 1(표준 출력) 및 2(표준 오류)로 시작합니다. 대화형 셸에서 프로그램을 시작하면 이러한 프로그램은 터미널의 입력 및 출력(사용자는 ls -l /proc/$$/fd
Linux에서 실행하면 이러한 내용을 볼 수 있습니다).
앞에 숫자를 지정 >
하거나 작업하려는 파일 설명자를 지정하십시오. 숫자는 기호 앞에 있어야 >>
합니다 . 그러므로>&
>
echo Example 2> stderr
"example"을 인쇄하고 빈 stderr
파일을 만듭니다(표준 오류로 전송된 모든 내용 포함).
파일 설명자는 기본적으로 파일을 가리키는 테이블의 항목으로 생각할 수 있습니다.
- 0분 ~
/dev/tty
- 1분 ~
/dev/tty
- 2분
/dev/tty
를 가리키도록 파일 설명자 1을 업데이트하도록 지정합니다 1> file
(또는 간단하게 ) . 잘림 모드에서 열립니다(해당 내용이 대체됨). 파일 설명자 2가 잘림 모드에서 열린 이름의 파일을 가리키도록 업데이트되도록 지정합니다 .> file
file
2> 1
1
>&
파일 설명자를 복사하는 방법(또는 이것이 선호되는 형식)을 사용하면 &>
다른 파일 설명자가 가리키는 항목을 가리키도록 하나의 파일 설명자를 업데이트하기만 하면 됩니다. 마지막 예에서는 > 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는 파일(뒤에서 파일 설명자에 매핑됨)에 대해서만 작동합니다.