1

2 つの FIFO 間の入出力通信を可能にする IO スクリプトをセットアップしようとしています (1 つの FIFO は入力用で、もう 1 つは出力用です)。

入力を入力している間、サーバーが出力を受信する必要があります。Internals/servoutとはどちらInternals/servinも FIFO です。tail現在、入力を待っている間にバックグラウンドで実行することでこれを実装しています。

これは私の現在のコードです:

#!/bin/bash
# io.sh

tail -f -n 0 Internals/servout &
tpid=$!

read -p ">> " v
while [ $? -eq 0 ] && [ "$v" != "exit" ] && [ "$v" != "quit" ]; do
        echo $v > Internals/servin
        sleep .2
        read -p ">> " v
done

kill $tpid

私が直面している主な問題は、誤って Ctrl-C を入力してスクリプトを終了したときです。この場合、tail -f -n 0 Internals/servout &コードは引き続きバックグラウンドで実行されます。ご想像のとおり、それは望ましくありません。

tailSIGINT または同様の信号が送信された場合でも、コマンドが確実に強制終了される方法はありますか? finallyPythonのキーワードと同じ目的を果たしたりtail$$.

私の悪い習慣について自由にコメントしてください -bashは私の新しい言語の 1 つであり、建設的な批判は改善するための最も簡単な方法です。

4

1 に答える 1

1

次のようなことを試すことができます:

#!/bin/bash
# io.sh

cleanup() {
    [[ -n $tpid ]] && kill $tpid
}

trap 'cleanup' SIGHUP SIGINT SIGTERM EXIT

tail -f -n 0 Internals/servout &
tpid=$!

quitflag=0
while ((!quitflag)) && read -p ">> " v; do
    case $v in
        exit | quit)
            quitflag=1
            ;;
        help | '?')
            echo "Sorry, I can't help you."
            ;;
    esac
    echo "$v" > Internals/servin
done
于 2012-11-17T20:05:28.723 に答える