仅仅为了学习,当我尝试很多东西时,我注意到一种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有关。但是,我未能解释确切的问题是什么。有什么办法可以使字段拆分工作,使其像第一种情况一样处理?
答案 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,这完全是另一回事。