为何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
相关产品推荐
相关产品推荐

