#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
评论
可能相关:如何在ksh shell中获得干净的环境