Bash에서 명령 출력을 숨기는 방법


100

최종 사용자를 위해 Bash 스크립트를 더 우아하게 만들고 싶습니다. Bash가 명령을 실행할 때 출력을 숨기려면 어떻게해야합니까?

예를 들어 Bash가 실행될 때

yum install nano

다음은 Bash를 실행 한 사용자에게 표시됩니다.

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

이제 사용자로부터 이것을 숨기고 대신 표시하고 싶습니다.

    Installing nano ......

이 작업을 어떻게 수행 할 수 있습니까? 스크립트를보다 사용자 친화적으로 만드는 데 확실히 도움이 될 것입니다. 오류가 발생하면 사용자에게 표시되어야합니다.

일련의 명령이 실행되는 동안 동일한 메시지를 표시하는 방법을 알고 싶습니다.


4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001 2013-08-05


답변:


248

이것을 사용하십시오.

{
  /your/first/command
  /your/second/command
} &> /dev/null

설명

명령에서 출력을 제거하려면 두 가지 옵션이 있습니다.

  • 더 이상 입력을받지 않도록 출력 설명자 파일을 닫습니다. 다음과 같이 보입니다.

    your_command "Is anybody listening?" >&-

    일반적으로 출력은 파일 설명자 1 (stdout) 또는 2 (stderr)로 이동합니다. 파일 설명자를 닫으면 &>(아래)와 호환되지 않는 특수 BASH 구문 이므로 번호가 매겨진 모든 설명자에 대해 그렇게해야합니다 >&-.

    /your/first/command >&- 2>&-

    순서에주의하십시오 : >&- closes stdout , 원하는 작업입니다. &>-stdout 및 stderr를 -(하이픈) 이라는 파일로 리디렉션 합니다. 처음에는 똑같아 보이지만 후자는 작업 디렉토리에 stray 파일을 만듭니다. 기억하기 쉽습니다 : >&2stdout을 디스크립터 2 (stderr)로 >&3리디렉션하고, stdout을 디스크립터 3으로 >&-리디렉션 하고, stdout을 데드 엔드로 리디렉션합니다 (즉, stdout을 닫습니다).

    또한 일부 명령은 닫힌 파일 설명자를 특히 잘 처리하지 못할 수 있습니다 ( "쓰기 오류 : 잘못된 파일 설명자"). 이것이 더 나은 해결책이 될 수있는 이유입니다.

  • /dev/null모든 출력을 받아들이고 아무것도 수행하지 않는로 출력을 리디렉션 합니다. 다음과 같이 보입니다.

    your_command "Hello?" > /dev/null

    파일에 대한 출력 리디렉션의 경우 stdout과 stderr를 매우 간결하게 동일한 위치로 보낼 수 있지만 bash에서만 가능합니다.

    /your/first/command &> /dev/null

마지막으로 여러 명령에 대해 한 번에 동일한 작업을 수행하려면 전체를 중괄호로 묶습니다. Bash는 이것을 명령 그룹으로 취급 하여 출력 파일 설명자를 집계하여 한 번에 모두 리디렉션 할 수 있습니다. ( command1; command2; )구문을 사용하는 하위 셸에 익숙하다면 중괄호가 파이프에 포함하지 않는 한 중괄호가 하위 셸을 생성하지 않으므로 내부에 변수를 설정할 수 있다는 점을 제외하면 중괄호가 거의 동일한 방식으로 작동한다는 것을 알 수 있습니다.

{
  /your/first/command
  /your/second/command
} &> /dev/null

자세한 내용, 옵션 및 구문 은 리디렉션에 대한 bash 매뉴얼을 참조하십시오 .


안녕, 나는 그것이 오래된 질문이라는 것을 알고 있지만 조건부로 똑같이 할 수 있습니까? 특정 조건에서 출력을 숨기고 싶습니까? if-else에서 동일한 부분을 복제 할 수 있다는 것을 알고 있지만 더 좋은 방법이 있습니까?
Usama Zafar 2018

@UsamaZafar 스크립트의 앞부분에서 조건부로 또는 (또는 ) 로 설정 한 변수 ( "shell parameter" )를 설정 한 다음 (또는 이름을 지정하는대로) 사용하여 해당 대상으로 리디렉션합니다 . 이 경우 stdout과 stderr을 결합하지 않으려면 . /dev/null/dev/stdout/path/to/a/logfile&> $output_dest> $output_dest 2> $errors_dest
Jeff Bowman

35

stdout을 / dev / null로 리디렉션 할 수 있습니다.

yum install nano > /dev/null

또는 stdout과 stderr를 모두 리디렉션 할 수 있습니다.

yum install nano &> /dev/null.

그러나 프로그램에 조용한 옵션이 있다면 훨씬 좋습니다.


23

프로세스에는 일반적으로 두 가지 출력이 있습니다. stdout (표준 출력) 및 stderr (표준 오류)입니다.

일반적으로 정보 메시지는로 이동 sdout하고 오류 및 경고는로 이동합니다 stderr.

다음 stdout을 수행하여 명령을 끌 수 있습니다.

MyCommand >/dev/null

다음 stderr을 수행 하여 끄십시오 .

MyCommand 2>/dev/null

둘 다 끄 려면 다음을 수행 할 수 있습니다.

MyCommand 2>&1 >/dev/null

2>&1표준 출력과 같은 장소에 표준 오류를 보내 말한다.


8

출력을 /dev/null. / dev / null에 대한 자세한 정보는이 링크를 읽으십시오 .

다음과 같은 방법으로 comand의 출력을 숨길 수 있습니다.

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

표준 출력을로 리디렉션 /dev/null하지만 표준 오류는 아닙니다. 예를 들어 yum패키지를 찾을 수없는 경우 설치 중에 발생하는 오류가 표시 됩니다.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

이 코드는 표준 오류와 표준 출력이 모두 리디렉션되어 /dev/null.


1
큰 점유율은 .... 친구는 당신이 나를 보여줄 수있는 방법을 출력 명령 세트에 한 번만 동일한 메시지에
user2650277

5

>/dev/null 2>&1모두 뮤트 stdoutstderr

yum install nano >/dev/null 2>&1

4

이 경우 출력을 제거하기 위해 bash를 사용해서는 안됩니다. Yum에는 -q출력을 억제 하는 옵션 이 있습니다.

가장 확실히 사용하고 싶을 것입니다. -y

echo "Installing nano..."
yum -y -q install nano

yum에 대한 모든 옵션을 보려면를 사용하십시오 man yum.


감사합니다. apt-get이 -qq를 억제하기 위해 사용했기 때문에 yum이 하나를 가지고 있다고 가정했습니다. 이것은 내가하는 일에 도움이되었습니다.
Hyperion

0
.SILENT:

콜론없이 스크립트 시작 부분에 ".SILENT :"를 입력합니다.

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