【发布时间】:2023-04-06 11:40:01
【问题描述】:
我正在学习 shell 脚本,我遇到了这种情况。
我们说位置变量是环境变量,但是为什么每次执行命令时它们都不会改变。
看看这个
set v1set v2set v3set v4set
old=$#
#Just a random command
ls -l
new=$#
echo $old $new
它输出4 4。如果环境变量是全局的,为什么不是4 1,因为我运行了ls -l,它应该更新了位置变量?
【问题讨论】:
-
“位置变量是环境变量”是什么意思?
-
当你运行像
ls -l这样的命令时,无论在该命令执行期间发生什么(即使它涉及调用一个子shell,在这种情况下它不会)不会影响当前 shell 中的环境。 -
@Nate,请不要将人们指向 ABS; irc.freenode.org#bash 在帮助人们改掉他们从中习得的坏习惯方面遇到了很多麻烦。在避免演示代码中的不良做法方面,mywiki.wooledge.org/BashGuide 得到了更加警惕的维护。
-
@CharlesDuffy:很公平:我刚刚在 Google 上找到了第一个链接,该链接讨论了子shell 中的变量作用域。我已经删除了我发布的链接,所以人们会使用你的链接。
-
位置参数 inside shell,由于参数被传递给它(或通过使用
set内置)。在调用外部进程之前,它们没有被设置;ls和-l都是直接传递给exec*系统调用之一的简单字符串。