기술적으로 "/dev/null"은 가상 장치 파일입니다. 프로그램에 관한 한 이들은 실제 파일처럼 취급됩니다. 유틸리티는 이러한 종류의 소스에서 데이터를 요청할 수 있으며 운영 체제는 데이터를 공급합니다. 그러나 디스크에서 읽는 대신 운영 체제는 이 데이터를 동적으로 생성합니다. 이러한 파일의 예는 "/dev/zero"입니다.
그러나 이 경우에는 장치 파일에 씁니다. "/dev/null"에 쓰는 것은 무엇이든 버리고 잊혀지고 공허에 던져집니다. 이것이 유용한 이유를 이해하려면 먼저 Linux 또는 *nix 유형 운영 체제의 표준 출력 및 표준 오류에 대한 기본적인 이해가 있어야 합니다.
stdout 및 stder
명령줄 유틸리티는 두 가지 유형의 출력을 생성할 수 있습니다. 표준 출력은 stdout으로 전송됩니다. 오류는 stderr로 전송됩니다.
기본적으로 stdout 및 stderr은 터미널 창(또는 콘솔)과 연결됩니다. 이것은 stdout 및 stderr로 전송된 모든 것이 일반적으로 화면에 표시됨을 의미합니다. 그러나 셸 리디렉션을 통해 이 동작을 변경할 수 있습니다. 예를 들어 stdout을 파일로 리디렉션할 수 있습니다. 이렇게 하면 화면에 출력을 표시하는 대신 나중에 읽을 수 있도록 파일에 저장하거나 stdout을 물리적 장치(예:디지털 LED 또는 LCD 디스플레이)로 리디렉션할 수 있습니다.
자세히 알아보려면 파이프 및 리디렉션에 대한 전체 기사를 참조하세요.
2>
사용 표준 오류 메시지를 리디렉션합니다. 예:2>/dev/null
또는2>/home/user/error.log
.1>
사용 표준 출력을 리디렉션합니다.&>
사용 표준 오류와 표준 출력을 모두 리디렉션합니다.
/dev/null을 사용하여 필요 없는 출력 제거
출력에는 표준 출력과 표준 오류의 두 가지 유형이 있으므로 첫 번째 사용 사례는 한 유형 또는 다른 유형을 필터링하는 것입니다. 실제 예제를 통해 이해하기 쉽습니다. 전원 설정을 참조하는 파일을 찾기 위해 "/sys"에서 문자열을 찾고 있다고 가정해 보겠습니다.
grep -r power /sys/
루트가 아닌 일반 사용자가 읽을 수 없는 파일이 많이 있습니다. 이로 인해 "권한 거부됨" 오류가 많이 발생합니다.
이러한 요소는 출력을 복잡하게 만들고 원하는 결과를 찾기 어렵게 만듭니다. "권한 거부됨" 오류는 stderr의 일부이므로 "/dev/null"로 리디렉션할 수 있습니다.
grep -r power /sys/ 2>/dev/null
보시다시피 훨씬 읽기 쉽습니다.
다른 경우에는 반대로 수행하는 것이 유용할 수 있습니다. 오류만 볼 수 있도록 표준 출력을 필터링합니다.
ping google.com 1>/dev/null
위의 스크린샷은 리디렉션하지 않고 대상 시스템에 도달할 수 있을 때 ping이 정상적인 출력을 표시함을 보여줍니다. 두 번째 명령은 네트워크가 온라인 상태일 때는 아무 것도 표시되지 않고 연결이 끊어지면 오류 메시지만 표시됩니다.
stdout과 stderr을 두 개의 다른 위치로 리디렉션할 수 있습니다.
ping google.com 1>/dev/null 2>error.log
이 경우 stdout 메시지는 전혀 표시되지 않으며 오류 메시지는 "error.log" 파일에 저장됩니다.
모든 출력을 /dev/null로 리디렉션
때로는 모든 출력을 제거하는 것이 유용합니다. 두 가지 방법이 있습니다.
grep -r power /sys/ >/dev/null 2>&1
문자열 >/dev/null
"stdout을 /dev/null로 보내기"를 의미하고 두 번째 부분인 2>&1
, stderr을 stdout으로 보내는 것을 의미합니다. 이 경우 stdout을 단순히 "1"이 아닌 "&1"로 참조해야 합니다. "2>1"을 작성하면 stdout을 "1"이라는 파일로 리디렉션합니다.
여기서 중요한 것은 순서가 중요하다는 것입니다. 다음과 같이 리디렉션 매개변수를 반대로 하면:
grep -r power /sys/ 2>&1 >/dev/null
의도한 대로 작동하지 않습니다. 2>&1
해석되면 stderr이 stdout으로 전송되어 화면에 표시됩니다. 다음으로 "/dev/null"로 보낼 때 stdout이 억제됩니다. 최종 결과는 모든 출력을 억제하는 대신 화면에 오류가 표시된다는 것입니다. 정확한 순서가 기억나지 않는 경우 입력하기 훨씬 쉬운 간단한 리디렉션이 있습니다.
grep -r power /sys/ &>/dev/null
이 경우 &>/dev/null
"stdout과 stderr을 모두 이 위치로 리디렉션"하는 것과 같습니다.
/dev/null로 리디렉션하는 데 유용한 기타 예
디스크가 순차 데이터를 얼마나 빨리 읽을 수 있는지 확인하고 싶다고 가정해 보겠습니다. 테스트는 매우 정확하지는 않지만 충분히 정확합니다. dd
를 사용할 수 있습니다. 이를 위해 dd는 stdout으로 출력하거나 파일에 쓰도록 지시할 수 있습니다. of=/dev/null
사용 dd에게 이 가상 파일에 쓰도록 지시할 수 있습니다. 여기서 셸 리디렉션을 사용할 필요도 없습니다. if=
읽을 입력 파일의 위치를 지정합니다. of=
어디에 쓸 출력 파일의 이름을 지정합니다.
dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct
일부 시나리오에서는 서버에서 얼마나 빨리 다운로드할 수 있는지 확인하고 싶을 수 있습니다. 그러나 불필요하게 디스크에 쓰고 싶지는 않습니다. 간단히 말해서 일반 파일에 쓰지 말고 "/dev/null"에 쓰십시오.
wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
결론
이 기사의 예가 "/dev/null"을 사용하는 독창적인 방법을 찾는 데 영감을 줄 수 있기를 바랍니다.
이 특수 장치 파일에 대한 흥미로운 사용 사례를 알고 있습니까? 아래에 의견을 남기고 지식을 공유하십시오!