[unix] / dev / null로 리디렉션

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 파일로 압축하는 방법을 알 수 없기 때문에 모든 유형의 오류가 발생할 수 있습니다.



답변

아니요, 이렇게해도 스크립트가 중단되지 않습니다. 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


답변

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

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

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

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

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

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

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

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

답변

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에서 오는 오류는 여전히 콘솔에 기록됩니다.


답변

배쉬 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, 텍스트 등과 같은 여러 가지 편리한 형식) 상의 리눅스 문서 프로젝트 가이드 페이지. 내가 유용하다고 생각한 몇 가지는 다음과 같습니다.


답변