리눅스의 2>&1은 도대체 무엇일까

우리는 리눅스에서 자주 nohup command>/dev/null 2>&1 & 이런 형식의 명령을 만날 수 있다.우선 우리는 이 명령을 대략적으로 분해했다. 우선 nohup 현재 사용자와 시스템의 회신 아래 도시에 들어가서 HUP 메시지에 응답하는 것을 무시한다는 뜻이다.&는 이 명령을 후방의job 형식으로 실행한다.그럼 남은 command>/dev/null 2>&1command>/dev/null는 잘 이해되고 /dev/null는 빈 장치를 의미한다. 그러니까command의 실행 결과가 빈 장치로 바뀌었는데 말하자면 아무런 정보도 보이지 않는다.그럼2>&1은 또 무슨 뜻입니까?
2>&1
몇 가지 기본 기호와 그 함의
  • /dev/null 빈 장치 파일 표시
  • 0은 stdin 표준 입력
  • 을 나타낸다
  • 1은 stdout 표준 출력
  • 을 나타낸다
  • 2는 stderr 표준 오류
  • 를 나타냅니다.
    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>&1command 1>a 2>a와 같다고 할까요?사실은 그렇지 않다. command 1>a 2>&1command 1>a 2>a는 차이가 있다. 전자는 파일 a를 한 번만 열고 후자는 파일을 두 번 열어서 stdout이 stderr에 덮어씌운다는 것이다.&1의 의미는 표준 출력으로 인용하는 것으로 이해할 수 있는데 인용하는 것은 표준 출력으로 전환되어 열린 a를 만드는 것이다.IO 효율성command 1>a 2>&1command 1>a 2>a보다 더 높다.
    밤을 들다
    셸 하나 주세요.
    //test.sh
    #!/bin/sh
    t
    date
    chmod +x test.shtest입니다.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)를 생성하지 않았기 때문이다.

    좋은 웹페이지 즐겨찾기