You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash点命令(source)执行两次问题排查

为什么Bash中source脚本会执行两次?

根据你提供的案例和执行结果,核心问题是demo文件的内容被执行了两次——第一次是你显式调用. demo时,第二次则是在脚本执行过程中被意外触发的。下面是最可能的几个原因和对应的排查/解决方法:

1. 脚本中意外重复了source命令

这是最常见的失误:可能你在编写test脚本时,不小心重复写了一次. demo,自己没注意到。比如脚本实际内容是:

#!/bin/bash
. demo
. demo  # 这里多了一行
for ((i=1 ; i<10 ; i++)) ; do
    echo -n $i$x
    subResTest
done
echo

这种情况下,两次source会直接导致x被追加两次,echo输出两次HI,和你看到的结果完全一致。

排查方法:打开test脚本仔细检查,或者用cat -A test查看脚本中的所有隐藏字符(比如意外的换行、重复行)。

2. 函数调用触发了意外的source

如果subResTest函数的定义存在语法问题,或者bash无法正确识别这个函数,可能会尝试寻找同名的可执行文件/脚本并执行——如果恰好有一个和函数同名的脚本(比如你不小心把demo复制成了subResTest),那每次调用函数都会执行这个脚本,导致重复执行demo的内容。

不过从你的输出看,只有两次HI,而循环调用了9次subResTest,所以这个可能性较低,但可以排查:

  • 检查当前目录下是否有subResTest文件:ls -l
  • 验证函数是否正确定义:在执行./test前,先运行type subResTest,如果输出是subResTest is a function,说明函数定义正常。

3. Bash版本/环境的BUG

你使用的是bash 5.0.3(1),这个版本存在一些已知的小问题,结合Mx Linux的定制补丁,可能会出现source行为异常的情况。比如在某些特定场景下,调用source过的脚本中的函数会意外重新source原脚本。

排查方法:

  • 临时切换到其他bash版本测试(比如安装bash 4.4或5.1),看是否还会出现相同问题。
  • 在test脚本开头添加set -x开启调试模式,执行后会输出每一步执行的命令,你可以清晰看到demo被source了几次,以及subResTest调用时的具体行为:
    #!/bin/bash
    set -x
    . demo
    for ((i=1 ; i<10 ; i++)) ; do
        echo -n $i$x
        subResTest
    done
    echo
    
    执行后如果看到两次+ . demo的输出,就可以确认demo被source了两次,进而定位触发第二次source的代码。

4. 终端/Shell配置的干扰

如果你在xfce4-terminal的启动配置中添加了自动source某个脚本的命令,而该脚本恰好又source了demo,那么在打开终端时demo已经被执行过一次,再运行./test时会再次source,导致两次执行。

排查方法:打开一个全新的终端,先执行echo $x,如果输出不是空,说明x已经被初始化过,证明demo在脚本执行前就被source过了。


内容的提问来源于stack exchange,提问作者Christian Schell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:22:32