/ dev / null로 리디렉션


144

bash 셸 스크립트 예제를 읽고 있습니다.

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

여기서 "/ dev / null 2> & 1"의 사용법을 이해하려고합니다. 처음에는 스크립트가 충돌하지 않고 오류를 정상적으로 무시하기 위해이 스크립트가 / dev / null을 사용한다고 생각했습니다 (프로그래밍 언어의 예외 처리 시도와 같은 종류). tar를 사용하여 디렉토리를 tar 파일로 압축하는 방법을 알 수 없기 때문에 모든 유형의 오류가 발생할 수 있습니다.


3
리디렉션 /dev/null은 충돌을 방지하지 않지만 stdout 및 stderr 출력 스트림을 정리합니다. tar다양한 방법으로 오류가 발생할 수 있습니다. 쓰기 권한이 없거나 파일이 이미있을 수 있습니다.
Sparhawk

3
불필요한 출력을 피하는 트릭입니다. tar가 오류를 일으킬 수있는 이유 : 대상 디렉토리가 존재하지 않기 때문에, 소스가 없기 때문에, 대상에 대한 쓰기 액세스 권한이 없거나 소스에 대한 읽기 권한이 없기 때문에 tar$ PATH에 없기 때문입니다. 디스크에 I / O 오류가 발생했기 때문에 버전이 변경되어 다른 구문이 필요 tar하기 때문에 장치에 남은 공간이 없기 때문에 충돌이 tar발생했습니다. 더 많이 찾을 수있을 것입니다.
terdon

답변:


223

아니요, 이렇게해도 스크립트가 중단되지 않습니다. tar프로세스 에서 오류가 발생하면 (예 : 권한 거부, 해당 파일 또는 디렉토리 없음) 스크립트가 여전히 충돌합니다.

를 사용 > /dev/null 2>&1하면 모든 명령 출력 ( stdoutstderr)이 모두로 리디렉션 되므로 /dev/null출력이 터미널로 인쇄되지 않습니다.

기본적으로:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

스크립트에서 다음을 사용합니다 > /dev/null.

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

그리고 나서 2>&1:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
이해하자면 > /dev/null 2>&1,이 명령은 결과적으로 stderr ==> stdoutstderr이 stdout에 여전히 인쇄됩니까 ??
Weishi Zeng

11
아마도 너무 중요하지는 않지만 무엇 fd입니까?
kev


7
: 이유는 무엇 CMD > /dev/null 2>&1일하지만 CMD 2>&1 > /dev/null여전히 STDERR 줘?
dbmikus

3
권장 사항 : 2>& 1코드 예제에서 숫자와 앰퍼샌드가 경로 재 지정 연산자의 일부로 간주됨을 강조하십시오. 사이에 파일로 리디렉션 공간을하는 것이 일반적이다 >하고 /path/to/file, 파일 기술자로 리디렉션 본질적으로 같은 것입니다.
Henk Langeveld

21

여기서 "> / dev / null 2> & 1"의 사용법을 이해하려고합니다.

( /dev/null귀하의 질문에 앞서 리디렉션을 추가했습니다 .)

위의 STDOUTSTDERR로 리디렉션 됩니다 /dev/null. 를에 병합하여 작동 STDERR합니다 STDOUT. 본질적으로 명령의 모든 출력null 장치 로 리디렉션됩니다 .

... 스크립트를 중단시키지 않고 (프로그래밍 언어의 예외 처리 시도와 같은 종류).

그것은 다른 것과는 전혀 try/catch다릅니다. 단순히 명령의 모든 종류의 출력 (오류 포함)을 침묵 시킵니다.

tar를 사용하여 디렉토리를 tar 파일로 압축하는 방법을 알 수 없기 때문에 모든 유형의 오류가 발생할 수 있습니다.

다음과 같은 여러 가지 이유로 오류가 발생할 수 있습니다.

  • 보관하려는 파일 또는 쓰려는 파일에 대한 권한이 부적절합니다.
  • 아카이브를 만들기위한 디스크 공간 부족

