dev/null은 특수한 파일로 여기로 오는 모든 데이터를 버리는 마치 💫블랙홀 처럼 동작한다.
일반적으로 stdout 또는 stderr를 화면에 출력하지 않고 버리고 싶을 때 사용한다.
stat /dev/null
로 보면 이 파일의 유형은 character special file 이며
파일 size도 0이고 할당된 block도 0이다.실행 파일이 아니므로 | (pipe) 연산자를 사용할 수 없고 파일 redirection을 사용해야 한다.
/dev/null 로 redirect 하면 결과를 버릴 수 있다.
❌ 위와 같이
> /dev/null
만 작성하면 여전히 오류 메시지가 버려지지 않고 뜨게 된다.
이유: 오류 메시지는 stderr에서 오지만, 위 명령문은 stdout의 결과만 버리기 때문
2>/dev/null
을 해주면 된다. (2는 stderr의 FD번호)
2>&1 로 하는 방법은 밑에서..
✅ 잘못된 명령어를 입력했지만 어떤 오류메시지도 출력되지 않는다.
사실 에러 메시지는 발생했지만 /dev/null로 redirect 되었기 때문에 표시되지 않는 것이다.
많은 사이트에서
sudo mv myfile.txt /dev/null
로 파일을 사라지게 할 수 있다고 예시로 나와 있지만 이것은 매우 위험한 작업이라고 한다.
https://askubuntu.com/questions/435887/i-can-read-from-dev-null-how-to-fix-it
https://askubuntu.com/questions/192702/can-i-recover-a-file-from-dev-null
sudo mv myfile.txt /dev/null
하면 파일이 블랙홀에 들어가 삭제되는 것이 아닌
(심지어 /dev/null 파일을 cat해서 보면 내용을 그대로 볼 수 있다)
저렇게 하면 /dev/null 파일이 myfile.txt로 대체되어버린다.
더 이상 특수한 파일인 /dev/null을 사용할 수 없을 뿐더러
이 특수한 파일을 사용하는 곳에 오류를 발생시킬 수 있다.✅ 복구방법:
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null
첫 번째echooo 'Hello null' > /dev/null
은 당연히 잘못된 명령어를 /dev/null로 보내서 버리려고 했으나 이 문장은 stdout만 버리기 때문에 오류 메시지는 여전히 표시된다.두 번째
echooo 'Hello null' > /dev/null 2>&1
에서 일단
2>&1 의 의미는 2(stderr)를 1(stdout)으로 redirect 시키는 것으로
1앞에 &가 붙은 이유는 그냥 1을 쓰면 파일이름이 1인 것으로 인식하지만
&1을 하면 File Descriptor의 1번, 즉 stdout을 가리키는 뜻이다.종합하면
echooo 'Hello null > /dev/null
은 stdout을 블랙홀로 보내버리는 것이고,
여기에 더해2>&1
은 에러도(stderr) stdout으로 redirect 하는 것이므로
결국> /dev/null 2>&1
은 stdout, stderr 모두 버리겠다는 의미이다.
https://itslinuxfoss.com/what-is-dev-null-in-linux/
https://trendoceans.com/dev-null-to-suppress-output/