首页 > 解决方案 > 为什么 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但是,我未能解释确切的问题是什么。有什么办法可以使字段拆分工作,以便像第一种情况一样对待它?

标签: bash

解决方案


形式的单词$'string'被扩展为单引号字符串,就好像美元符号不存在一样。这意味着,

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

是相同的

$('echo a')

并且单引号字符串不会进行分词或任何其他类型的扩展。请参阅Bash 参考手册§ ANSI-C 引用

有什么办法可以使字段拆分工作,以便像第一种情况一样对待它?

$ 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,这完全是另一回事。


推荐阅读