나는이 쉘 스크립트 있어 표준 입력에서 읽기 . 드문 경우이지만 입력을 제공 할 준비가 된 사람이 없으며 스크립트가 시간 초과 되어야합니다 . 시간 초과의 경우 스크립트는 정리 코드를 실행해야합니다. 가장 좋은 방법은 무엇입니까?
이 스크립트는 C 컴파일러가없는 20 세기 유닉스 시스템과 busybox를 실행하는 임베디드 장치를 포함하여 이식성이 뛰어나므로 Perl, bash, 컴파일 된 언어 및 전체 POSIX.2를 신뢰할 수 없습니다. 특히 $PPID
, read -t
완벽 POSIX 호환 트랩을 사용할 수 없습니다. 임시 파일에 쓰는 것도 제외됩니다. 모든 파일 시스템이 읽기 전용으로 마운트 된 경우에도 스크립트가 실행될 수 있습니다.
일을 더 어렵게 만들기 위해 시간이 초과되지 않을 때 스크립트가 합리적으로 빠르기 를 원합니다 . 특히 포크와 exec가 특히 낮은 Windows (주로 Cygwin)에서 스크립트를 사용하므로 최소한의 사용을 유지하고 싶습니다.
간단히 말해서, 나는
trap cleanup 1 2 3 15
foo=`cat`
타임 아웃을 추가하고 싶습니다. 나는 대체 할 수 없습니다 cat
에 read
내장한다. 시간 초과의 경우 cleanup
함수 를 실행하고 싶습니다 .
배경 :이 스크립트는 일부 8 비트 문자를 인쇄하고 커서 위치 전후를 비교하여 터미널의 인코딩을 추측합니다. 스크립트의 시작은 stdout이 지원되는 터미널에 연결되어 있는지 테스트하지만 때로는 환경이 거짓말하는 경우가 있습니다 (예 :로 호출하더라도 plink
설정TERM=xterm
TERM=dumb
). 스크립트의 관련 부분은 다음과 같습니다.
text='Éé' # UTF-8; shows up as Ãé on a latin1 terminal
csi='␛['; dsr_cpr="${csi}6n"; dsr_ok="${csi}5n" # ␛ is an escape character
stty_save=`stty -g`
cleanup () { stty "$stty_save"; }
trap 'cleanup; exit 120' 0 1 2 3 15 # cleanup code
stty eol 0 eof n -echo # Input will end with `0n`
# echo-n is a function that outputs its argument without a newline
echo-n "$dsr_cpr$dsr_ok" # Ask the terminal to report the cursor position
initial_report=`tr -dc \;0123456789` # Expect ␛[42;10R␛[0n for y=42,x=10
echo-n "$text$dsr_cpr$dsr_ok"
final_report=`tr -dc \;0123456789`
cleanup
# Compute and return initial_x - final_x
tr
2 초 후에도 입력을 읽지 않으면 종료되고 스크립트가 cleanup
함수를 실행하도록 스크립트를 수정하려면 어떻게 해야 합니까?