ฉันมีสคริปต์เชลล์ที่อ่านจากอินพุตมาตรฐาน ในกรณีที่หายากจะมีไม่มีใครพร้อมที่จะให้การป้อนข้อมูลและสคริปต์ที่ต้องหมดเวลา ในกรณีที่หมดเวลาสคริปต์จะต้องเรียกใช้โค้ดการล้างข้อมูล วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร?
สคริปต์นี้ต้องพกพาได้มากรวมถึงระบบยูนิกซ์ในศตวรรษที่ 20 ที่ไม่มีคอมไพเลอร์ C และอุปกรณ์ฝังตัวที่ใช้งานอยู่ในขณะนี้ดังนั้น Perl, ทุบตี, ภาษาใด ๆ ที่คอมไพล์และแม้แต่ POSIX.2 แบบเต็มไม่สามารถพึ่งพาได้ โดยเฉพาะอย่างยิ่ง$PPID
, read -t
และกับดักที่ดีเลิศ POSIX สอดคล้องไม่สามารถใช้ได้ การเขียนไปยังไฟล์ชั่วคราวจะถูกแยกออกเช่นกัน สคริปต์อาจทำงานแม้ว่าระบบไฟล์ทั้งหมดจะถูกเมาท์แบบอ่านอย่างเดียว
เพียงเพื่อทำให้สิ่งต่าง ๆ ยากขึ้นฉันยังต้องการให้สคริปต์มีความรวดเร็วพอสมควรเมื่อไม่ได้หมดเวลา โดยเฉพาะอย่างยิ่งฉันยังใช้สคริปต์ใน Windows (ส่วนใหญ่ใน Cygwin) โดยที่ fork และ exec มีระดับต่ำโดยเฉพาะดังนั้นฉันจึงต้องการใช้ให้น้อยที่สุด
โดยสรุปฉันมี
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
ฟังก์ชัน