Bash

如何包含“!”。在傳遞給從 Bash 命令行呼叫的腳本的字元串參數中

  • October 3, 2022

當使用者錯誤地輸入兩個標點符號時,我需要測試 python TTS 程序如何反應。

所以我需要檢查“C’est un test!”這句話。(注意**!.**最後)。

因此我在提示時輸入

 $ python3 /home/user1/TTS/bin/synthesize.py --text "C'est un test!."

但是 Bash 然後顯示:

python3 /home/user1/TTS/bin/synthesize.py –text “這是一個測試。/configure”

(注意“!.”如何變成“./configure”)。

“這是一個測驗!” (沒有句點)有效,但我需要測試“!。”。

我嘗試用​​單引號替換雙引號但沒有成功,我嘗試並轉義了“!” 帶有 "" 但它包含在發送到 TTS 庫的句子中。

我明白 ”!” 在 Bash 中具有特殊含義(這裡很好解釋)並與“。”相關聯。它使用先前的命令。

有沒有辦法阻止 Bash 處理“!”。在字元串中並按原樣傳遞?

謝謝你的幫助

那就是歷史擴展。您可以通過使用set +Horset +o histexpand或設置$histchars為空字元串來完全禁用它,或者在這裡您可以使用單引號而不是雙引號。在引號之外,也可以通過添加前綴來禁用歷史!擴展\

根據set --helpbash:

-o option-name

設置option-name對應的變數:

$$ … $$

histexpand 與 -H 相同

$$ … $$

-H

啟用!樣式歷史替換。當 shell 是互動式的時,這個標誌預設是打開的。

$$ … $$

使用 + 而不是 - 會導致這些標誌被關閉。

您可以嘗試執行這些命令來檢查差異:

set -H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

set +H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

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