我想在空环境中运行程序(即未设置任何变量)。如何在bash中执行此操作?

评论

可能相关:如何在ksh shell中获得干净的环境

#1 楼

您可以使用env来做到这一点:与下面的注释相反,这确实清除了环境,但并不阻止your_command设置新变量。特别是,运行外壳将导致/etc/profile运行,并且外壳可能也具有一些内置设置。

您可以使用以下命令进行检查: >
ie擦拭环境,然后打印。输出将为空白。

评论


并不能完全清除环境:echo'echo $ PATH'> test.sh && chmod u + x test.sh && env -i test.sh显示/ usr / local / sbin:/ usr / local / bin: / usr / sbin:/ usr / bin:/ sbin:/ bin。

–l0b0
2012年9月24日14:14在

但是,看来这是您可以获得的最接近的方法-好像PATH,PWD和SHLVL之类的变量是由Bash自动设置的。 +1。

–l0b0
2012年9月24日14:31



@ I0b0:看看我的编辑。

– ams
2012年9月24日14:37在

第一个评论者脚本中的PATH变量不在环境中,因此不是环境变量。如果没有为它导出的内容,Bash显然会设置其自己的常规外壳变量PATH:env -i bash --norc -c“ declare -p PATH”提供声明-PATH =“ / usr / local / bin:/ usr / local / sbin:/ usr / bin:/ usr / sbin:/ bin:/ sbin :.”。如果您自己导出,请注意要导出的(因此是环境的一部分)的“ -x”:env -i bash --norc -c“ export PATH; clarify -p PATH”给出了声明-x PATH =“ / usr /本地/ bin:/ usr / local / sbin:/ usr / bin:/ usr / sbin:/ bin:/ sbin :。”

– Bine Phile
18年6月22日在18:42



#2 楼



$ env -i bash --noprofile --norc

可能具有“干净”的bash环境,而env -i命令在命令行上执行给它的命令,而不传输任何导出旧Shell环境的环境变量与已执行程序的环境之间的变量。 --noprofile选项阻止bash读取个人shell初始化脚本,否则将为交互式shell读取这些脚本。


评论


我的环境无法识别这些选项。

– Paulo Carvalho
18-1-23在10:12



@PauloCarvalho您的系统不支持env -i?您在什么系统上?

– Kusalananda♦
18年1月23日在10:13

抱歉,它在外壳中有效。我试图将其放入脚本中,并以某种方式抛出错误。

– Paulo Carvalho
18-2-15在9:56



@PauloCarvalho对不起,我看不到您键入的命令或错误。

– Kusalananda♦
18年2月15日在10:05

太好了-正是我想要的东西。 env清洁我的环境,--noprofile避免采购/ etc / profile和朋友,--norc避免采购〜/ .bashrc和朋友。

–Felipe Alvarez
18年1月1日在0:01

#3 楼

正如ams所提到的,env -i somecommand在空环境中运行命令。
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand


或者,您可以登录到小型登录时环境。

ssh localhost somecommand


评论


在cmdline上运行命令时有效。我怎么把它放在shebang ?,似乎不起作用!

– Balki
13年11月4日在17:16

奇怪,我的env不支持-分隔并执行env -i FOO = bar-env尝试运行名为-的命令。

–antak
16年7月27日在2:16

@antak实际上应该是env -i-FOO = bar env。我的错。并不是--有用,因为其后缀不是以-开头。

–吉尔斯'所以-不再是邪恶的'
16 Jul 27'8:10



没意识到您总是可以ssh到localhost,这有点奇怪。那里有什么用例。

– Edgar Aroutiounian
17年3月12日在16:04

@EdgarAroutiounian如果运行的是SSH服务器,则可以SSH到localhost。程序员为什么要努力做到这一点呢?

–吉尔斯'所以-不再是邪恶的'
17 Mar 12 '17 at 20:26

#4 楼

虽然已接受的答案是正确的,但通常要做的是:非互动模式)。例如,这可以设置语言,时区,HOME等。

评论


那不是很有效,因为env -i清除HOME,这意味着bash -l找不到您的.bash_profile等。如果您想要的shell类似于您在全新登录时所获得的外壳,则需要额外的间接访问首先设置HOME。

–艾略特·斯劳特
18年6月22日在20:29

看到这个答案:unix.stackexchange.com/a/451389/157340

–艾略特·斯劳特
18年6月22日在20:46

#5 楼

这里大多数答案的问题是env -i清除了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 shell将运行.bash_login或.bash_profile。要获得一个干净的环境,请使用--noprofile,或将HOME设置为没有这些文件的目录。我想这取决于您所说的“干净”。

– Kusalananda♦
18年6月22日在20:43



是的,如果您想要一个没有任何字面意义的shell,请按照原始答案执行env -i bash -c...。此答案特别是在您想要一个看起来像刚刚在机。

–艾略特·斯劳特
18年6月22日在20:46

#6 楼

要回答巴尔基的评论(并在此过程中回答我自己的问题:-):

% 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."


评论


当我在CentOS 7.6的shebang行中尝试此操作时,我从env收到此错误:/ usr / bin / env:invalid option-''尝试'/ usr / bin / env --help'以获取更多信息。

– ScottJ
19 Mar 5 '19在23:51



如果我更改脚本以使用长参数--ignore-environment,则会得到以下信息:/ usr / bin / env:无法识别的选项'--ignore-environment SOMETHING_TO_KEEP =“ $ USER” PATH =“ $ PATH” / bin / sh'尝试使用'/ usr / bin / env --help'了解更多信息。

– ScottJ
19 Mar 5 '19在23:53

#7 楼

如果要确保脚本具有干净的环境,则可以像下面的小示例所示更改shebang行:
#!/usr/bin/env -S -i bash
env


在这里,我们通过bash运行env外壳,该外壳使用一个-i参数来指示其清洁环境。在shebang行上传递多个参数时,需要-S

评论


这在我的Debian 10.4机器上的bash 5.0.3上有效,但是RHEL 7.7使用4.2.46(2)-release,并且在bash 4上无法正常工作。

–JohnGH
20年6月19日在23:25