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. (맹목적으로 입력해야 하므로 주의하세요.) 이것이 터미널 문제를 해결한다면 이것이 문제일 수 있습니다.

관련 정보