Standart girdiden okuyan bir kabuk betiğim var . Nadir durumlarda, girdi vermeye hazır hiç kimse olmayacak ve komut dosyası zaman aşımına uğramalı . Zaman aşımı durumunda, komut dosyası bir miktar temizleme kodu yürütmelidir. Bunu yapmanın en iyi yolu nedir?
Bu betiğin , C derleyicisi olmayan 20. yüzyıl unix sistemleri ve meşgul kutusu çalıştıran gömülü aygıtlar da dahil olmak üzere çok taşınabilir olması gerekir , bu nedenle Perl, bash, derlenmiş herhangi bir dil ve hatta POSIX.2'nin tümüne bile güvenilmez. Özellikle, $PPID
, read -t
ve mükemmel POSIX uyumlu tuzaklar kullanılamaz. Geçici bir dosyaya yazma da dahil değildir; tüm dosya sistemleri salt okunur olarak takılı olsa bile komut dosyası çalıştırılabilir.
Sadece işleri zorlaştırmak için, zaman aşımına uğramazsa betiğin de oldukça hızlı olmasını istiyorum . Özellikle betiği, çatal ve exec'in çok düşük olduğu Windows'ta (özellikle Cygwin'de) kullanıyorum, bu yüzden kullanımlarını minimumda tutmak istiyorum.
Özetle, ben var
trap cleanup 1 2 3 15
foo=`cat`
ve bir zaman aşımı eklemek istiyorum. Yerleşik cat
ile değiştiremiyorum read
. Zaman aşımı durumunda, cleanup
işlevi yürütmek istiyorum .
Arka plan: Bu betik, bazı 8-bit karakterleri yazdırarak ve imleç pozisyonunu önce ve sonra karşılaştırarak terminalin kodlamasını tahmin ediyor. Komut dizisinin başlangıcı, stdout'un desteklenen bir terminale bağlı olduğunu test eder, ancak bazen ortam yalan söyler (örneğin plink
çağrılsa TERM=xterm
bile ayarlarTERM=dumb
). Komut dosyasının ilgili kısmı şuna benzer:
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
Komut dosyasını nasıl değiştirebilirim, böylece tr
2 saniye sonra herhangi bir girdi okumamışsa öldürülür ve komut dosyası cleanup
işlevi yürütür ?