在bash脚本foo.sh
中,由:
y=hi
z=hello
export z
var1=7 x=a ./foo.sh arg1 arg2
设置变量y
,var1
和x
。是否可以枚举调用脚本时显式设置的所有变量,即var1
和x
但不 y
和不 z
?
答案 0 :(得分:1)
不,不是这样,因为bash
无缝地执行此操作,并且这些变量在命令行上没有设置(命令行为./foo.sh
)。
当bash
看到命令行时:
var1=7 x=a ./foo.sh arg1 arg2
它只是运行./foo.sh arg1 arg2
已经为它设置的那些变量,实际上就像你做的那样:
( export var1=7; export x=a; ./foo.sh arg1 arg2 )
除了可能创建的进程数之外。
正在运行的进程.foo.sh
不知道 这些变量是如何设置的,它只能看到位而没有变量设置,因为它的命令线。
答案 1 :(得分:0)
如果您在脚本中运行没有参数的set
,那么您会在输出中看到var1=7
和x=a
,但您不会看到{{1}除非y被导出,否则。将显示所有导出的变量,您无法通过y=hi
或通过将分配预先添加到命令来判断它们是否已导出。
答案 2 :(得分:0)
由于测试和扩展变量的顺序,您可以使用set两次来获得差异。例如:
export y=1
var1=7 x=a /path/to/script.sh $(set)
# script.sh
oldvars=$@
newvars=$(set)
var1
和x
将在newvars
,但不在oldvars
。 (然后你需要'两个人找不到你想要的那些)。