Bash

使用 read 和whiptail 執行腳本後終端上沒有鍵盤輸出

  • October 18, 2021

我編寫了一個 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

引用自:https://unix.stackexchange.com/questions/673625