Bash

echo * - bash 反斜杠轉義行為,是否向後評估?

  • October 7, 2019

所以在 bash 中,當我這樣做時

echo \*
*

這似乎是正確的,因為 * 被轉義並按字面意思理解。

但我無法理解,當我這樣做時

echo \\*
\*

我認為第一個反斜杠逃脫了第二個反斜杠因此兩個反斜杠“\”會給我一個“\”字面意思。和 * 緊隨其後,具有特殊的含義。我期待:

echo \\*
\file1 file2 file3

答案摘要:由於 \ 是按字面意思理解的,因此echo \*行為與 一樣echo a*,它將查找以文字“a”開頭的任何文件。

跟進問題,如果我想列印出來完全一樣

\file1 file2 file3

我應該使用什麼命令?例如,如下所示,但我不想要空間

echo \\ * 
\ file1 file2 file3

如果目前目錄中沒有名稱以反斜杠開頭的文件,則這是預期行為。Bash擴展*以匹配任何現有的文件名,但是

如果模式與任何現有文件名或路徑名不匹配,則模式字元串應保持不變。

因為沒有以 開頭的文件名\,所以模式保持原樣並被echo賦予參數\*。這種行為常常令人困惑,而其他一些 shell,例如zsh,則沒有。您可以在 Bash 中使用 更改它shopt -o failglob,然後它會給出錯誤zsh並幫助您診斷問題而不是行為不端。

*和模式字元可以出現在單詞中的?任何位置,並且前後的字元按字面意思匹配。這就是為什麼echo \\*並給出如此不同的輸出:第一個匹配以(並且失敗)echo \\ *開頭的任何內容,第二個輸出 a ,然後是所有文件名。\``\


安全地獲取所需輸出的最直接方法可能是使用printf

printf '\\'; printf "%s " *

echo *在任何情況下包含-或包含不尋常文件名的情況下都是不安全的。\

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