我想在空环境中运行程序(即未设置任何变量)。如何在bash中做到这一点?
1
可能相关:如何在ksh外壳中获得清洁的环境
—
rahmu 2012年
我想在空环境中运行程序(即未设置任何变量)。如何在bash中做到这一点?
Answers:
您可以使用env
:
env -i your_command
与下面的评论相反,这确实清除了环境,但是并没有阻止your_command
设置新变量。特别是,运行外壳程序将导致外壳程序/etc/profile
运行,并且外壳程序也可能具有一些内置设置。
您可以使用以下方法进行检查:
env -i env
即擦拭环境,然后打印。输出将为空白。
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
prints /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
。
PATH
,PWD
并SHLVL
通过猛砸自动设置。+1。
env -i bash --norc -c "declare -p PATH"
Give declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
。如果您自己导出,请注意导出的“ -x”(以及环境的一部分):env -i bash --norc -c "export PATH; declare -p PATH"
给declare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
bash
可能会有一个“干净”的环境
$ env -i bash --noprofile --norc
该env -i
命令将在命令行上执行给它的命令,而不会将旧Shell环境的任何导出的环境变量传输到已执行程序的环境。
该--noprofile
选项停止bash
读取系统范围或个人外壳初始化脚本,否则将为登录外壳读取该脚本。
该--norc
选项停止bash
读取个人外壳初始化脚本,否则将为交互式外壳读取该脚本。
env -i
?您在什么系统上?
env
清理我的环境,--noprofile
避免采购/ etc / profile和朋友,并--norc
避免采购〜/ .bashrc和朋友。
env -i somecommand
如ams所述,在空环境中运行命令。
许多程序依赖于一些重要的环境变量,因此您可能需要保留它们:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
或者,您可以登录到小型登录时间环境。
ssh localhost somecommand
env
不支持--
定界,并且env -i FOO=bar -- env
尝试运行名为的命令--
。
env -i -- FOO=bar env
实际上应该是。我的错。并不是--
有用的,因为后面的内容并非以开头-
。
尽管接受的答案是正确的,但是您通常要做的是:
env -i bash -l -c "printenv; and any other commands"
这为您提供了无用但实用的功能(与在非交互模式下登录时所获得的功能相同)。例如,这可以设置语言,时区,HOME等。
env -i
clears HOME
,这意味着bash -l
找不到您的.bash_profile
等等。如果您想要的shell类似于您在全新登录时所获得的外壳,则需要HOME
首先设置一个额外的间接寻址。
这里大多数答案的问题是env -i
clear HOME
,因此即使您bash -l
在内部运行,它也不会读取您的内容.bash_profile
。如果您要寻找的是一个外壳,其作用就像您刚刚进行了新登录一样,想要这个代替:
env -i HOME="$HOME" bash -l -c 'your_command'
例:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
bash
外壳程序将运行.bash_login
或.bash_profile
。要获得一个干净的环境,请使用--noprofile
或将其设置HOME
为不包含那些文件的目录。我想这取决于您所说的“干净”。
env -i bash -c ...
。特别是当您想要一个看起来像刚在计算机上重新登录的shell时,此答案才有用。
要回答balki的评论(并在此过程中回答我自己的问题:-):
% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43
==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.
#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh
echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
则会得到以下信息:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.