2017-09-22 1234 views
1

\!在bash命令中的作用是什麼?!在Bash命令中

例如,我發現下面這個命令將在不同的行爲與\!

find subdir -lname 'test*' \! -newer somethinghere

谷歌搜索似乎並沒有帶來任何東西具體涉及到\!除了命令行格式。

+3

'\!'被用來逃避'!'這會導致歷史擴展否則 – anubhava

+0

堆棧溢出是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。 – jww

回答

3

在字符轉義之前加一個反斜槓,防止它被解析爲語法。因此,\!是一個相當於'!'的terser - 它確保find作爲參數傳遞給!,而shell不會以任何方式解釋它。

沒有任一這些,如果[[ $- = *H* ]](其是真的在交互式殼和默認情況下),並且如果是histchars從其默認值未修飾,!觸發歷史擴展。這是每次bash的手冊頁的QUOTING部分:

當使用命令行歷史擴展功能(見下文歷史擴展),歷史擴展字符,通常是!,必須被引用,以防止歷史擴展。

1

這個!是否定,例如:

find . -readable 

將返回所有可讀的文件/目錄,而

find . ! -readable 

將返回所有的文件/文件可以讀取(斷鏈或目錄 - r許可)

\字符是逃避。

但是,好奇地在我的電腦上(Debian/bash)我需要逃避* char但不是!一。爲了更加明確我需要寫

find . -name abc\* 

find . -name abc\* ! -readable 
find . -name abc\* \! -readable 

工作,並具有同樣的效果

+1

不那麼好奇。舊式的歷史擴展並不總是能夠實現的 - 個人而言,我在設置點文件時所做的第一件事就是關閉它。它在非交互式shell(即運行腳本)中總是被默認禁用。 –

+0

@CharlesDuffy感謝您的澄清 –