我正在為 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;'