잘 설명했다.
Aditya Gupta

7

CMD를 실행할 때> / dev / null 2> & 1

STDOUT은 / dev / null로 리디렉션 된 후 STDERR은 / dev / null로 설정된 STDOUT의 ADDRESS로 리디렉션되므로 STDOUT 및 STDERR은 / dev / null을 가리 킵니다.

반대로 CMD 2> & 1> / dev / null을 실행할 때

STDERR은 STDOUT의 ADDRESS (그 순간의 파일 디스크립터 1 또는 / proc / self / fd / 1)로 경로 재 지정된 후 STDOUT은 / dev / null로 경로 재 지정되지만 STDERR은 fd1로 경로 재 지정을 유지합니다 !! 결과적으로 STDOUT의 정상 출력은 버려지지만 STDERR에서 오는 오류는 여전히 콘솔에 기록됩니다.


-2

배쉬 I / O 리디렉션

일을 정리하는 주요 아이디어는 다음과 같습니다.

영어 사용자가 일반적으로 읽는 방식과 반대되는 방향으로 RIGHT에서 LEFT로 리디렉션이 적용됩니다.


따라서이 코드 :

command > filename 2>&1

리디렉션 stderrstdout ( 2>&1)과 전송 stdout(리디렉션 포함 stderr로) filename( > filename). 다음은 ABSG 설명입니다 (20 장) .

이 코드는 :

command >>/dev/null 2>&1

리디렉션 stderrstdout하기 /dev/null에 의미 ...하는 아무 . 전송 된 내용 /dev/null은 어떤 식으로도 저장, 캐시 또는 기억되지 않습니다.

그들은 단지 ' 어딘가 '에 보내져 잊혀졌습니다. 이것은 프로그램을 실행하고 NO 출력을 생성하는 방법이며 명령 행 또는 로그 파일에 표시되지 않습니다.


나는 이런 유형의 질문을 꽤 많이 본다. 주로 몇 년 동안 코딩하지 않았기 때문에 직접 조사해야했기 때문이다. ABSG의 유용한 정보는 다음과 같습니다.

"리디렉션이란 단순히 파일, 명령, 프로그램 또는 스크립트의 출력을 캡처하여 다른 파일, 명령, 프로그램 또는 스크립트에 입력으로 보내는 것을 의미합니다."

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG : 고급 Bash 스크립팅 가이드 : 위의 제 20 장 링크가 오픈 소스의 I / O 리디렉션 페이지로 연결되는 링크입니다 tldp.org 문서가 호출 된 고급 Bash 스크립팅 가이드 멘델 쿠퍼를. "쉘 스크립팅 기술에 대한 심층 탐구"로 나열되어 있으며, 나는 동의합니다. 그것은 훌륭한 자원이며 모든 종류의 미친 상황에 대한 수많은 대답을 가지고 있습니다.

기타 귀중한 자원 : 현재 / 유지 관리 부분에 많은 귀중한 자원이있다 (HTML, PDF, 텍스트 등과 같은 여러 가지 편리한 형식) 상의 리눅스 문서 프로젝트 가이드 페이지. 내가 유용하다고 생각한 몇 가지는 다음과 같습니다.


1
아니요, 리디렉션은 왼쪽에서 오른쪽으로 처리됩니다. 귀하의 예에서 표준 출력은로 리디렉션되고 filename, 표준 오류는 현재 표준 출력이 진행되는 곳으로 리디렉션됩니다 filename. 반대 방향 인 경우 표준 출력 만로 리디렉션되는 동안 표준 오류가 터미널에서 종료됩니다 filename. 또한,의 command >file1 2>file2, file2가 작성되지 않을 것이다 file1(여부에 상관없이 만들 수 없습니다 file1file2실제로 완전히 다른 경로 이름이었다).
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.