이 기능은 ksh
(ksh86에서 처음 문서화 됨)에 의해 도입 되었으며이 /dev/fd/n
기능 을 사용하고있었습니다 (일부 BSD 및 AT & T 시스템에서 독립적으로 추가됨). 에서 ksh
와 ksh93u까지이 작업 시스템이 지원은 / dev / FD / N 없었다면하지 않을 것입니다. zsh, bash ksh93u+
이상은 / dev / fd / n을 사용할 수없는 임시 명명 된 파이프 (SysIII에 추가 된 명명 된 파이프)를 사용할 수 있습니다.
사용 가능한 시스템 (POSIX 에서 해당 시스템을 지정하지 않음)에서 다음을 사용하여 직접 프로세스 대체 ( )를 수행 할 수 있습니다 ./dev/fd/n
diff <(cmd1) <(cmd2)
{
cmd1 4<&- | {
# in here fd 3 points to the reading end of the pipe
# from cmd1, while fd 0 has been restored from the original
# stdin (saved on fd 4, now closed as no longer needed)
cmd2 3<&- | diff /dev/fd/3 -
} 3<&0 <&4 4<&- # restore the original stdin for cmd2
} 4<&0 # save a copy of stdin for cmd2
그러나 ksh93
Linux 에서는 작동하지 않습니다 . 쉘 파이프는 파이프 대신 /dev/fd/3
소켓 쌍으로 구현 되며 fd 3이 소켓을 가리키는 개구부 는 Linux에서 작동하지 않습니다.
POSIX는을 지정하지 않지만 . 명명 된 파이프를 지정합니다. 명명 된 파이프는 파일 시스템에서 해당 파이프에 액세스 할 수 있다는 점을 제외하면 일반 파이프처럼 작동합니다. 여기서 문제는 POSIX에 임시 파일이나 디렉토리를 생성하고 이식 가능한 신호 처리를 수행하는 표준 메커니즘이 없다는 점을 고려할 때 특히 임시 시스템을 생성하고 나중에 정리해야한다는 것입니다. (매달거나 죽일 때 정리하는 것)도 휴대하기가 어렵습니다./dev/fd/n
mktemp -d
당신은 다음과 같은 것을 할 수 있습니다 :
tmpfifo() (
n=0
until
fifo=$1.$$.$n
mkfifo -m 600 -- "$fifo" 2> /dev/null
do
n=$((n + 1))
# give up after 20 attempts as it could be a permanent condition
# that prevents us from creating fifos. You'd need to raise that
# limit if you intend to create (and use at the same time)
# more than 20 fifos in your script
[ "$n" -lt 20 ] || exit 1
done
printf '%s\n' "$fifo"
)
cleanup() { rm -f -- "$fifo"; }
fifo=$(tmpfifo /tmp/fifo) || exit
cmd2 > "$fifo" & cmd1 | diff - "$fifo"
rm -f -- "$fifo"
(여기에서는 신호 처리를 관리하지 않음).