如果从变量中删除导出,还有什么可以破坏?

Modified on: Sat, 30 Jun 2018 05:33:00 +0800

我的问题是,当我开始编写脚本时,我遇到了几个变量范围问题,这导致了几乎所有变量都出口的坏习惯。

既然我的代码已经很大了,我正在考虑清理它,其中一部分就是删除了一堆无用的导出。不幸的是,我不确定我对变量范围的了解是否完整。即使在阅读了有关该主题的几页后。

我所知道的(希望是对的):

1 - 导出变量使其内容可用于子shell进程:

export myvar="content"

2这样在括号中完成的东西会受到删除导出的影响(根据我的理解,这是声明/使用子shell的唯一方法):

$(grep "content" <<< $myvar)

在未设置范围的情况下声明的3变量是全局变量:

myvar="content"

4 - 由于我没有声明任何局部变量,所以我不必担心在我的函数中引起问题:

myvar="content"

问题:

1-是否有任何意义继续删除我的代码旁边的无用出口而不是明显的noobishness?

2-如果我继续使用它,我还应该注意哪些可能会受到影响并破坏我的代码?或者我的知识是否错误/不完整?

3-如果您知道编写良好(且完整)的变量范围参考,请分享链接。

最佳答案

只要不使用export进行两次评估,就可以删除所有导出而对导出变量没有任何影响。通过两次评估我的意思是:

var1=var2 export "${var1}=var3" echo "$var2" var3

而只是使用:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

...在脚本的顶部。此后定义的所有变量将自动exported - 其中包括您以前可能没有的变量export ed。或者,您只能set -a,稍后set +a以取消设置 - 它也可以作为函数使用。

但子shell自动继承变量值,所以:

var1=value ( echo "$(echo "$var1")" ) value

在这种情况下,

export没有区别。

但是如果你的脚本调用另一个脚本或任何其他解释你已经export ed的值的可执行文件而你停止export它们,那么这些值将不再在他们的环境中可用。在下面的示例中,我使用shell变量$PS1 - 它定义了交互式shell提示的内容 - 以演示export ed变量的变体如何影响子进程。

set -a 

但是......

var1=value
( echo "$(echo "$var1")" )
value

但是,如果你在调用进程时显式声明环境变量......

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit
作者:,mikeserv

相关问答

添加新评论