readとwigtailを使用してスクリプトを実行した後、端末にキーボード出力がありません。

readとwigtailを使用してスクリプトを実行した後、端末にキーボード出力がありません。

私はコマンドを引数として受け入れ、バックグラウンドで実行し、ユーザーが任意のキーを押してコマンドを終了できるようにするbash関数を作成しました。この部分はうまくいきます。

ただし、ダイアログ メーターにパイプするとwhiptailhiptail が期待どおりに実行されますが、戻った後は端末にキーの押下が表示されなくなります。それでもコマンドを実行できますが、入力した内容は画面に印刷されて表示されません。出力形式も奇妙に指定され、stdoutが$

そのコマンドがこの動作を引き起こすことは明らかですreadが、その理由を理解できません。誰でも洞察力を提供できますか?

#!/bin/bash
function killOnKeypress() {
    local runcommand="${1}"
    local args=(${@:2})

    # Run the command in the background
    "${runcommand}" ${args[@]} &

    # Get the process id of $runcommand
    local pid=$!

    # Monitor $runcommand and listen for keypress in foreground
    while kill -0 "${pid}" >/dev/null 2>&1; do
        # If key pressed, kill $runcommand and return with code 1
        read -sr -n 1 -t 1 && kill "${pid}" && return 1
    done

    # Set $? to return code of $runcommand
    wait $pid

    # Return $runcommand's exit code
    return $?
}

function count100() {
    for ((i = 0; i < 100; i++)); do
        echo $i
        sleep .02
    done
}

killOnKeypress "count100" | whiptail \
    --gauge "Counting to 100" \
    16 56 \
    0

ここに画像の説明を入力してください。

答え1

これはOPの質問に対する答えではありませんが、修正/解決方法を見つけるためにここに来る他の人には便利です。

NickDがコメントで指摘したように、hiptailは-echoを設定します(私の環境ではエコーではありません)。

スクリプトを変更するには、次のように入力します。

stty echo

それの終わりに。

"stty -a"を使用すると、スクリプトの実行前後にスクリプト(whiptail)への変更を確認できます。
もちろん、違いを見つけやすくするために、出力をファイルに保存できます。

stty -a > good_terminal

スクリプトを実行してください。ターミナルがめちゃくちゃになりました。 「reset」、「tset」、または「stty sane」にリセットし、「stty」コマンドを再実行して比較します。

stty -a > bad_terminal
diff good_terminal bad_terminal

答え2

これにより、whiptail端末が奇妙な状態になる可能性があります。コマンドで試してくださいstty sane。 (盲目的に入力する必要があるので注意してください。)これが端末の問題を解決する場合は、これが問題かもしれません。

関連情報