Bash 스크립트에서 출력을 침묵시키는 방법은 무엇입니까?


149

stdout으로 출력하고 파일로 파이핑하는 동안 Bash 스크립트에서 해당 출력을 침묵시키는 프로그램이 있습니다.

예를 들어, 프로그램을 실행하면 다음이 출력됩니다.

% myprogram
% WELCOME TO MY PROGRAM
% Done.

다음 스크립트가 터미널에 아무것도 출력하지 않기를 원합니다.

#!/bin/bash
myprogram > sample.s

내가 기억하는 것에서 출력을 파일로 리디렉션하면 출력이 터미널로 에코되지 않습니다. 당신에게 효과가없는 것은 무엇입니까?
아논.


답변:


187

stderr로 출력되면 침묵시킬 것입니다. 파일 디스크립터 2를 재지 정하여이를 수행 할 수 있습니다.

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
"&>"줄은 방금 게시 한 것보다 짧은 버전입니다. 나는 그 지름길을 본 적이 없다. 공감.
chradcliffe

5
&>bash 4보다 훨씬 오래되었습니다.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams changelog 문서화 &>소개를 링크 할 수 있습니까 ? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208>>&4.0에 도입 되었음을 나타냅니다 . 언급은 &>없지만 CHANGES는 2.0으로 돌아가므로 이미 1.x에 있다고 생각합니다.
tripleee

git blameredir.c1998 포인트 현재의 코드베이스에서 여전히 가장 오래된 발생을 커밋합니다.
tripleee 2016 년

60

stderr를 stdout으로 리디렉션

그러면 stderr (설명자 2)가 stdout 인 파일 설명자 1로 경로 재 지정됩니다.

2>&1

stdout을 파일로 리디렉션

이제 이것을 수행하면 stdout을 파일로 리디렉션합니다. sample.s

myprogram > sample.s

stderr 및 stdout을 파일로 리디렉션

두 명령을 결합하면 stderr 및 stdout이 모두 sample로 리디렉션됩니다.

myprogram > sample.s 2>&1

stderr 및 stdout을 / dev / null로 리디렉션

/dev/null응용 프로그램을 완전히 자동으로 끄려면 리디렉션 하십시오.

myprogram >/dev/null 2>&1

13
마지막 것은 리디렉션 연산자가 없습니다. 그것은 있어야합니다 myprogram >/dev/null 2>&1(전의 웨지 /dev/null와 방향 전환 순서).
tripleee 2016 년

2
하지 않을 myprogram &>/dev/null충분?
JaviOverflow

38

모든 출력 :

scriptname &>/dev/null

가지고 다닐 수 있는:

scriptname >/dev/null 2>&1

가지고 다닐 수 있는:

scriptname >/dev/null 2>/dev/null

최신 배쉬 (휴대용 아님) :

scriptname &>-

작동하지 않습니다. 실제로라는 이름의 파일을 생성 -하고 &>비 휴대용 Bourne 쉘 확장 기능입니다.
PhilT

echo moo 1>&-파일 디스크립터 1이 닫혀 있기 때문에 휴대용 등가 에서 오류가 발생합니다.-bash: echo: write error: Bad file descriptor
tripleee

11

STDOUT과 STDERR을 모두 [모든 것] 원하는 경우 가장 간단한 방법은 다음과 같습니다.

#!/bin/bash
myprogram >& sample.s

그런 다음과 같이 실행하면 ./script터미널로 출력되지 않습니다. :)

"> &"는 STDERR 및 STDOUT을 의미합니다. 는 &또한 파이프와 동일한 방식으로 작동 : ./script |& sed 그 SED에 모든 것을 보내드립니다


7
man bash ( "표준 출력 및 표준 오류 재 지정"에서)는 &>와> &는 동일하지만 첫 번째 (&>)가 선호됩니다. 그러나 | &는 파이프에서이를 수행하는 유일한 방법입니다.
John Mellor

1
@John No, 파이프의 휴대용 방법은 다음과 같습니다.a 2>&1 | b 2>&1 | c
Tripleee

9

여전히 답변을 찾기 위해 고심하는 경우, 특히 출력 파일을 생성하고 명확한 대안을 선호하는 경우 : echo "hi" | grep "use this hack to hide the oputut :) "


2
재미있는 해킹 ... 영리함을위한
찬성


0

참고 :이 답변은 "쉘 스크립트 Linux를 실행하는 동안 에코를 끄는 방법"이라는 질문과 관련이 있으며이 질문과 중복 된 것으로 표시되었습니다.

실제로 에코를 끄려면 명령은 다음과 같습니다.

stty -echo

(예를 들어, 비밀번호를 입력하고 읽을 수 없도록하려는 경우 스크립트 끝에서 에코를 켜야합니다. 그렇지 않으면 스크립트를 실행하는 사람이 자신의 비밀번호를 볼 수 없습니다. / she를 입력 한 다음 에코를 켜려면 다음을 실행하십시오.

stty echo


0

스크립트에서 유용합니다 :


숨길 프로그램이 전혀 존재 하지 않더라도 (부모 스크립트가 중단되지 않음) STDOUT을 숨기는 동안 파일에 STDERR 만 가져 오십시오 .

stty -echo && ./programMightNotExist 2> errors.log && stty echo

부모 스크립트를 죽이더라도 중단되지는 않지만 완전히 분리하고 모든 것을 침묵시킵니다 ./prog.

 ./prog </dev/null >/dev/null 2>&1 &

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.