如何在 bash 的干净环境中运行程序?

Eug*_*ash 151 bash environment-variables

我想在一个空的环境中运行一个程序(即没有设置 envariables)。如何在 bash 中做到这一点?

ams*_*ams 162

你可以这样做env

env -i your_command
Run Code Online (Sandbox Code Playgroud)

与下面的评论相反,这确实完全清除了环境,但它不会阻止your_command设置新变量。特别是,运行 shell 会导致/etc/profile运行,并且 shell 也可能有一些内置设置。

您可以通过以下方式检查:

env -i env
Run Code Online (Sandbox Code Playgroud)

即擦拭环境,然后打印。输出将为空白。

  • 第一个评论者脚本中的 PATH 变量不在环境中,因此不是环境变量。如果没有为它导出的变量,Bash 显然会设置自己的名为 PATH 的常规 shell 变量:`env -i bash --norc -c "declare -p PATH"` 给出 `declare -- PATH="/usr/local/ bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."`。如果您自己导出它,请注意导出的“-x”(因此是环境的一部分):`env -i bash --norc -c "export PATH; declare -p PATH"` 给出 `declare -x PATH=" /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."` (5认同)
  • 它并没有完全清除环境:`echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh` 打印 `/usr/local/sbin:/usr/local /bin:/usr/sbin:/usr/bin:/sbin:/bin`。 (4认同)
  • @I0b0:查看我的编辑。 (3认同)
  • 然而,这似乎是你能得到的最接近的 - 似乎像 `PATH`、`PWD` 和 `SHLVL` 这样的变量是由 Bash 自动设置的。+1。 (2认同)

Kus*_*nda 57

一个“干净”的bash环境可能与

$ env -i bash --noprofile --norc
Run Code Online (Sandbox Code Playgroud)
  • env -i命令执行命令行上给它的命令,而不会将旧shell环境的任何导出环境变量转移到执行程序的环境中。

  • --noprofile选项停止bash读取系统范围或个人 shell 初始化脚本,否则登录 shell 会读取这些脚本。

  • --norc选项停止bash读取个人 shell 初始化脚本,否则交互式 shell 会读取这些脚本。


Gil*_*il' 32

env -i somecommand正如ams 已经提到的那样,在空环境中运行命令。

许多程序依赖于一些重要的环境变量,因此您可能希望保留它们:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Run Code Online (Sandbox Code Playgroud)

或者,您可以登录到小型登录时环境。

ssh localhost somecommand
Run Code Online (Sandbox Code Playgroud)


Ell*_*ter 6

这里大多数答案的问题是env -i清除HOME,所以即使你bash -l在内部运行,它也不会读取你的.bash_profile等。如果你正在寻找的是一个外壳,就像你刚刚完成了一次新登录一样,那么你想要这个:

env -i HOME="$HOME" bash -l -c 'your_command'
Run Code Online (Sandbox Code Playgroud)

例子:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
Run Code Online (Sandbox Code Playgroud)

  • 请注意,登录“bash” shell 将运行“.bash_login”或“.bash_profile”。要获得干净的环境,请使用“--noprofile”,或将“HOME”设置为没有这些文件的目录。我想这取决于你所说的“干净”是什么意思。 (2认同)

小智 5

虽然接受的答案是正确的,但您通常想要做的是:

env -i bash -l -c "printenv; and any other commands"

这为您提供了简单但功能强大的 bash(与您在非交互模式下登录时获得的相同)。例如,设置语言、时区、家庭等。