gpt4 book ai didi

linux - 为什么每次运行命令时位置变量都没有改变

转载 作者:太空狗 更新时间:2023-10-29 11:44:51 25 4
gpt4 key购买 nike

我正在学习 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)时会发生什么。它与“变量已恢复或类似”无关......

当你要运行任何命令时,

  1. bash FORKS 自身分成两个相同的副本
  2. 一个副本(称为子副本)将用所需的命令替换自身(例如使用 ls -l)
  3. 此时,进程将获得位置变量的正确计数 $#
  4. 记住 - 这发生在子进程中,第二个()进程对此一无所知
  5. parent 只是等到 child 完成(当然,他的 $# 没有改变,因为对于 parent 来说什么都没有发生 - 只是等待
  6. 当子级 (ls -l) 完成时,父级继续运行 - 当然,他的 $# 不是理由改变...

ps:以上是简单化的。事实上,在 fork 之后,它们并不完全相同,而是在一个数字上有所不同——父进程得到子进程的进程号,子进程这个进程号为“0”

关于linux - 为什么每次运行命令时位置变量都没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com