나는 명령을 인수로 받아들여 백그라운드에서 실행하고 사용자가 아무 키나 눌러 명령을 종료할 수 있도록 하는 bash 함수를 작성했습니다. 이 부분은 잘 작동합니다.
그러나 대화 상자 미터로 파이프하면 whiptail
hiptail이 예상대로 실행되지만 반환 후에는 터미널에 더 이상 키 누르기가 표시되지 않습니다. 여전히 명령을 실행할 수 있지만, 내가 입력하고 있는 내용이 화면에 인쇄되어 표시되지 않습니다. 출력 형식도 이상하게 지정되어 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
. (맹목적으로 입력해야 하므로 주의하세요.) 이것이 터미널 문제를 해결한다면 이것이 문제일 수 있습니다.