我正在尝试在脚本中取消设置所有环境变量。脚本运行良好,但如果我运行 env,它仍会显示所有已设置的变量。
如果我从 CLI 运行命令,它会起作用并且变量会被取消设置。
unset `env | awk -F= '/^\w/ {print $1}' | xargs`
知道如何从脚本运行它吗?
还有,知道如何从脚本获取 /etc/profile 吗?这也行不通。
我需要根据用户需要的实例设置具有相同名称但不同路径的变量。
后来编辑:
好的,我最终得到了这个(不太优雅,但无论如何)解决方案:
. script
其中包含:
unset `env | awk -F= '/^\w/ {print $1}'|egrep -v "HOSTNAME|TERM|SHELL|HISTSIZE|SSH_CLIENT|SSH_TTY|USER|LS_COLORS|KDEDIR|MAIL|PATH|INPUTRC|PWD|LANG|HISTIGNORE|SSH_ASKPASS|TEST|SHLVL|HOME|LD_ASSUME_KERNEL|LOGNAME|SSH_CONNECTION|LESSOPEN|HISTTIMEFORMAT|G_BROKEN_FILENAMES|_"|xargs`
source env_variable_file
谢谢!
答案1
这基本上是一个标准答案。您不能这样做,因为脚本在新的子进程中运行。该进程拥有自己的环境,并且无法更改父进程的环境,无论是设置变量还是取消设置变量。
您可以使用以下命令在当前环境中运行该脚本.
。并且您可以以相同的方式 source /etc/profile:
./etc/profile 配置文件
答案2
我尝试运行你的脚本,但它对我来说不起作用。
我用 Google 搜索了一下并发现了这个:
unset $(/usr/bin/env | egrep '^(\w+)=(.*)$' | \
egrep -vw 'PWD|USER|LANG' | /usr/bin/cut -d= -f1);
这个确实有效 ;-)
用于获取文件
source /etc/profile
正如您所说,是正确的方法。
如果我像这样修改你的脚本
unset $(env | awk -F= '{print $1}' | xargs)
它也有效。
我认为以交互方式运行命令和通过脚本运行命令没有任何区别。
答案3
使用 -v 来取消设置命令以从环境中删除项目;请注意在此测试脚本的末尾您可能会遇到错误,因为我们取消了 $PATH 的设置,因此它无法找到像“id”之类的程序。
#!/bin/sh
LIST=`env | awk -F= '/^\w/ {print $1}' | xargs`
for item in $LIST; do
echo "$item = ${!item}";
done
unset -v $LIST
for item in $LIST; do
echo "$item = ${!item}";
done
HISTSIZE=5555
echo $HISTSIZE
source /etc/profile
echo $HISTSIZE