在Bash shell中,我想在使用命令运行时首先清理环境.
我想取消设置所有环境变量,只设置对shell起作用的关键变量,以及我的脚本完成它的任务所需的那些变量.
有没有办法以简单干净的方式做到这一点?
Edu*_*nec 40
您可以使用env
和包装脚本:
#!/bin/bash
env -i /path/to/main_script.sh
Run Code Online (Sandbox Code Playgroud)
来自man env
:
Run Code Online (Sandbox Code Playgroud)-i, --ignore-environment start with an empty environment
当然,您也可以像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
命令: 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
都走了一个命令.
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)
当我尝试时,这有效:
for c in $(set | cut -d '=' -f 1); do unset $c; done
Run Code Online (Sandbox Code Playgroud)
它在const变量上出现错误,但我能够忽略它们.
归档时间: |
|
查看次数: |
25638 次 |
最近记录: |