2012-08-05 69 views
4

下失敗,我不明白爲什麼:echo「#!」失敗 - 「未找到事件」

$ echo "#!" 

下面還失敗,相同的錯誤消息:

$ echo "\#!" 

錯誤消息:

-bash: !": event not found 

爲什麼會失敗?應該怎麼做echo

+3

[RICI的回答重複(http://stackoverflow.com/a/25021905/874188)如果你想有一個詳細的,長期的論述實在是恆星。 – tripleee 2015-09-17 05:50:02

回答

9

!字符用於csh風格的歷史擴展。

如果您不使用此功能,set +o histexpand(又名set +H)會關閉此行爲。它已關閉腳本,但通常啓用交互式使用。

作爲一種解決方法,您可以使用單引號而不是雙引號 - 記住coure及其不同的語義。如果您需要結合可變插值報價,例如,你可以改變

echo "#!$SHELL" # oops, history expansion breaks this 

echo '#!'"$SHELL" 

(注意相鄰的單引號和雙引號字符串;外殼與完成後,此,引號將被刪除,該字符串#!接下來將到可變SHELL的在它們之間沒有空間的值輸出)或類似

printf '#!%s\n' "$SHELL" 
其他一些常見的解決方法的
+0

無論如何回滾了編輯的@ GaborJozan的答案,因爲它是[單獨發佈](/ a/37741294/874188),但有明顯的缺陷,它增加了之前沒有任何空間的空間。 – tripleee 2016-06-10 07:24:38

+0

您可以在某些奇怪的情況下使用單引號(而不是雙引號)_except_,例如單引號位於管道的下游部分,如[本答覆]中所述(https://stackoverflow.com/a/37917491/785213)。是的,有時這可能會令人生氣;如果你不能以另一種方式解決問題,你可以暫時「設置+他的工作」。 – TheDudeAbides 2017-11-09 23:40:10

+0

感謝您的評論。我添加了一個部分,強調單引號和雙引號之間存在明顯差異,幷包含一些解決方法。 – tripleee 2017-11-10 04:43:35

3
echo '#!' 

基本上,用雙引號(")又名「弱引用」,Bash對字符串做了一些古怪的事情,比如變量替換。單(')又名「強引號」字符串是從字面上。

參見例如here有關引用的更深入的解釋。

1

在我的情況下,所有的命令都在工作。也許你可以指定你的環境。

$ echo "\#\!" 
\#\! 
$ echo "#!" 
echo "#" 
# 
$ echo "#!" 
echo "#" 
# 
$ echo $BASH_VERSION 
3.2.48(1)-release 
7

默認情況下,bash支持csh兼容的歷史擴展。

在bash

echo #! 

將只打印一個換行符,作爲#註釋的開始。

echo "#!" 

#是字符串的一部分開始"。這些字符串仍然由特殊字符的bash檢查。 !是一個特殊字符,如果它後面跟着任何其他文本。

-bash: !": event not found 

在這種情況下,慶典預計!"令牌來指代前面的命令在外殼的歷史開始",並沒有找到一個。所有的本身,!不會觸發此行爲:

$ echo \# ! 
# ! 

$ echo fee ! fie 
fee ! fie 

最後,

$ echo !echo 

產生兩個線,所述第一線由殼印刷以顯示圖案上方如何擴展爲:

echo echo '# !' 

而第二行只是執行擴展命令的結果: echo#!


參見:Bash man pageHistory Expansion

1

另一個解決辦法可能是把多餘的空格後的「!」 :

# echo "#! " 
#! 
+0

多年來,我一直致力於解決錯誤消息(我從來沒有像現在這樣理解),對於像'grep -q pattern somefile.txt && echo「YAY!而且可能還是會的,因爲shell中的雙引號字符串就在我的肌肉記憶中。 – TheDudeAbides 2017-11-09 23:56:11