명령이 stdout 및 stderr을 터미널이나 파일로 보내지 못하도록 방지

명령이 stdout 및 stderr을 터미널이나 파일로 보내지 못하도록 방지

내 프로그램이 stdout 및 stderr을 터미널, 파일 또는 장치로 보내는 것을 방지하고 싶습니다. 이를 위해 내 머릿속에는 세 가지 명령이 실행되고 있지만 그 차이점을 알 수 없습니다. 각각이 무엇을 의미하는지 설명해 주시겠어요?

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1

답변1

# ./run > /dev/null

이는 stdout을 로 리디렉션 /dev/null하지만 stderr에는 전혀 아무 작업도 수행하지 않습니다. stdout 및 stderr에서 리디렉션을 요청하므로 원하는 대로 수행되지 않습니다.

# ./run > /dev/null 1>&2

이는 stdout을 로 리디렉션한 /dev/null다음 stderr가 ()를 가리키는 곳 1>으로 다시 stdout( ) 을 리디렉션합니다 &2. 이는 터미널일 수 있고 리디렉션 전에 stdout이 가리키는 곳일 수 있습니다. 따라서 여기서 최종 효과는 (아마도) stdout이 전혀 리디렉션되지 않으며 stderr의 경우 여전히 아무 작업도 수행하지 않는다는 것입니다. 그래서 그것은 당신이 원하는 것도 아닙니다.

# ./run > /dev/null 2>&1

이는 stdout을 로 리디렉션 /dev/null한 다음 stderr( 2>)을 stdout이 가리키는 곳으로 리디렉션합니다. 왜냐하면 /dev/null방금 리디렉션한 곳이기 때문입니다. 이것이 당신이 원하는 것 같습니다.

나는 그들 사이의 차이점을 알 수 없습니다.

사실, 그 차이를 아주 쉽게 구분할 수 있어야 합니다. 다음과 같이 가정합니다 ./run.

#!/bin/sh
echo stdout
echo stderr >&2

그러면 결과는 다음과 같아야 합니다.

# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1

차이점은 분명합니다!

관련 정보