Bash
echo * - bash 反斜杠轉義行為,是否向後評估?
所以在 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 *
在任何情況下包含-
或包含不尋常文件名的情況下都是不安全的。\