bash-builtins的“设置”和“导出”有什么作用?


46

我是一个有点损失为目的set,并export在击(我猜可能是其他炮弹太)。

我认为这是用于设置环境变量的,但是可以使用来完成VARIABLE=VALUE,对吧?

同样,键入setexport单独显示不同的值。

那么他们的目的是什么?



我总是从以下两个bash脚本开始。#!/ usr / bin / env bash set -euxo pipefail这个链接很好地解释了这一点。coderwall.com/p/fkfaqq/…–
147.3k,

Answers:


50

export导出到当前进程的子进程,默认情况下不导出它们。例如:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

set另一方面,设置外壳属性,例如位置参数。

$ set foo=baz
$ echo "$1"
foo=baz

请注意,baz未分配给foo,它只是成为文字位置参数。还有很多其他事情set可以做(主要是shell选项),请参阅help set

至于打印,export不带参数的调用将打印外壳环境中的所有变量。set还显示导出的变量。它还可以导出其他一些对象(尽管您应该注意这是不可移植的),请参见help export


谢谢,这是一个非常有用的答案。但是,当我仅使用http_proxy = abc.com设置http_proxy时,它对子进程可见,例如运行wget而不导出它。怎么会这样?
mydoghasworms

2
@mydoghasworms两个可能的原因。一,您正在以方式运行命令foo=bar command。这是单个命令的隐式导出。第二种可能性是http_proxy在修改之前已经在您的环境中将其导出。
克里斯·

啊,是的,你是对的。太好了,谢谢!
mydoghasworms

6

请参阅help set:set用于设置壳属性和位置属性。

子进程不会继承未导出的变量。export用于标记要导出的变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.