exec >/dev/null 이후 표준 출력으로 인쇄하는 방법

exec >/dev/null 이후 표준 출력으로 인쇄하는 방법

스크립트에는 표준 출력으로 인쇄하는 긴 명령 목록이 있습니다. 모든 출력을 숨기고 싶습니다. 따라서 모든 명령을 리디렉션하는 대신

exec >/dev/null

처음에는.

echo일반 리디렉션을 "일시적으로 무시"하고 실제로 stdout으로 인쇄하는 사이에 한 번 호출하려면 어떤 옵션이 있어야 합니까 ?

답변1

무엇 echo이든 표준 출력으로 인쇄됩니다. /dev/null요점은 원래 표준 출력이 전혀 특별하지 않거나 리디렉션된 표준 출력보다 "실제"라는 것입니다 .

stdout이 원래 가리키는 위치의 복사본을 유지하려면 파일 설명자를 다른 번호로 복사하고 거기에 유지하려는 출력을 보낼 수 있습니다.

exec 3>&1            # duplicate original stdout to fd 3
exec 1>/dev/null     # send stdout to /dev/null
printf "what\n"      # this goes to stdout = /dev/null
printf "hello " >&3  # this goes to fd 3 = original stdout
# optionally:
exec 1>&3            # put the original stdout back
exec 3>&-            # close fd 3
printf "there\n"     # to current stdout = original stdout again

또는 Bash/ksh93/zsh에서 동적으로 할당된 fd를 사용하십시오(제가 이 작업을 올바르게 수행하길 바랍니다).

exec {orig}>&1            # duplicate original stdout to some fd,
                          # store number in $orig
exec 1>/dev/null          # send stdout to /dev/null
printf "what\n"           # this goes to stdout = /dev/null
printf "hello " >&"$orig" # this goes to fd in $orig = original stdout
# optionally:
exec 1>&"$orig"           # put the original stdout back
exec {orig}>&-            # close fd in $orig
printf "there\n"          # to current stdout = original stdout again

두 경우 모두 ksh93fd (3 이상)에는 close-on-exec 플래그가 표시되지만 $origbash/zsh는 그렇지 않습니다. 하지만 bash 5.2 이상에서는 shopt -s varredir_closefds Created 사용 구문에 close-on-exec 플래그를 추가 할 수 있습니다 exec {var}>....

이 플래그가 설정되지 않으면 fd 3이방법을 제공다른 명령에. 예를 들어, 원시 표준 출력이 파이프로 전송되고 파이프가 열린 상태로 유지될 수 있는 백그라운드 프로세스를 시작하는 명령을 실행하는 경우 실제로 문제가 될 수 있습니다. 이런 사람들을 위해 달리면 cmd 3>&-이 문제가 해결됩니다.

답변2

echo출력을 구체적으로 다음으로 이동 하려는 경우스크립트가 시작된 터미널로 이동,당신이 사용할 수있는:

echo "some message" > /dev/tty

/dev/tty약간의 "마법": 어떤 프로세스를 사용하든 항상 해당 프로세스와 관련된 터미널에 연결됩니다.

물론, 이렇게 스크립트를 실행하면어떤 터미널과도 연결되지 않음(예를 들어, crontab에서 또는 options를 ssh somehost script.sh지정하지 않고 ) 오류가 발생합니다.-tssh

$ ssh hostname "echo foo > /dev/tty"
Enter passphrase for key...:
bash: line 1: /dev/tty: No such device or address

$ ssh -t hostname "echo foo > /dev/tty"
Enter passphrase for key...:
foo
Connection to hostname closed.

답변3

echo중간에 하나가 포함된 간단한 명령 목록이 있는 경우 다음을 수행할 수 있습니다.

{
  주문하다1
  주문하다2
  주문하다
  주문하다4
} > /dev/null
echo 'High Five' # 스크립트의 표준 출력으로 이동합니다.
{
  주문하다6
  주문하다7
  주문하다8
  주문하다9  
} > /dev/null
echoif- 또는 루프 와 같은 복합 명령 내부에서는 then이 방법이 작동하지 않습니다 .

관련 정보