每當我按下任何按鍵時,如何告訴 bash top 停止回顯文本?

每當我按下任何按鍵時,如何告訴 bash top 停止回顯文本?

我正在為 gnome-terminal 編寫一個自訂啟動命令,我的目的是在每次啟動它時顯示一條歡迎訊息。

訊息顯示正確,我對其進行了編碼,以便使字母在 0.09 秒的時間內一一出現:

echo -n "W" 
sleep 0.09
echo -n "e" 
sleep 0.09
echo -n "l"
sleep 0.09
echo -n "c"
sleep 0.09
echo -n "o"
sleep 0.09 
echo -n "m"
sleep 0.09 
echo -n "e" 
sleep 0.09 

在測試它時,我認為能夠阻止字母出現並su直接啟動會很舒服。我想出了以下解決方案:

su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"

如果我不想su -c讓 bash 生氣並拋出illegal action: read -n.該程式碼片段專門用於調試目的,因為我想測試 bash 如何讀取一行命令組合。

當我嘗試從設定檔(我編寫自訂啟動命令的檔案)執行此程式碼時,主要問題出現了。重擊返回:

No passwd entry for user 'Successful.; else echo Test'
Welcome

神秘的是,當我在預設設定檔中嘗試相同的命令(不帶su -c)時,它工作得很好,但如果我用 su -c 嘗試它,則不然。

嘗試使用預設設定檔中的其他命令,我輸入su -c "echo Hi"並運行良好。為什麼會發生這種情況?你有什麼主意嗎?

答案1

將整個命令用單引號而不是雙引號引起來。首先要注意的是你有一個變數($key)。用雙引號括起來,在將其作為賦予 的參數之前,它將被 shell 取代su。第二件事是關於引用匹配您目前擁有的內容,使用雙引號,參數將像這樣分割:

  • 參數0:su
  • 參數1:--command
  • 參數2:read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
  • 參數3:Successful.; else echo Test
  • 參數4:Failed.; fi;

將整個參數括在單引號中可以解決兩個問題,避免變數替換並修復拆分怪異,透過原樣傳遞此字串作為 的第二個參數su

額外提示:作為一般說明,盡可能避免在測試中使用雙括號,這是一種 bashism(僅適用於 bash 的語法,可以用更相容的對應部分替換)

以下版本應該按預期工作。

su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'

相關內容