为什么在导出命令的赋值部分不扩展通配符?
我正在编写我自己的 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是一个声明实用程序。它的那些类似于变量赋值的参数以与变量赋值相同的方式扩展,即既不对其执行路径名扩展,也不对其进行分词,并且值部分进行波浪号扩展。尽管在 2010 年发布了错误报告,但即使是最新版本的标准也未能记录这种行为。但是,此处建议的更改已应用于 202x.1 草案(如果您想获取副本,请参阅Austin Group 主页),因此很有可能在下一版标准发布时,在Simple Commands 下,在第二步的第一句话之后,您将看到下面的语句,要求您执行您认为奇怪的行为。
如果命令名称被识别为声明实用程序,则任何将被隔离识别为变量赋值的剩余单词都应扩展为变量赋值。