আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা স্ট্যান্ডার্ড ইনপুট থেকে পড়ে । বিরল পরিস্থিতিতে, ইনপুট সরবরাহের জন্য কেউ প্রস্তুত থাকবে না এবং স্ক্রিপ্টটির সময় শেষ হতে হবে । সময়সীমা শেষ হওয়ার ক্ষেত্রে স্ক্রিপ্টটিতে অবশ্যই কিছু সাফাই কোড চালানো উচিত। এটি করার সর্বোত্তম উপায় কী?
এই স্ক্রিপ্টটি অবশ্যই খুব পোর্টেবল হতে হবে , সহ বিংশ শতাব্দীর ইউনিক্স সিস্টেমের সাথে সি কম্পাইলার ছাড়া এবং এম্বেড থাকা ডিভাইসগুলিতে ব্যস্তবক্স চলমান রয়েছে, সুতরাং পার্ল, ব্যাশ, কোনও সংকলিত ভাষা এবং এমনকি সম্পূর্ণ পসিক্স ২-এ নির্ভর করা যায় না। বিশেষ করে, $PPID
, read -t
এবং পুরোপুরি POSIX-অনুবর্তী যাত্রীর সঙ্গের নিজলটবহর পাওয়া যায় না। একটি অস্থায়ী ফাইল লিখতেও বাদ দেওয়া হয়; স্ক্রিপ্টটি চলতে পারে এমনকি যদি সমস্ত ফাইল-সিস্টেমগুলি কেবল পঠনযোগ্যভাবে মাউন্ট হয়।
কেবল জিনিসগুলিকে আরও জটিল করে তুলতে, আমিও চাই স্ক্রিপ্টটি সময় শেষ না হলে যুক্তিসঙ্গত দ্রুত হয় be বিশেষত, আমি উইন্ডোজে স্ক্রিপ্টটিও ব্যবহার করি (মূলত সাইগউইনে), যেখানে কাঁটাচামচ এবং এক্সিকিউটিভ কম, তাই আমি তাদের ব্যবহার সর্বনিম্ন রাখতে চাই।
সংক্ষেপে, আমার আছে
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
কার্য সম্পাদন করে ?