간단히 말해서 ">&"는 무엇입니까? [복사]

간단히 말해서 ">&"는 무엇입니까? [복사]

$ command 1>&2효과 는 무엇입니까 ? 내가 이해하는 바에 따르면 이것이 실행되지만 command. STDOUT로 리디렉션 됩니다 STDERR. 그러나 그것이 어떻게 작동하는지 정확히 모르겠습니다 >&.

$ command 1>&2나는 그것을 와 로 생각한다 $ command 2>&1.

나는 과 가 1각각 과 에 대한 파일 설명자라고 가정 2하지만 그것이 무엇을 의미하는지조차 잘 모르겠습니다.STDOUTSTDERR

SO 및 기타 리소스에서 >&일종의 리디렉션 "사물(운영자??)"을 발견했는데 그것이 정확히 어떻게 작동하는지 잘 모르겠습니다. 이진 연산자인가요? 그것도 통신사인가요?

누군가 이것을 설명할 수 있나요?초보자이것이 수행하는 작업에 대한 용어입니다.

답변1

1해당 구문에서는 STDOUT 및 STDERR이 정확합니다 2. 그 역할은 "A를 B가 있는 곳으로 보내는 것"입니다. 따라서 을 작성 하고 STDERR을 가져와 STDOUT으로 보낼 2>&1수도 있습니다 . 2 > &1원본 STDOUT일 필요는 없습니다. 실제로는 하나의 단위가 아니며 >&, 종종 그런 식으로 함께 작성됩니다. 이것이 >"리디렉션" 연산자입니다.

재미있는 부분은 주문입니다. 예를 들면 다음과 같습니다.

$ command 2>&1 > file.out

와는 다르다

$ command > file.out 2>&1

첫 번째는 STDERR을 STDOUT으로 보낸 다음 STDOUT을 "file.out"으로 보내므로 STDERR과 STDOUT을 같은 위치에 얻습니다. 두 번째는 STDOUT을 "file.out"으로 보낸 다음 STDERR을 STDOUT으로 보내므로 결국 파일이 아닌 터미널 창에 STDERR이 표시됩니다.

답변2

&열리지 않은 파일의 경로(기본값)가 아니라 셸에서 열린 파일 설명자에 대해 지정하는 접두사입니다. STDOUT거의 항상 파일 설명자 1이며 STDERR거의 항상 2.

꺾쇠 괄호와 마찬가지로 쉘은 일반적으로 그 앞의 숫자가 파일 설명자가 될 것임을 알 만큼 똑똑합니다. 이 중 하나를 생략하면 일반적으로 STDOUTfor >STDINfor 에 대해 이야기하고 있다고 가정합니다 <.

그래서 이것을 종합하면:

# command > /tmp/myFile
# command 1> /tmp/myFile

둘 다 이름이 지정된 플랫 파일을 직접 command가리킵니다 .STDOUT/tmp/myFile

# command >&2
# command 1>&2

둘 다 파일 설명자 (STDERR) 에서 열린 파일을 직접 command가리킵니다 .STDOUT2

# command 2>&1

일반적으로 기록된 모든 항목을 STDERR파일 설명자 번호 1( STDOUT)로 리디렉션합니다.

이는 셸 자체에서 수행하는 모든 종류의 파일 I/O에 공통적입니다. 문제의 특정 파일 설명자는 종종 그 자체로 특별한 의미를 갖습니다.

STDERR파일로 리디렉션하려면 2지정된 파일에 파일 설명자를 할당하도록 지시할 수도 있습니다.

# command 2> /tmp/newFile 

예를 들어:

[root@edc4 ~]# ./causeError 2>/tmp/containError
[root@edc4 ~]# cat /tmp/containError
Error Message
[root@edc4 ~]#

배쉬 가이드를 사용하는 방법에 대한 자세한 내용 일반적인 세 ​​가지( , 및 ) bash이외의 파일 설명자에서 파일을 열 수 있지만 이는 일반적으로 더 복잡한 스크립트용으로 예약되어 있으며 사람들은 일반적으로 일반적인 세 ​​가지만 처리합니다. 그럼에도 불구하고 사람들은 대개 공정하게 대우 받습니다 .01212

답변3

이 숫자는 파이프의 인덱스 값입니다. 올바르게 언급했듯이 0은 표준 입력, 1은 표준 출력, 2는 표준 오류입니다. 원하는 경우 더 만들 수 있습니다. 그런데 이 3개는 프로세스의 입력 및 출력을 처리하기 위해 생성된 기본 파일입니다. chevron >을 사용하면 데이터 흐름을 새 설명자로 리디렉션할 수 있습니다. 예를 들어 파일을 표시하지 않거나( cmd > ~/somefile.out ) 아무것도 표시하지 않으려는 경우( cmd > /dev/null ) 파이프를 닫을 수도 있습니다( cmd > &- ). 이것. 그러나 stdin과 stdout을 바꾸려면 다음과 같은 작업을 수행할 수도 있습니다( cmd 3>&2 2>&1 1>&2).

핵심은 이를 전선으로 생각하는 것입니다. 마치 옛날 학교 파견자처럼 기본 위치에 연결된 전선 레이블 0, 1, 2로 시작하고 > 전선이 연결된 위치를 전환할 수 있습니다.

관련 정보