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.