下失敗,我不明白爲什麼:echo「#!」失敗 - 「未找到事件」
$ echo "#!"
下面還失敗,相同的錯誤消息:
$ echo "\#!"
錯誤消息:
-bash: !": event not found
爲什麼會失敗?應該怎麼做echo
?
下失敗,我不明白爲什麼:echo「#!」失敗 - 「未找到事件」
$ echo "#!"
下面還失敗,相同的錯誤消息:
$ echo "\#!"
錯誤消息:
-bash: !": event not found
爲什麼會失敗?應該怎麼做echo
?
!
字符用於csh
風格的歷史擴展。
如果您不使用此功能,set +o histexpand
(又名set +H
)會關閉此行爲。它已關閉腳本,但通常啓用交互式使用。
作爲一種解決方法,您可以使用單引號而不是雙引號 - 記住coure及其不同的語義。如果您需要結合可變插值報價,例如,你可以改變
echo "#!$SHELL" # oops, history expansion breaks this
到
echo '#!'"$SHELL"
(注意相鄰的單引號和雙引號字符串;外殼與完成後,此,引號將被刪除,該字符串#!
接下來將到可變SHELL
的在它們之間沒有空間的值輸出)或類似
printf '#!%s\n' "$SHELL"
其他一些常見的解決方法的
無論如何回滾了編輯的@ GaborJozan的答案,因爲它是[單獨發佈](/ a/37741294/874188),但有明顯的缺陷,它增加了之前沒有任何空間的空間。 – tripleee 2016-06-10 07:24:38
您可以在某些奇怪的情況下使用單引號(而不是雙引號)_except_,例如單引號位於管道的下游部分,如[本答覆]中所述(https://stackoverflow.com/a/37917491/785213)。是的,有時這可能會令人生氣;如果你不能以另一種方式解決問題,你可以暫時「設置+他的工作」。 – TheDudeAbides 2017-11-09 23:40:10
感謝您的評論。我添加了一個部分,強調單引號和雙引號之間存在明顯差異,幷包含一些解決方法。 – tripleee 2017-11-10 04:43:35
在我的情況下,所有的命令都在工作。也許你可以指定你的環境。
$ echo "\#\!"
\#\!
$ echo "#!"
echo "#"
#
$ echo "#!"
echo "#"
#
$ echo $BASH_VERSION
3.2.48(1)-release
默認情況下,bash支持csh
兼容的歷史擴展。
在bash
echo #!
將只打印一個換行符,作爲#
註釋的開始。
在
echo "#!"
的#
是字符串的一部分開始"
。這些字符串仍然由特殊字符的bash檢查。 !
是一個特殊字符,如果它後面跟着任何其他文本。
-bash: !": event not found
在這種情況下,慶典預計!"
令牌來指代前面的命令在外殼的歷史開始"
,並沒有找到一個。所有的本身,!
不會觸發此行爲:
$ echo \# !
# !
$ echo fee ! fie
fee ! fie
最後,
$ echo !echo
產生兩個線,所述第一線由殼印刷以顯示圖案上方如何擴展爲:
echo echo '# !'
而第二行只是執行擴展命令的結果: echo#!
另一個解決辦法可能是把多餘的空格後的「!」 :
# echo "#! "
#!
多年來,我一直致力於解決錯誤消息(我從來沒有像現在這樣理解),對於像'grep -q pattern somefile.txt && echo「YAY!而且可能還是會的,因爲shell中的雙引號字符串就在我的肌肉記憶中。 – TheDudeAbides 2017-11-09 23:56:11
[RICI的回答重複(http://stackoverflow.com/a/25021905/874188)如果你想有一個詳細的,長期的論述實在是恆星。 – tripleee 2015-09-17 05:50:02