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

为何source该Bash脚本时会陷入死循环?

问题:Bash脚本source执行时陷入死循环的原因

我编写了一段Bash脚本,用于从浏览器中PDF的file://路径切换到其所在目录。执行命令如:

. cd.sh file:///home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide/Odom,_Wendell_-_CCNA_200-301_Official_Cert_Guide,_Volume_1.pdf

时,脚本陷入死循环,持续输出目标目录路径,无法停止。

脚本代码如下:

#!/usr/bin/bash

#alias cd='. ~/CS/SoftwareDevelopment/MySoftware/Bash/cd/cd.sh
#when I do cd file:///home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide/Odom,_Wendell_-_CCNA_200-301_Official_Cert_Guide,_Volume_1.pdf
#it is supposed to do cd /home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide

dst_dr=$(echo "${1}"|sed -E 's,file://,,;s,/[^/]*\.pdf|/[^/]*\.PDF,,')
echo "$dst_dr" 
export dst_dr
cd "$dst_dr"

循环输出内容:

/home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide
/home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide
/home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide
/home/user/pCloudDrive/courses/CCNA/CCNA_200-301_Official_Cert_Guide

请问为何source该脚本时会陷入循环?


原因分析

死循环的核心原因是你注释中提到的别名设置:alias cd='. ~/CS/SoftwareDevelopment/MySoftware/Bash/cd/cd.sh'。

当你source脚本执行时,脚本最后一行的cd "$dst_dr"会触发这个别名,而非调用Bash内置的cd命令。这会导致每次执行cd都会重新运行你的cd.sh脚本,脚本又会执行cd "$dst_dr",再次触发别名,如此反复形成无限循环。

解决办法

有几种方式可以打破这个循环:

  • 直接调用内置cd命令:在脚本中使用builtin cd "$dst_dr",builtin关键字会强制使用Bash内置的cd,绕过别名:

    # 替换原脚本最后一行的cd命令
    builtin cd "$dst_dr"
    
  • 用函数替代别名,增加触发条件:让自定义逻辑只在参数为file://开头时生效,正常cd操作仍使用内置命令:

    cd() {
        if [[ "$1" == file://* ]]; then
            . ~/CS/SoftwareDevelopment/MySoftware/Bash/cd/cd.sh "$1"
        else
            builtin cd "$@"
        fi
    }
    
  • 调整脚本逻辑:直接在脚本内完成目录切换,不再依赖别名触发脚本,从根源避免循环。


内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:03:10