मेरे पास एक शेल स्क्रिप्ट है जो मानक इनपुट से पढ़ रहा है । दुर्लभ परिस्थितियों में, कोई भी इनपुट प्रदान करने के लिए तैयार नहीं होगा, और स्क्रिप्ट को समय समाप्त होना चाहिए । टाइमआउट के मामले में, स्क्रिप्ट को कुछ सफाई कोड निष्पादित करना होगा। ऐसा करने का सबसे अच्छा तरीका क्या है?
यह स्क्रिप्ट बहुत पोर्टेबल होनी चाहिए , जिसमें सी कंपाइलर के बिना 20 वीं सदी के यूनिक्स सिस्टम और व्यस्त बॉक्स में चलने वाले एम्बेडेड डिवाइस शामिल हैं, इसलिए पर्ल, बैश, किसी भी संकलित भाषा, और यहां तक कि पूर्ण POSIX.2 पर भरोसा नहीं किया जा सकता है। विशेष रूप से $PPID
, read -t
और पूरी तरह से POSIX- आज्ञाकारी जाल उपलब्ध नहीं हैं। एक अस्थायी फ़ाइल पर लिखना भी बाहर रखा गया है; स्क्रिप्ट तब भी चल सकती है, जब सभी फाइल सिस्टम केवल पढ़ने के लिए माउंट किए गए हों।
बस चीजों को और अधिक कठिन बनाने के लिए, मैं यह भी चाहता हूं कि स्क्रिप्ट बहुत तेजी से हो जब वह समय नहीं निकालती है। विशेष रूप से, मैं विंडोज में स्क्रिप्ट का उपयोग करता हूं (मुख्य रूप से सिग्विन में), जहां कांटा और निष्पादन विशेष रूप से कम है, इसलिए मैं उनका उपयोग न्यूनतम रखना चाहता हूं।
संक्षेप में, मेरे पास है
trap cleanup 1 2 3 15
foo=`cat`
और मैं एक टाइमआउट जोड़ना चाहता हूं। मैं बिल्ट-इन के cat
साथ प्रतिस्थापित नहीं कर सकता read
। टाइमआउट के मामले में, मैं cleanup
फ़ंक्शन को निष्पादित करना चाहता हूं ।
पृष्ठभूमि: यह स्क्रिप्ट कुछ 8-बिट वर्णों को प्रिंट करके और पहले और बाद में कर्सर की स्थिति की तुलना करके टर्मिनल के एन्कोडिंग का अनुमान लगा रही है। स्क्रिप्ट परीक्षण की शुरुआत जो स्टडआउट एक समर्थित टर्मिनल से जुड़ी है, लेकिन कभी-कभी पर्यावरण झूठ बोल रहा है (उदाहरण के लिए 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
फ़ंक्शन को निष्पादित करता है?