无法从脚本中取消设置环境变量

无法从脚本中取消设置环境变量

我正在尝试在脚本中取消设置所有环境变量。脚本运行良好,但如果我运行 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

相关内容