Shell脚本在VS Code运行正常 但Windows Ubuntu子系统执行后不退出
问题根因
- 路径不匹配问题:WSL Ubuntu环境下
rm命令默认路径为/usr/bin/rm,脚本中trap逻辑写死了/bin/rm,执行EXIT trap时命令调用失败,导致脚本卡在退出前的清理逻辑无法结束 - shell兼容性问题:脚本声明用
#!/bin/sh,WSL中sh默认指向dash,dash不支持bash专属的typeset语法,多余的typeset calculate声明会触发未定义命令错误,干扰正常执行流程 - 无显式退出逻辑:计算逻辑执行完成后没有主动声明退出,依赖shell默认结束逻辑容易在WSL的虚拟环境下出现异常
解决方案
按以下步骤修改脚本即可解决卡顿问题:
- 替换脚本首行的解释器声明为
#!/bin/bash,避免dash语法不兼容问题 - 直接删除无用的
typeset calculate行,该变量全程未使用,属于冗余代码 - 将trap逻辑中的
/bin/rm替换为rm,让shell自动匹配PATH中的可执行文件,适配不同环境的路径差异 - 在计算逻辑的末尾添加
exit 0,执行完成后主动退出程序
修正后完整脚本
#!/bin/bash #============================================ plus() { sum=$(( $1 + $2 )) echo "$sum" } minus() { minus=$(( $1 - $2 )) echo "$minus" } multiply() { multiply=$(( $1 * $2 )) echo "$multiply" } divide() { divide=$(( $1 / $2 )) echo "$divide" } help() { echo " Description: Simple calculation Syntax: Calculate [-plus|-minus|-divide|-multiply] -a1 num1 -a2 num2 Examples: $ calculate -plus -a1 1 -a2 2 3 " exit 0 } #============================================ # 主程序 #============================================ if test $# -eq 0 then help else a1= a2= mode= while [ "$#" -ne 0 ] do case "$1" in -plus) mode="PLUS"; shift;; -minus) mode="MINUS"; shift;; -divide) mode="DIVIDE"; shift;; -multiply) mode="MULTIPLY"; shift;; -a1) shift; num1="$1"; shift;; -a2) shift; num2="$1"; shift;; *) echo "Error in $0: wrong option $1"; help; exit 1;; esac done fi tmpname=${0##*/} # 保留前10个字符 command=`echo "$tmpname" | sed 's/^\(..........\).*/\1/'` TEMPA=/tmp/${command}A$$ TEMPB=/tmp/${command}B$$ ALL_TEMP="$TEMPA $TEMPB" trap "rm -f $ALL_TEMP; exit 1" \ 1 2 3 15 trap "rm -f $ALL_TEMP" 0 if [ "$mode" = "PLUS" ] then plus $num1 $num2 elif [ "$mode" = "MINUS" ] then minus $num1 $num2 elif [ "$mode" = "DIVIDE" ] then divide $num1 $num2 elif [ "$mode" = "MULTIPLY" ] then multiply $num1 $num2 fi exit 0
内容的提问来源于stack exchange,提问作者Nikhil Kulkarni
相关产品推荐
相关产品推荐

