シェルスクリプトでのタイムアウト
私が持っているシェルスクリプトだ標準入力からの読み込みを。まれに、入力の準備ができている人がいないため、スクリプトがタイムアウトする必要があります。タイムアウトの場合、スクリプトは何らかのクリーンアップコードを実行する必要があります。それを行う最良の方法は何ですか? このスクリプトは、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=xtermTERM=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 …