본문 바로가기
프로그램개발/Linux(Apache.vim)

대충 알고있던 "/dev/null 2>&1"의 의미 (chatgpt4)

by 크레도스 2023. 6. 26.

출처 : https://okky.kr/articles/1450995

 

OKKY - 대충 알고있던 "/dev/null 2>&1"의 의미 (chatgpt4)

이제 모든 지식은 상향 평준화가 되는군요./dev/null 2>&1은 무슨뜻이지?/dev/null 2>&1은 Unix와 Linux에서 출력을 무시하도록 하는 방법입니다.- /dev/null은 Unix와 Linux 시스템에서 'null device'를 나타냅니다.

okky.kr

이제 모든 지식은 상향 평준화가 되는군요.

/dev/null 2>&1은 무슨뜻이지?

/dev/null 2>&1은 Unix와 Linux에서 출력을 무시하도록 하는 방법입니다.

- /dev/null은 Unix와 Linux 시스템에서 'null device'를 나타냅니다. 이 장치로 보내진 데이터는 모두 무시됩니다. 따라서, /dev/null로 리다이렉션하는 것은 해당 출력을 버리는 것과 같습니다.

- 2는 '표준 에러 출력'을 나타내는 파일 디스크립터입니다. 일반적으로 에러 메시지는 여기에 출력됩니다.

- >&는 '리다이렉션' 연산자입니다. 한 출력을 다른 출력으로 리다이렉션합니다.

- 1은 '표준 출력'을 나타내는 파일 디스크립터입니다. 일반적으로 명령의 결과는 여기에 출력됩니다.

따라서, /dev/null 2>&1은 "표준 출력과 표준 에러 출력을 모두 /dev/null로 리다이렉션하라"는 의미입니다. 즉, 모든 출력(일반 메시지와 에러 메시지 모두)을 버리라는 의미입니다. 이를 통해 명령이 실행되는 동안 출력되는 모든 메시지를 무시할 수 있습니다.

2>&1을 안적어주면 표준출력은 버려지고 오류 출력은 표시되겠네?

맞습니다. >/dev/null 또는 1>/dev/null 명령은 표준 출력(즉, 일반 메시지)을 /dev/null로 리다이렉트하여 버립니다. 이 명령에는 표준 에러 출력(즉, 에러 메시지)은 포함되지 않으므로, 에러 메시지는 여전히 출력됩니다.

반면에, 2>/dev/null 명령은 표준 에러 출력만 /dev/null로 리다이렉트하여 버립니다. 이 명령에는 표준 출력은 포함되지 않으므로, 일반 메시지는 여전히 출력됩니다.

따라서, 2>&1 부분을 생략하고 >/dev/null만 사용하면, 오류 메시지는 여전히 보이게 됩니다. 이는 일반적으로 스크립트나 프로그램이 실패할 경우 오류 메시지를 캐치하고 싶을 때 유용합니다. 이 메시지를 통해 어떤 문제가 발생했는지 파악할 수 있기 때문입니다. 반대로, 2>&1을 포함하여 >/dev/null 2>&1를 사용하면, 표준 출력과 표준 에러 출력 모두가 /dev/null로 리다이렉트되어 버려집니다. 즉, 모든 출력이 무시됩니다.

그런데 왜 2>&1을 명령어 뒤에 붙이는거지?

리다이렉션은 왼쪽에서 오른쪽으로 읽혀집니다. 따라서 2>&1 >/dev/null이라고 쓰면, 표준 에러 출력(2)은 표준 출력(1)으로 리다이렉트되고, 그 다음 표준 출력(1)은 /dev/null로 리다이렉트됩니다.

하지만 >/dev/null 2>&1라고 쓰면, 처음에 표준 출력(1)이 /dev/null로 리다이렉트되고, 그 다음 표준 에러 출력(2)은 표준 출력(1)으로 리다이렉트됩니다. 여기서 표준 출력(1)은 이미 /dev/null로 리다이렉트되었기 때문에, 결국 표준 에러 출력도 /dev/null로 리다이렉트됩니다.

즉, 두 경우 모두 표준 출력과 표준 에러 출력이 /dev/null로 리다이렉트되지만, 리다이렉션의 순서가 다릅니다. >/dev/null 2>&1 형식은 흔히 사용되는 방식으로, 이 형식을 사용하면 표준 출력과 표준 에러 출력을 모두 /dev/null로 리다이렉트할 수 있습니다.

오오.. 대단하네요.

오류 발생 /dev/null 2>&1 동작 테스트

sh -c 'echo "Hello, world"'

sh -c 'echo "Hello, world"' > /dev/null

sh -c 'echo "Hello, world ${qpe\e}"' > /dev/null

sh -c 'echo "Hello, world ${qpe\e}"' > /dev/null 2>&1

sh -c 'echo "Hello, world ${qpe\e}"' 2>&1 > /dev/null

2>&1 > /dev/null은 chatgpt4가 알려준게 잘못되었네요.

2가 1로 출력되고 나서 /dev/null로 버려지기 때문에 오류가 화면에 출력됩니다.