私が持っているシェルスクリプトだ標準入力からの読み込みを。まれに、入力の準備ができている人がいないため、スクリプトがタイムアウトする必要があります。タイムアウトの場合、スクリプトは何らかのクリーンアップコードを実行する必要があります。それを行う最良の方法は何ですか?
このスクリプトは、Cコンパイラを使用しない20世紀のUNIXシステムやbusyboxを実行する組み込みデバイスなど、非常に移植性が高い必要があります。そのため、Perl、bash、コンパイル済み言語、およびPOSIX.2全体にさえ依存できません。特に、$PPID
、read -t
、完全にPOSIX準拠のトラップは使用できません。一時ファイルへの書き込みも除外されます。すべてのファイルシステムが読み取り専用でマウントされている場合でも、スクリプトが実行される場合があります。
物事をさらに難しくするために、タイムアウトにならないときにスクリプトを適度に高速にすることも必要です。特に、forkと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
機能を実行するようにスクリプトを変更するにはどうすればよいですか?