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)

$(我猜这意味着你所观察到的,即,和之间的文本)被视为一个单独的命令,有自己的引号解析/配对,独立于括号外的语法元素。我承认,如果你不寻找那个意思,它很难解释。


$但你的问题,就其所写而言,毫无意义。整个事情取决于shell的非常特殊的含义。如果我们将其更改为其他货币符号,

    ret="£(ls "my dir")"

那么它将被视为两个单词:

        ret="£(ls "my
(其次是)
                                    dir")"

因为,如果非空白、非特殊字符出现在开始引号之前或结束引号之后,它将与引号内的字符包含在同一个字符串中。例如,

    cat Wal"*"mart

查找名为 的文件Wal*mart,而不是名为 的文件Wal、名为 的文件*和名为 的文件martWal"*"mart相当于Wal\*mart"Wal*mart"。类似地,以下示例显示四个单词:

    一” “两扣” 我的“鞋子/不/是/一个/” “/cadet sqrt”(2)”
    ↑-------↑ ↑-----------↑ ↑--------------------↑ ↑-------↑

我不知道您问题中展示的三行细目是从哪里来的。

相关内容