当我在提示中输入“ unset * ”时究竟会发生什么?

Lun*_*ist 3 shell bash variable

假设我以 root 身份连接到 Linux 系统。

当我输入时到底发生了什么unset *

ber*_*sch 13

我将假设您的 shell 是 Bash,尽管以下内容也应适用于大多数 Bourne/POSIX 类的 shell。

简而言之,该命令没有意义。

shell 将首先用*当前目录中所有文件和目录的名称替换星号,但那些以点开头的文件和目录除外.。然后它将调用该unset列表上的命令。

目的unset是删除shell变量,而不是处理文件。如果文件或目录名恰好对应于当前定义的 shell 变量,则该变量将被删除。与 shell 变量不对应的名称要么根本不起作用,要么如果它们包含对 shell 变量来说非法的字符,它们将生成一条错误消息,如not a valid identifier.

实际上,该unset命令要复杂一些;例如,变量可以被标记为只读,在这种情况下它们不能被取消设置。它也适用于函数,而不仅仅是变量。但是,这不会改变命令在正常情况下没有意义的摘要。

此外,正如 Stéphane Chazelas 所评论的,像所有采用变量名称的内置函数一样,unset具有潜在危险的副作用,主要是数据看起来像数组索引。例如,如果文件HOME[$(some command)]存在,unset *将在尝试评估数组索引时运行命令替换。请参阅:在壳牌算术评估中使用未净化数据的安全影响

  • 如果当前目录中有一个名为 `HOME[$(reboot)]` 的文件,`unset *` 也可以尝试重启系统。`bash` 和其他类似 Korn 的 shell 中的 `unset` 是可以运行任意命令的内置程序之一,因此应该只传递已知和清理过的数据。 (4认同)
  • 一个人通过回答问题比通过提问学到的更多。谢谢。 (4认同)
  • 这与数组索引中的算术评估有关。因此,任何将变量名作为参数的内置函数(`[ -v var ]`、`getopts`、`read`、`printf -v`...)都有问题。请参阅 [在 Shell 算术评估中使用未经处理的数据的安全隐患](//unix.stackexchange.com/q/172103) (3认同)