POSIX와 호환되도록 수정하려고 하는 Bash로 작성된 스크립트가 있습니다. Bash처럼 killall, CTRL+C를 사용하여 프로세스를 종료하거나 터미널을 닫을 때 EXIT 트랩을 실행할 수 없다는 점을 제외하고는 모든 작업을 수행할 수 있었습니다. 이것이 내 출구 트랩입니다.
#!/bin/sh
TMP=$(mktemp /tmp/countdown.XXXXX)
trap 'rm -rf $TMP' EXIT
답변1
엄격한 POSIX 셸에서는 실행 이나 스크립트의 마지막 명령 실행으로 인해 EXIT
셸이 종료되기 전에 트랩이 평가됩니다. exit
신호로 인해 쉘이 종료되면 실행되지 않습니다.
을 잡으려면 ("인터럽트" 신호)을 Ctrl+C잡아야 합니다 . INT
터미널을 닫으면 HUP
("전화 끊기") 신호가 스크립트에 전송되는 경우 해당 신호도 잡아야 합니다.
trap 'rm -rf "$TMP"; trap - EXIT; exit' EXIT INT HUP
TERM
기본적으로 전송되는 일반 "종료" 신호를 캡처할 수도 있습니다 kill
.
위의 트랩은 EXIT
트랩이 호출되지 않도록 명시적으로 재설정합니다.다시나열된 신호 중 하나를 수신하여 스크립트가 종료되는 경우.
답변2
Kusalananda가 언급했듯이 EXIT
POSIX의 신호는 포착되지 않습니다. 가장 간단한 해결책은 코드에 다음과 같은 것을 추가하는 것입니다.
trap exit INT HUP TERM
그러면 원하는 신호를 포착하고 종료 문에 도달하면 원래 트랩을 호출합니다.
답변3
임시 파일이 생성되자마자 삭제하고 파일 설명자를 통해 읽고 쓰세요.
이를 경로가 필요한 명령 으로 /dev/fd/[fd]
또는 명령으로 전달합니다./proc/self/fd/[fd]
예:
t=$(mktemp); exec 5<>"$t"; rm "$t"
echo some text >&5
exec 5<>/dev/fd/5 # rewind / seek back at the start of the file
cat <&5
cmd1 /dev/fd/5 # cmd1 only takes paths
cmd2 5>&- # don't leak fd 5 to cmd2
임시 파일을 여러 개로 열 수도 있습니다분리.fd와 같은 exec 5<"$t" 6>"$t"
.
되감기 트릭은 Linux에서만 작동합니다. 이식 가능한 방법은 없습니다. ;-\