Bash
使用 read 和whiptail 執行腳本後終端上沒有鍵盤輸出
我編寫了一個 bash 函式,它接受命令作為參數,在後台執行它,並允許使用者通過按任意鍵來終止命令。這部分工作正常。
但是,當我將它通過管道傳輸到
whiptail
對話框儀表時,whiptail 按預期執行,但在它返回後,終端將不再顯示按鍵。我仍然可以執行命令,只是看不到我正在輸入的內容列印到螢幕上。輸出的格式也很奇怪,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
雖然這不能回答 OP 問題,但它對於登陸這裡的其他人可能很有用,尋找修復/解決方法。
正如 NickD 在他的評論中指出的那樣,whiptail 設置 -echo (在我的環境中不僅僅是迴聲)。
要修復你的腳本,你可以把
stty echo
最後。
您可以在腳本執行前後使用“stty -a”看到您的腳本(whiptail)發生了什麼變化。
當然,您可以將輸出保存到文件中,以便更容易發現差異:
stty -a > good_terminal
執行你的腳本 - 你的終端被弄亂了,用“reset”或“tset”或“stty sane”重置它,然後再次執行“stty”命令,然後在它之後進行比較:
stty -a > bad_terminal diff good_terminal bad_terminal