使用命令或bash脚本清理环境?

Ott*_*lec 38 linux bash

在Bash shell中,我想在使用命令运行时首先清理环境.

我想取消设置所有环境变量,只设置对shell起作用的关键变量,以及我的脚本完成它的任务所需的那些变量.

有没有办法以简单干净的方式做到这一点?

Edu*_*nec 40

您可以使用env和包装脚本:

#!/bin/bash
env -i /path/to/main_script.sh
Run Code Online (Sandbox Code Playgroud)

来自man env:

   -i, --ignore-environment
          start with an empty environment
Run Code Online (Sandbox Code Playgroud)

当然,您也可以像env -i script.sh运行手动一样运行脚本.不幸的是,据我可以告诉一个不能使用脚本家当运行bash通过env这样的; shebang只能接受内核解析的两个参数.

我能想到的另一个半可靠的解决方案是使用env或者exec -c(几乎完全相同)用于exec -c $0在干净的环境中重新运行脚本,如果你发现它不干净的话.假设$HOME设置在一个不干净的环境中,而不是设置在干净的环境中(在我的安装中是这样):

#!/bin/bash
[ "$HOME" != "" ] && exec -c $0
# rest of the script here
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 11

取消设置所有环境变量bash linux

命令: env -i bash

例如,创建本地和环境变量,然后重置为默认值:

el@defiant ~$ LOCAL_DOGE="such variable"
el@defiant ~$ ENVIRONMENT_DOGE="much code"
el@defiant ~$ export ENVIRONMENT_DOGE
el@defiant ~$ set | grep DOGE
ENVIRONMENT_DOGE='much code'
LOCAL_DOGE='such variable'
el@defiant ~$ env | grep DOGE
ENVIRONMENT_DOGE=much code
el@defiant ~$ env -i bash
el@defiant ~$ set | grep DOGE
el@defiant ~$ env | grep DOGE
el@defiant ~$
Run Code Online (Sandbox Code Playgroud)

所以,哇,LOCAL_DOGE并且ENVIRONMENT_DOGE都走了一个命令.

取消所有环境变量bash linux,替代方式.

env - /bin/bash
Run Code Online (Sandbox Code Playgroud)

例:

el@defiant ~$ DOGE1="one"
el@defiant ~$ export DOGE2="two"
el@defiant ~$ set | grep DOGE
DOGE1=one
DOGE2=two
el@defiant ~$ env | grep DOGE
DOGE2=two
el@defiant ~$ env - /bin/bash
el@defiant ~$ set | grep DOGE
el@defiant ~$ env | grep DOGE
Run Code Online (Sandbox Code Playgroud)

  • 这不是OP想要的东西; 或者至少不是正确的答案.你在这里做的只是一个没有继承旧环境的新SUBSHELL.如果你这样做几次就会耗尽内存:p. (2认同)

chr*_*ock 7

当我尝试时,这有效:

for c in $(set | cut -d '=' -f 1); do unset $c; done
Run Code Online (Sandbox Code Playgroud)

它在const变量上出现错误,但我能够忽略它们.

  • 我使用`env`而不是`set`,因为后者打印也在bash中起作用). (2认同)