【问题标题】:Why aren't wildcards expanded in the assignment part of an export command?为什么没有在导出命令的赋值部分扩展通配符?
【发布时间】:2021-01-26 13:28:44
【问题描述】:

我正在编写自己的 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 中是否有一条我会错过的规则来解释这种行为?

【问题讨论】:

    标签: bash environment-variables wildcard built-in


    【解决方案1】:

    export 是一个声明实用程序。它的那些类似于变量赋值的参数以与变量赋值相同的方式扩展,即既不对其执行路径名扩展,也不对其执行分词,并且值部分受到波浪号扩展。尽管a bug report 是在 2010 年制定的,但即使是最新版本的标准也没有记录这种行为。但是,here 建议的更改已应用于 202x.1 草案(如果您想获得副本,请参阅Austin Group homepage),因此很有可能在下一版标准发布时,在Simple Commands 下,在第二步的第一句话之后,您将看到下面的声明,该声明规定了您认为奇怪的行为。

    如果命令名称被识别为声明实用程序,则任何剩余的单词将被单独识别为变量赋值,应扩展为变量赋值。

    【讨论】:

      【解决方案2】:

      export buildin 的调用采用以下形式:

      export [-fn] [-p] [name[=value]]
      

      如果 value 被给出,那么它被视为参数赋值,并且文件名扩展不会在这里发生,请参阅参考手册的相关部分:

      所有值都经过波浪号扩展、参数和变量扩展、命令替换、算术扩展和引号删除(详见下文)。如果变量具有其整数属性集,则即使不使用 $((…)) 扩展,也会将 value 作为算术表达式求值(请参阅算术扩展)。不执行分词,除了下面解释的“$@”。 不执行文件名扩展。

      https://www.gnu.org/software/bash/manual/html_node/Shell-Parameters.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2013-05-31
        相关资源
        最近更新 更多