[Linux] /dev/null, 2>&1

kafkaaaa·2023년 9월 20일
0

Linux

목록 보기
3/4
post-thumbnail

📌 /dev/null

dev/null은 특수한 파일로 여기로 오는 모든 데이터를 버리는 마치 💫블랙홀 처럼 동작한다.
일반적으로 stdout 또는 stderr를 화면에 출력하지 않고 버리고 싶을 때 사용한다.


$ stat /dev/null
stat /dev/null 로 보면 이 파일의 유형은 character special file 이며
파일 size도 0이고 할당된 block도 0이다.

실행 파일이 아니므로 | (pipe) 연산자를 사용할 수 없고 파일 redirection을 사용해야 한다.



📌 /dev/null Usage

1. 원하지 않는 출력 버리기

/dev/null 로 redirect 하면 결과를 버릴 수 있다.


2. 에러 메시지 숨기기

❌ 위와 같이 > /dev/null 만 작성하면 여전히 오류 메시지가 버려지지 않고 뜨게 된다.
이유: 오류 메시지는 stderr에서 오지만, 위 명령문은 stdout의 결과만 버리기 때문

2>/dev/null 을 해주면 된다. (2는 stderr의 FD번호)
2>&1 로 하는 방법은 밑에서..

✅ 잘못된 명령어를 입력했지만 어떤 오류메시지도 출력되지 않는다.
사실 에러 메시지는 발생했지만 /dev/null로 redirect 되었기 때문에 표시되지 않는 것이다.


3. 파일을 사라지게 하기 (❌)

많은 사이트에서 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



📌 2>&1

  • (File descriptor에서) 2는 stderr, 1은 stdout
  • 즉, 표준 에러를 표준 출력으로 redirect 해라.

    📌 command > /dev/null 2>&1


    첫 번째 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 모두 버리겠다는 의미이다.



Ref

https://itslinuxfoss.com/what-is-dev-null-in-linux/
https://trendoceans.com/dev-null-to-suppress-output/

profile
일모도원

0개의 댓글