因此,我需要防止子 shell 识别导出的变量负载。
问题是应用程序 (Wine+UDK) 不会在环境中构建具有太多 (>65535) 字节的项目,而在我使用在任何 bash 之间共享环境变量的项目 (ScriptEchoColor) 后,我的项目有很多 (95323) 个字节贝壳。
我找不到允许我生成子 shell 的命令,该子 shell 不接受当前的环境变量,而是仅使用在我的用户配置文件和整个系统上设置的变量。
我尝试了许多选项,如图所示bash --help
。
答案1
您可以使用该env
命令在干净的环境中启动进程。这是一个例子:
env -i /bin/myprog
如果您仍然需要导出一些变量,您可以在调用中执行此操作:
env -i MYVAR=foo /bin/myprog
env 命令是必需的POSIX。
答案2
env -i somecommand
somecommand
在空环境中运行。您可以将参数放在 后面somecommand
。如果PATH
被删除,您需要指定 的完整路径somecommand
。或者,您可以保留PATH
或设置不同的值。
env -i PATH="$PATH:/another/directory" somecommand
如果您想拥有与登录后相同的环境,请仅保留一些变量并加载您的变量.profile
以设置其余部分。如果您使用不同的登录 shell(bash 和.bash_profile
csh.login
等),请进行相应调整。
env -i HOME="$HOME" PATH=/usr/local/bin:/usr/bin:/bin USER="$USER" \
sh -c '. ~/.profile; "$@"' _ somecommand
或者,您可能更愿意从环境中删除一些变量。从环境中env -u VAR1 -u VAR2 somecommand
删除VAR1
和并运行.在 Linux 下,您可以使用生成一个每行一个名称的环境变量列表,适合过滤。在其他 UNIX 变体上,执行相同的工作,但限制是如果某些变量的值包含换行符,它可能会发现误报。VAR2
somecommand
env -0 | tr '\n\0' '.\n' | sed 's/=.*//'
env | sed 's/=.*//'
答案3
发出typeset +x variable_name...
或declare +x variable_name...
命令。您甚至可以使用正则表达式作为变量名称,例如typeset +x ${!MY_VAR_*}
.