有人可以解釋為什麼這是有效的(列出名稱中包含空格的目錄的內容):
ret="$(ls "my dir")"
難道不應該理解為:
ret="$(ls "
my dir
")"
例如:
ls "my" "dir"
和
ls "my dir"
答案1
到目前為止最好的猜測似乎是您在問:
命令
ret =“$(ls“我的目錄”)”是包含四個雙引號 (
"
) 標記的命令的一個非常糟糕的範例。人們可能天真地期望第二個引號與第一個引號匹配,第四個引號與第三個引號匹配,如下所示:ret="$(ls "my dir")" ↑-----↑ ↑-↑
例如,發生在
eat "afternoon snack" dinner "midnight snack"
相反,它“有效”,如下所示:
ret =“$(ls“我的目錄”)” ↑ ↑------↑ ↑ ↑--------------↑為什麼嵌套引號要這樣解析?
這段重擊(1) 可以解釋一下:
命令替換
⋮
… 使用該形式時,括號內的所有字元組成指令 …。$(command)
$(
我想這意味著您所觀察到的,即 the和 the之間的文本)
被視為一個單獨的命令,具有自己的解析/引號配對,獨立於括號外的語法元素。我承認,如果你不尋找這個意義,就很難解釋它。
但你的問題,正如所寫的,沒有意義。整件事情取決於$
shell的非常特殊的意義。如果我們將其更改為其他貨幣符號,
ret="£(ls "my dir")"
那麼它將被視為兩個單字:
ret="£(ls "my
(其次是)
dir")"
因為,如果非空白、非特殊字元緊接在左引號之前或緊在右引號之後出現,則它會包含在與引號中包含的字元相同的字串中。例如,
cat Wal"*"mart
尋找名為 的文件Wal*mart
,而不是名為 的文件Wal
,一個名為 的文件*
,一個名為mart
— 的 文件Wal"*"mart
相當於Wal\*mart
和"Wal*mart"
。同樣,以下範例顯示四個單字:
一”“二扣”我的“鞋/don\'t/be/a/”“/cadet sqrt”(2)” ↑--------↑ ↑--------------↑ ↑--------------------↑ ↑- - -----↑
我不知道你在問題中顯示的三行細分是從哪裡得到的。