Bash를 사용하여 명령의 모든 출력을 억제하려면 어떻게합니까?


296

매개 변수가있는 프로그램을 실행하는 Bash 스크립트가 있습니다. 그 프로그램은 어떤 상태를 출력합니다 (이 작업을 수행하고 있습니다 ...). 이 프로그램은 조용히 할 수있는 옵션이 없습니다. 스크립트가 아무것도 표시하지 못하게하려면 어떻게합니까?

Windows ' echo off '와 같은 것을 찾고 있습니다.

답변:


510

다음은 표준 출력을 널 장치 (비트 버킷)로 보냅니다.

scriptname >/dev/null

또한 오류 메시지를 보내려면 다음 중 하나를 사용하십시오 (첫 번째는 모든 쉘에서 작동하지 않을 수 있음).

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

메시지를 기록하고 싶지만 표시하지 않으려면 다음 /dev/null과 같은 실제 파일로 바꾸십시오 .

scriptname &>scriptname.out

완전성을 위해 Windows cmd.exe ( "nul"은 "/ dev / null"에 해당)에서 다음과 같습니다.

scriptname >nul 2>nul

8
'&>'는 bash (및 C 쉘)에 고유합니다. Korn 및 Bourne 쉘에는 2> / dev / null 또는 2> & 1이 필요합니다 (stdout을 stdout과 같은 위치로 보내려면). Korn 쉘은 '&>'를 "백그라운드에서 &까지 실행 한 다음 빈 명령에서 i / o 리디렉션을 수행하는"것으로 해석합니다.
Jonathan Leffler 2016 년

2
일부 명령은 표준 출력 / 오류가 아닌 터미널 장치에 직접 기록합니다. 테스트하려면 echo foo > $(tty)스크립트를 넣고 실행하십시오 ./test.sh &> /dev/null. 출력은 여전히 ​​터미널에 인쇄됩니다. 물론 이러한 명령을 사용하지 않는 스크립트를 작성하는 경우에는 문제가되지 않습니다.
l0b0

1
@ l0b0, 스크립트 (또는 다른 프로그램)를 다른 방식으로 만들어서 모든 출력이 예제와 상관없이 리디렉션되도록하는 방법이 있습니까? 나는 스크린과 스크립트가 이와 같은 것을 할 수 있다는 것을 알고 있지만 둘 다 까다 롭고 * nix마다 다릅니다.
브렌트

@yang /dev/null은 Cygwin에 존재하므로 사용할 필요가 없습니다 nul.
dimo414

47

같은 것

script > /dev/null 2>&1

그러면 표준 출력 오류 출력 이 방지되어 둘 다로 리디렉션됩니다 /dev/null.


5
또한 타이핑을 저장하려면 &>를 사용하여 달성하십시오.)
andynormancx

1
이것을 gs (GhostScript) 명령에 추가하더라도 여전히 출력됩니다. **** 경고 : 파일에 손상된 %% EOF 마커 또는 %% EOF 이후의 가비지가 있습니다. 어떤 충고?
ZurabWeb

이것은 유닉스 시스템에서 프로세스를 실행하지 않는, 내가해야 할 일을했을2>/dev/null
alper

13

시험

: $(yourcommand)

: "아무것도하지"의 줄임말입니다.

$() 단지 당신의 명령입니다.


3
매우 흥미롭지 만 한계가 있습니다. 반환 된 상태 코드는 항상 0(성공)입니다. false항상 1(실패)를 반환 하는 명령 을 사용하는 예를 보자 . 예를 들어 ( echo foo | tee file ; false ) && echo bar표시합니다 foo. 트릭을 사용하여 출력을 억제합니다 ( : $(echo foo | tee file ; false) ) && echo bar.. 그러나 bar반환 상태 코드는 0(이것은에서 반환 된 상태 코드가 false아님)을 의미합니다. 이 제한을 제공하여 답변을 업데이트하십시오. 건배
올리버

2
@olibre, DUMMY=$(yourcommand)어때요? 언급 한 제한이 없습니다. :)
semente

3
@semente Perfect : 명령 DUMMY=$( echo foo | tee file ; false ) && echo bar이 아무 것도 표시하지 않습니다. 그리고 명령이 DUMMY=$( echo foo | tee file ; true ) && echo bar표시됩니다 bar. 귀하의
의견을 표명

9

일부 상황에 적합한 대안은 명령 결과를 변수에 지정하는 것입니다.

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Bash 및 기타 POSIX 명령 행 인터프리터는 변수 지정을 명령으로 간주하지 않으므로 현재 명령의 리턴 코드가 존중됩니다.

참고 :typeset 또는 declare키워드를 사용한 할당 은 명령으로 간주되므로 하위 쉘에서 실행 된 명령이 아니라 할당 자체 인 경우 평가 된 리턴 코드는 다음과 같습니다.

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

andynormancx 'post 와 같이 이것을 사용하십시오 (유닉스 환경에서 작업하는 경우).

scriptname > /dev/null

또는 이것을 사용할 수 있습니다 (Windows 환경에서 작업중인 경우).

scriptname > nul

1
실제로 Windows 셸보다 더 잘 수행 할 수 있습니다. 대신 "scriptname> nul"을 사용하는 경우 "nul"은 Windows의 / dev / null에 해당하므로 삭제할 파일이 없습니다.
andynormancx 2016 년

1
@andynormancx : Windows 파일 시스템 레이아웃이 싫어요. NUL, COM1, LPT1, CON 등과 같은 파일 이름은 네트워크 공유와 같이 파일 이름을 가질 수있는 파일 시스템에 있더라도 디렉토리에 관계없이 파일 이름을 "예약"합니다.
dreamlax

DOS 5.x부터 실제로 NUL을 사용했다고 생각하지 않습니다.이 답변을 보았을 때 갑자기 기억이
났습니다

> nulcygwin 또는 git bash가있는 Windows에서 사용 하고 지금 nul삭제할 수없는 파일 이 붙어있는 경우이 답변을 시도해보십시오 . 매력처럼 작동했습니다.
데몬 페인터

4

Linux 문서 프로젝트 에서이 예제를 살펴보십시오 .

3.6 샘플 : stderr 및 stdout 2 파일

이것은 프로그램의 모든 출력을 파일로 저장합니다. 명령이 절대 침묵으로 전달되도록하려면 때때로 cron 항목에 적합합니다.

     rm -f $(find / -name core) &> /dev/null 

즉,이 간단한 리디렉션을 사용할 수 있습니다.

/path/to/command &>/dev/null

1

스크립트에서 출력 할 줄에 다음을 추가 할 수 있습니다.

some_code 2>>/dev/null

그렇지 않으면 시도해 볼 수도 있습니다

some_code >>/dev/null

1
호기심에서 / dev / null ..까지 >>를 본 적이 없다.
Florian Berndl

모든 출력을 억제하고 있습니까?
Peter Mortensen

왜 이중 ">"( >>)입니까?
피터 모텐슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.