Bash 引號在指令替換時未轉義

Bash 引號在指令替換時未轉義

有人可以解釋為什麼這是有效的(列出名稱中包含空格的目錄的內容):

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)”
    ↑--------↑ ↑--------------↑ ↑--------------------↑ ↑- - -----↑

我不知道你在問題中顯示的三行細分是從哪裡得到的。

相關內容