“2> & 1”은 명령 행에서 무엇을합니까?


59

>명령 줄에서 부호가 출력 리디렉션에 사용 된다는 것을 알고 있지만 명령 줄에서 사용법을 설명하는 것을 찾는 데 문제가 있습니다 2>&1. 예를 들면 다음과 같습니다.

curl http://www.google.com > /dev/null 2>&1 &

답변:


78

1나타낸다 표준 출력 (표준 출력). 2나타낸다 표준 오차 (열려진).

따라서 2>&1표준 출력이 리디렉션되는 곳으로 표준 오류를 보내라고 말합니다. 전송 된 /dev/null결과는 출력을 무시하는 것과 비슷합니다.


2
앰퍼샌드가 1 이전에 나타나지만 2 이전에는 나타나지 않는 이유가 있습니까? &는 백그라운드에서 작업을 실행하기위한 예약 문자라고 생각했지만 명령 끝에 앰퍼샌드가 긴 문자로 표시되는 경우에만 생각합니다 ...?
Matt Huggins

8
0(stdin), 1(stdout) 및 2(stderr)는 실제로 파일 디스크립터 이므로 쉘은 리디렉션을 위해 앰퍼샌드를 앞에 두어야합니다. 이 경우 파일 설명자를 복제하여 두 정보 스트림을 효과적으로 병합합니다.
Chealion

12
앰퍼샌드없이 "1"만 있으면 셸에서 "1"이라는 파일을 만들고 stderr 출력을 리디렉션합니다.
CarlF

1
그래, 이것만으로도 유효 할까? curl http://www.google.com 2>/dev/null커맨드 라인은 여기서 "2"가 stderr을 의미하고 실제로 curl 명령에 전달하는 두 번째 매개 변수가 아니라는 것을 어떻게 알 수 있습니까?
Matt Huggins

1
@ 매트 허긴 스 : 그렇습니다. 그것은 모든 출력을 stderr직선에서 /dev/null대신으로 보냅니다 . 당신은 시도하여 실제로 그것을 볼 수 있습니다 curl, curl 1>/dev/null그리고 curl 2>/dev/null바로 출력 변화를 볼 수 있습니다. 다시 앰퍼샌드는 파일 디스크립터로 리디렉션 될 때만 필요합니다.
Chealion

23

tl; dr

가져 오기 http://www.google.com에서 배경 과 폐기 모두 stdoutstderr.

curl http://www.google.com > /dev/null 2>&1 &

와 같다

curl http://www.google.com > /dev/null 2>/dev/null &

기초

0, 12표준 파일 대표 기술자POSIX 운영 체제를. 파일 기술자는 (기본적으로) 파일 또는 소켓에 대한 시스템 참조 입니다.

C에서 새 파일 디스크립터를 작성하면 다음과 같이 보일 수 있습니다.

fd = open("data.dat", O_RDONLY)

대부분의 유닉스 시스템 명령어는 약간의 입력을 받아 결과를 터미널로 출력합니다. curl지정된 URL에있는 모든 것을 가져오고 ( google dot com ) 결과를에 표시합니다 stdout.

컬 결과

리디렉션

마찬가지로 당신은 말했다 <>파일처럼 다른 곳으로 명령의 출력을 리디렉션하는 데 사용됩니다.

예를 들어,에서 ls > myfiles.txt, ls현재 디렉토리의 내용을 얻고 >그 출력을 리디렉션 myfiles.txt(파일 그렇지 않으면 덮어,이 만들어진 존재하지 않지만, 당신이 사용할 수있는 경우 >>대신 >대신 파일에 추가 할). 위의 명령을 실행하면 터미널에 아무것도 표시되지 않습니다. 그것은 일반적으로 유닉스 시스템에서 성공을 의미합니다. 이를 확인 cat myfiles.txt하여 파일 내용을 화면에 표시합니다.

> / dev / null 2> & 1

첫 번째 부분은 > /dev/null을 리디렉션 stdout즉, curl로의 출력 /dev/null(앞서이에 이상) 2>&1리디렉션 stderr받는 사람 stdout(단지로 리디렉션 된 /dev/null때문에 모든 것이로 전송됩니다 /dev/null).

의 왼쪽 2>&1을 알려줍니다 무엇을 리디렉션됩니다, 오른쪽 측면을 설명 이다. 는 &구별하는 오른쪽에 사용되는 stdout (1)또는 stderr (2)라는 이름의 파일에서 1또는 2. 따라서 2>1이름이 지정된 새 파일 (아직 존재하지 않는 경우)을 1만들고 stderr결과를 덤프합니다 .

/ dev / null

/dev/null빈 파일이며, 작성된 모든 것을 버리는 데 사용되는 메커니즘입니다. 따라서 의 출력을 curl http://www.google.com > /dev/null효과적으로 억제하고 curl있습니다.

> / dev / null

그러나 터미널에 여전히 어떤 것들이 표시됩니까? 이다 없는 curl 일반 출력의 만에 전송 된 데이터는 stderr, 진보와 진단 정보뿐 아니라 표시하기 위해 여기에 사용 된 오류를 .

curl http://www.google.com > /dev/null 2>&1curl의 출력과 curl진행 정보를 모두 무시합니다 . 결과는 터미널에 아무것도 표시되지 않습니다.

드디어

&끝에 당신이 같이 명령을 실행하는 쉘에게 어떻게 작업배경 . 이로 인해 명령이 백그라운드에서 비동기 적으로 실행되는 동안 프롬프트 가 즉시 리턴됩니다. jobs터미널에서 현재 작업 유형 을 보려면. 이것은 시스템에서 실행되는 프로세스 와 다릅니다 . top터미널에서 해당 유형을 확인하십시오 .

참고 문헌


1
이것은 레이아웃 관점에서 전체 웹 사이트에서 가장 좋은 답변 중 하나입니다.
OmarOthman

내가 얻지 못하는 한 가지는 왜 모든 것을 보내려고 /dev/null합니까? curl적어도 어딘가에 유용한 결과를 원하지 않습니까?
skube

@skube 맞습니다. 이 경우 사용자가 stdout과 stderr을 모두 삭제하려는 이유가 명확하지 않습니다. OP는 아마도 구문의 의미를 이해하고 싶을 것입니다.
Jorge Bucaran

5

2STDERR을 나타냅니다. 2>&1STDERR을 1(STDOUT) 과 같은 위치로 보냅니다 .


0

다음과 같이 이해합니다.

화면에서 명령의 출력 및 오류 정보 만 읽으려면 다음과 같이 작성하십시오. curl http://www.google.com

그리고 나중에 검토를 위해 출력 화면을 터미널 화면 대신 파일에 저장하려는 경우 다음과 같이 쓸 수 있습니다. curl http://www.google.com > logfile

그러나 이런 방식으로 StdErr 정보는 >StdOut으로 리디렉션 만하기 때문에 생략 됩니다 logfile.

따라서 명령이 실행되지 않으면 명령의 오류 정보에 신경 2>&1쓰면 StdErr를 StdOut로 접는 것을 사용하여 StdOut과 StdErr을 결합해야 하므로 다음 명령 행을 쓸 수 있습니다. curl http://www.google.com > logfile2> & 1

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