如何解决为什么在导出命令的赋值部分不扩展通配符?
我正在编写我自己的 shell(尽可能接近 bash),我正在处理通配符扩展,我看到了使用带有星号的 export
的奇怪行为。
bash-3.2$ touch TEST=a
bash-3.2$ touch TEST=b
bash-3.2$ echo TEST=*
TEST=a TEST=b
bash-3.2$ export TEST=*
bash-3.2$ env | grep TEST
TEST=*
似乎星号在某些情况下会扩大,但在调用 export
时不会,这没有多大意义。 bash 中是否有我会错过的规则可以解释这种行为?
解决方法
export
是一个声明实用程序。那些类似于变量赋值的参数以与变量赋值相同的方式扩展,即既不对其执行路径名扩展,也不对其进行分词,并且值部分进行波浪号扩展。尽管 a bug report 是在 2010 年制定的,但即使是最新版本的标准也未能记录这种行为。但是,建议的更改 here 已应用于 202x.1 草案(如果您想获取副本,请参阅 Austin Group homepage),因此很有可能在下一版标准发布时,在 Simple Commands 下,在第二步的第一句之后,您将看到下面的语句,该语句规定了您认为奇怪的行为。
如果命令名称被识别为声明实用程序,则任何剩余的单独识别为变量赋值的单词都应扩展为变量赋值。
,对 auto
构建的调用采用以下形式:
export
如果给定了 value 则将其视为参数赋值,并且此处不会发生文件名扩展,请参阅参考手册的相关部分:
所有值都经过波浪号扩展、参数和变量扩展、命令替换、算术扩展和引号删除(详情如下)。如果变量设置了其整数属性,则即使不使用 $((...)) 扩展(请参阅算术扩展), value 也会作为算术表达式求值。不执行分词,“$@”除外,如下所述。 不执行文件名扩展。
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameters.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。