왜 ''cat "${1:-/dev/stdin} | ... &>/dev/null''은 bash에서는 작동하지만 대시에서는 작동하지 않습니까?

왜 ''cat "${1:-/dev/stdin} | ... &>/dev/null''은 bash에서는 작동하지만 대시에서는 작동하지 않습니까?

스크립트:

#!/bin/sh
#
# reads stdin/file and copies it to clipboard
# clears it after 30s
#
cat "${1:-/dev/stdin}" | timeout 30 xclip -i -selection clipboard -r -verbose &>/dev/null &

stdin만 작동하지 않는다는 것을 알 수 있습니다(bash를 사용하면 stdin/file에서 작동함).
PS verbose는 xclip이 데몬화되지 않도록 만드는 데 사용됩니다.

답변1

&>>/dev/null 2>&1bashism이므로 POSIX 쉘용으로 변경해야 합니다.

답변2

[이 답변은 스크립트의 비동기 파이프라인에 관한 것입니다. 더 이상 사용되지 않는 &>bash 연산자와 항상 대신 사용해야 하는 이유는 >output 2>&1다음을 참조하세요.더 이상 사용되지 않고 더 이상 사용되지 않는 구문]

#! /bin/sh
cat "${1:-/dev/stdin}" | ... &

&여기에는 스크립트에서 시작되어 ( 에 의해 종료되었기 때문에) 비동기적으로 실행되는 파이프라인이 있습니다. 즉, 작업 제어가 비활성화 된 셸에서 시작됩니다.

에 따르면기준:

command1 & [command2 & ... ]

명시적 리디렉션이 수행되기 전에 비동기 목록에 대한 표준 입력은 와 동일한 속성을 가진 파일에 할당된 것으로 간주됩니다 /dev/null.

문제는 dash, ksh, mksh, yash등이 "비동기 목록"을 파이프라인을 포함한 모든 명령으로 해석하고 첫 번째 명령의 표준 입력을 다음에서 리디렉션한다는 것입니다 /dev/null.

$ echo foo | dash -c 'cat | tr fo FO & echo DONE'
DONE
$ echo | dash -c 'readlink /proc/self/fd/0 | cat & echo DONE'
DONE
/dev/null

그러나 bash이를 "간단한 명령"으로만 해석하고 명령이 /dev/null실행될 때 부터 표준 입력만 리디렉션합니다.~ 아니다파이프라인의 일부:

$ echo foo | bash -c 'cat | tr fo FO & echo DONE'
DONE
FOO
$ echo | bash -c 'readlink /proc/self/fd/0 | cat & echo DONE'
DONE
pipe:[69872]
$ echo | bash -c 'readlink /proc/self/fd/0 & echo DONE'
DONE
/dev/null
$ bash -c 'cat | tr a A & echo DONE'
DONE
cat: -: Input/output error

zsh/dev/null다른 종류의 파일이 아닌 원래 stdin이 tty일 때만 리디렉션됩니다 .

$ zsh -c 'readlink /proc/self/fd/0 &' </dev/tty
/dev/null
$ zsh -c 'readlink /proc/self/fd/0 &' </dev/zero
/dev/zero

모든 셸에서 작동하는 해결 방법은 stdin을 다른 파일 설명자로 복제하고 여기에서 첫 번째 명령의 stdin을 리디렉션하는 것입니다.

#! /bin/sh
exec 3<"${1:-/dev/stdin}"
cat <&3 | timeout 30 xclip -i -selection clipboard -verbose -r >/dev/null 2>&1 &

답변3

dashPOSIX 표준으로 자리 잡았습니다. POSIX는 리디렉션만 지정했습니다 [n]>. 그러나 bash많은 고유한 기능을 소개합니다. &>는 그 중 하나이며 출력 설명자( stderrstdout)를 의미합니다.

당신은 기사를 읽어야합니다배쉬와 대시호환성.

어쩌면 도움이 될지도 몰라체크배시즘bash스크립트에서 특정 지침을 찾는 데 도움이 되는 유틸리티입니다 .

관련 정보