리눅스의 2>&1은 도대체 무엇일까
nohup command>/dev/null 2>&1 &
이런 형식의 명령을 만날 수 있다.우선 우리는 이 명령을 대략적으로 분해했다. 우선 nohup
현재 사용자와 시스템의 회신 아래 도시에 들어가서 HUP 메시지에 응답하는 것을 무시한다는 뜻이다.&
는 이 명령을 후방의job 형식으로 실행한다.그럼 남은 command>/dev/null 2>&1
command>/dev/null
는 잘 이해되고 /dev/null
는 빈 장치를 의미한다. 그러니까command의 실행 결과가 빈 장치로 바뀌었는데 말하자면 아무런 정보도 보이지 않는다.그럼2>&1
은 또 무슨 뜻입니까?2>&1
몇 가지 기본 기호와 그 함의
command>/dev/null부터
사실 이 명령은 줄임말로 방향을 바꾸는 명령에 대해
a > b
이라는 형식이 틀림없다. 그러면 command > /dev/null
는command가 a의 역할을 하고/dev/null이 b의 역할을 하는 것이 아닐까.이렇게 보면 비교적 합리적이다. 사실 하나의 명령은 a를 충당하지 못할 것이다. 틀림없이command가 실행한 출력으로 a를 충당할 것이다. 사실은 표준 출력 stdout이다.그래서 command > /dev/null
는 집행command 1 > /dev/null
에 해당한다.command를 실행하면 표준 출력 stdout (1로 표시) 를 생성하여/dev/null의 장치 파일로 변경합니다.말해봐2>&1
상단
command > /dev/null
을 등가command 1 > /dev/null
와 비교하면 2>&1
에 대해서도 잘 이해할 수 있다. 2는 표준 오류이고 1은 표준 출력이다. 그러면 이 명령은 표준 오류를 표준 출력으로 바꾸는 것과 같지 않느냐.잠깐만요. 1 이 아니라 1 이에요. 여기 & 뭐예요?여기&
는 표준 출력과 같은 효과가 있다.여긴 이해가 잘 안 되니 먼저 아래를 보세요.command>a 2>a와command>a 2>&1의 차이
상기 분석을 통해
command>a 2>&1
이 명령에 대해 command 1>a 2>&1
는command에서 발생한 표준 입력을 파일 a로 바꾸는 것과 같고 표준 오류도 파일 a로 바꾸는 것으로 이해할 수 있다.그럼 command 1>a 2>&1
가 command 1>a 2>a
와 같다고 할까요?사실은 그렇지 않다. command 1>a 2>&1
와 command 1>a 2>a
는 차이가 있다. 전자는 파일 a를 한 번만 열고 후자는 파일을 두 번 열어서 stdout이 stderr에 덮어씌운다는 것이다.&1
의 의미는 표준 출력으로 인용하는 것으로 이해할 수 있는데 인용하는 것은 표준 출력으로 전환되어 열린 a를 만드는 것이다.IO 효율성command 1>a 2>&1
이 command 1>a 2>a
보다 더 높다.밤을 들다
셸 하나 주세요.
//test.sh
#!/bin/sh
t
date
chmod +x test.sh
test입니다.sh 실행 권한을 추가합니다.여기에서 우리는 두 개의 명령을 받았는데, 그 중에서 t명령은 존재하지 않으며, 실행이 잘못되면 stderr에 출력될 것이다.date는 정상적으로 실행됩니다. 실행은 현재 시간을 출력하고 stdout에 출력합니다.실행
./test.sh > res1.log
결과 stderr가res1로 바뀌지 않았음을 알 수 있습니다.log에서 stderr가 화면에 인쇄되었습니다.이것 또한 위에서 말한 ./test.sh > res1.log
의 등가가 ./test.sh 1>res1.log
와 같다는 것을 한층 더 증명하였다.실행
./test.sh>res2.log 2>&1
결과 이번에 stdout과 stderr가 모두res2로 바뀌었음을 발견했습니다.로그가 맞았어요.위에서 우리는 stderr, 즉 2에 대해 어떻게 출력하는지 설명하지 않았는데 stderr는 화면에 출력되었다. 여기서 우리는 stdout에 대해 설명할 뿐만 아니라res2로 방향을 바꾸었다.log에서 표준 오류도res2로 리셋하도록 설명했습니다.log의 인용은res2.log의 파일 설명자에 있습니다.다시 한 번 생각해 보다
왜 2>&1은command>1의 뒤에 써야 하는지, 그냥 2로 하면 안 돼요?예컨대
ls 2>a
.사실 이런 사용법도 가능하다. ls 명령은 현재 디렉터리를 열거하고 stdout(1)로 표시한다. 이때 stderr(2)가 없기 때문에 이때 실행ls 2>a
해도 a의 파일이 정상적으로 생성되지만 a의 파일은 비어 있다. 왜냐하면 이때 실행된 ls가 stderr(2)를 생성하지 않았기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.