假设我以 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 算术评估中使用未经净化的数据的安全影响