如何使子shell成为“程序”

如何使子shell成为“程序”

我想忽略所有预先存在的环境变量,并只回显一个,如下所示:

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

相关内容