스크립트:
#!/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
&>
bashism이므로 >/dev/null 2>&1
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
다른 유형의 파일이 아닌 tty인 경우에만 원래 표준 입력을 리디렉션하십시오.
$ zsh -c 'readlink /proc/self/fd/0 &' </dev/tty
/dev/null
$ zsh -c 'readlink /proc/self/fd/0 &' </dev/zero
/dev/zero
모든 셸에서 작동하는 해결 방법은 표준 입력을 다른 파일 설명자로 복사하고 거기에서 첫 번째 명령의 표준 입력을 리디렉션하는 것입니다.
#! /bin/sh
exec 3<"${1:-/dev/stdin}"
cat <&3 | timeout 30 xclip -i -selection clipboard -verbose -r >/dev/null 2>&1 &