devFancy BE Developer

[Linux] /dev/null 2>&1 이란

2024-06-21
devFancy

실무에서 리눅스 환경의 shell script 를 보면서 새롭게 알게된 /dev/null 2>&1 에 대해 정리하고자 한다.

/dev/null 2>&1 에 대해 알기 전에, 그 전에 리다이렉션, 파일 디스크립터에 대해 간단히 정리해보자.

Redirection

리다이렉션(입출력 재지정)이란 일반적인 키보드 입력, 화면 출력을 사용하지 않고 사용자가 직접 입력과 출력을 재지정한다는 의미이다.

기본적으로 표준 입력은 키보드에서 직접 받아오고, 표준 출력은 화면에 출력된다.

이러한 기본적인 하드웨어적인 입출력 동작을 변경하는 것이다.

그래서 키보드에서 입력을 받지 않고 파일 내용을 입력으로 받거나, 내용을 화면에 출력하지 않고 파일에 저장하는 것이다.

리다이렉션 에 대한 기호, 방향, 의미를 정리하면 아래와 같다.

리다이렉션 기호 , 방향 , 의미

  • > , 표준 출력 , 명령 > 파일 : 명령의 결과를 파일로 저장

  • >> , 표준 출력(추가) , 명령 >> 파일 : 명령의 결과를 기존 파일 데이터에 추가

  • < , 표준 입력 , 명령 < 파일 : 파일의 데이터를 명령에 입력

File Descriptor

파일 디스크립터는 시스템에서 할당 받은 파일을 대표하는 0이 아닌 정수 값으로, 쉘 이나 시스템 프로그래밍에서 자주 접할 수 있다.

즉, 음수가 아닌 0과 양수인 정수 값을 가진다.

유닉스 시스템은 일반적인 파일부터 디렉토리, 소켓, 파이프 등 모든 객체들을 파일로 관리하는데, 쉘은 작업 중 필요한 파일에 일련번호를 붙여서 관리한다.

일련번호파일 디스크립터이며, 표준 입출력 장치도 이 일련번호로 제어된다.

기본적으로 3가지(input, output, error)가 있다.

  • 표준 입력(Standard Input, STDIN): 명령어에 입력될 내용을 저장 / 일련번호: 0

  • 표준 출력(Standard Output, STDOUT): 명령어에서 출력될 내용을 저장 / 일련번호: 1

  • 표준 오류(Standard Error, STDERR) : 명령어에서서 출력될 에러 메시지를 저장 / 일련번호: 2

그래서 사용자는 이 일련번호를 이용하여 입출력 장치를 리다이렉션할 수 있는 것이다.

2>&1 이해하기

위에서 설명한 리다이렉션의 기호와 파일 디스크립터를 가져와서 해석해보면 다음과 같다.

$ 2>&1

2>&1 는 표준 에러를 표준 출력(&1) 으로 리다이렉션(재지정)한다는 의미이다.

위의 명령어를 제대로 알기 전에, 몇 가지 예제로 정리해보자.

정상적이지 않은 명령어인 경우

$ ls -ERR 2> log.txt

ERR 라는 리눅스에 존재하지 않는 옵션을 주면, 에러가 발생하게 되는데, 이러한 에러 메시지를 화면에 출력하는게 아니라 log.txt라는 파일에 저장하는 것이다.

이렇게 작성하면, 만일 프로그램이 에러가 나더라도 화면에 에러 메시지가 나오지 않고, 파일에 기록되어서 나중에 확인할 수 있다는 점이다.

정상적인 명령어인 경우

$ ls -al 2> log.txt

정상적인 명령어를 입력한 경우에는 조회해보면 아무런 내용이 들어가 있지 않다.

즉, 2> 표준 에러에 대한 리다이렉션은 에러 메시지만 취급하기 때문에 정상적인 명령에 대해서 아무런 작업을 하지 않는 것이다.

명령어가 성공해도 파일에 내용을 넣고, 실패해도 파일에 내용을 넣고 싶은경우 -> 한 번에 기록하고 싶다면 어떻게 해야할까?

$ ls > log.txt 2> log.txt
# 만일 명령어를 실행해서 성공하면 표준 출력 재지정을 통해 파일에 기록하고
# 명령어가 실패하면 표준 에러 재지정을 통해 파일에 기록하도록 조정

명령어가 성공하면 결과 내용이 파일에 기록되고, 명령어가 실패해도 에러 메시지가 파일에 기록될 수 있다.

여기서 2>&1 은 위의 명령어를 함축한 버전이라고 보면 된다.

$ ls > log.txt 2> log.txt #이전 버전
$ ls > log.txt 2>&1 #함축한 버전
  • & : &1 에서 & 부분은 숫자 1을 표준 출력 일련번호로 인식하게 해주는 설정이다. 만일 & 기호를 안쓰게 되면 파일로 읽혀 버리기 때문이다.

  • 2> : 표준 에러를 표준 출력(&1)으로 재지정한다는 의미이다.

/dev/null 이해하기

$ nohup.out > /dev/null 2>&1

여기서 /dev/null블랙홀이라고 이해하면 된다.

이 경로에 보내지는 모든 파일과 데이터들이 블랙홀에 빨려들어가 (없을)무가 된다.

즉, /dev/null 로 결과를 보내는 것은 데이터를 모두 지워서 화면에 표시하지 않는다는 것을 말한다.

따라서 출력이 필요 없는 경우 > /dev/null 로 리다이렉션 시키면 된다.

결론적으로 > /dev/null 2>&1은 표준 출력과 표준 에러를 모두 지우겠다는 의미이다.

Reference


Comments

Index