在 shell 脚本中取消设置环境变量的最具防御性/鲁棒性的方法

在 shell 脚本中取消设置环境变量的最具防御性/鲁棒性的方法

在脚本中取消设置环境变量的最具防御性/稳健性/便携性/偏执性的方法是什么?

我试图避免使用外部工具来清除环境变量,例如 inenv -i some-command或者perl -e 'delete $ENV{SOME_VARIABLE}; exec("some-command")'如果我可以避免它。

截至目前,我正在使用

export SOME_VARIABLE; unset -v SOME_VARIABLE

我相信,SOME_VARIABLE即使存在同名的 shell 变量或 shell 函数,它也会删除。 (尽管它确实破坏了 shell 变量(如果存在))。

答案1

unset SOME_VARIABLESOME_VARIABLE从环境中去除。这就是几乎所有情况下您所需要的。在极少数情况下,这还不够好,您无法避免调用中间进程(但它可以是 的另一个实例sh)。

export然后再打电话unset -v没有任何优势。如果您之后要取消设置该变量,则导出该变量是没有意义的。函数不存储在环境中,因此unset -v不会影响子流程将看到的内容。

有些 shell 确实通过环境导出函数,但它们是通过将函数定义编码为变量定义来实现的。如果变量与函数具有相同的名称,unset FUNCTION_NAME则将处理它,如果不是,则unset -v FUNCTION_NAME不会执行任何其他操作unset FUNCTION_NAME

无法取消设置变量的一种边缘情况是变量被声明为只读。没有可移植的方法将变量从只读状态恢复为正常状态。要从环境中可移植地删除只读变量,您必须调用 shell 的另一个副本:

readonly foo=bar
export foo
sh -c 'unset foo; exec some-command'

另一个边缘情况是一些 shell 坚持定义并默默地防止被取消设置的一些变量。要从环境中删除它们,您必须使用另一个 shell 或类似env垫脚石的实用程序。

相关内容