为什么不bash在$()运算符中拆分字段?

时间:2019-08-30 02:24:30

标签: bash

仅仅为了学习,当我尝试很多东西时,我注意到一种bash的行为,我无法从逻辑上加以解释。

$ ls $(echo a)
ls: cannot access 'a': No such file or directory

$ ls $($'\145\143\150\157\40\141')
echo a: command not found

$ ls $($"\145\143\150\157\40\141")
\145\143\150\157\40\141: command not found

在第一种情况下,echo a被评估为a,这成为ls的参数。很公平。但是,在第二种情况下,八进制编码的字符串按预期被评估为echo a;但是$()将整个字符串视为命令。此外,在第三种情况下,双引号不会引起扩展。为什么不拆分字段?我想这与bash中的field splitting有关。但是,我未能解释确切的问题是什么。有什么办法可以使字段拆分工作,使其像第一种情况一样处理?

1 个答案:

答案 0 :(得分:5)

$'string'形式的单词被扩展为单引号字符串,就像没有美元符号一样。那是

$($'\145\143\150\157\40\141')

相同
$('echo a')

单引号字符串不进行分词或任何其他类型的扩展。参见Bash Reference Manual § ANSI-C Quoting

  

有什么办法可以使字段拆分工作,使其像第一种情况一样处理?

$ ls $(eval $'\145\143\150\157\40\141')
ls: cannot access 'a': No such file or directory

这是不可取的,请参阅BashFAQ#048


关于$"string"语法,请参见Bash Reference Manual § Locale-Specific Translation,这完全是另一回事。