我想忽略所有预先存在的环境变量,并只回显一个,如下所示:
env -i <(
export foo=bar;
env
)
这只会打印:
foo=bar
然而,构造
env -i <()
尽管我的直觉告诉我它应该是有效的,但它似乎并不有效。如何在此处创建内联程序以供 env -i 执行?
答案1
给 env 一个实际的程序:
env -i bash -c '
export foo=bar
env
'
请注意,由于这也会删除$PATH
环境变量,因此如果bash
不在系统的默认命令搜索路径中,则将不起作用。
bash
您可以在传递之前查找解释器的路径env
:
env -i -- "$(command -v bash)" -c '
export foo=bar
env
'
您启动的shellbash
在查找命令时可能也会遇到同样的问题env
。
答案2
如果要点是在所有变量均未导出的子 shell 中运行命令,则在 zsh 中您可以执行以下操作:
(
typeset +x -m '*'
those-commands
)
请注意,与许多其他 shell 一样,zsh 会自动将_
环境变量和正在执行的文件的路径作为值传递给它执行的命令。
这typeset +x -m '*'
只会取消导出带有该x
标志的 shell 变量。 zsh 在启动时收到的环境变量并且无法映射到 shell 变量(例如一些名称为123
, 或换行符或***
...)或 zsh 未从环境导入的环境变量(例如$IFS
, $USERNAME
)仍将是在它执行的命令的环境中传递。
$ env '123=x' '***=bar' 'IFS=xyz' zsh
$ (typeset +x -m '*'; env)
_=/usr/bin/env
IFS=xyz
123=x
***=bar