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
하면 모든 명령 출력 ( stdout
및 stderr
)이 모두로 리디렉션 되므로 /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
귀하의 질문에 앞서 리디렉션을 추가했습니다 .)
위의 STDOUT
및 STDERR
로 리디렉션 됩니다 /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
리디렉션 stderr
을 stdout
제 ( 2>&1
)과 후 전송 stdout
(리디렉션 포함 stderr
로) filename
( > filename
). 다음은 ABSG 설명입니다 (20 장) .
이 코드는 :
command >>/dev/null 2>&1
리디렉션 stderr
및 stdout
하기 /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, 텍스트 등과 같은 여러 가지 편리한 형식) 상의 리눅스 문서 프로젝트 가이드 페이지. 내가 유용하다고 생각한 몇 가지는 다음과 같습니다.
- Machtelt Garrels의 초보자를위한 배쉬 가이드
- Machtelt Garrels의 Linux 소개
- Gareth Anderson의 GNU / Linux 명령 줄 도구 요약
- Binh Nguyen의 리눅스 파일 시스템 계층
- Linux 보안 및 최적화 (pdf 만 해당) : Gerhard Mourani의 최고의 솔루션