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

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

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

当我打字时到底发生了什么unset *

答案1

我假设您的 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 *就会运行命令替换当尝试评估数组索引时。看:在 Shell 算术评估中使用未经净化的数据的安全影响

相关内容