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

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的虚拟环境下出现异常
解决方案

按以下步骤修改脚本即可解决卡顿问题:

  1. 替换脚本首行的解释器声明为#!/bin/bash,避免dash语法不兼容问题
  2. 直接删除无用的typeset calculate行,该变量全程未使用,属于冗余代码
  3. 将trap逻辑中的/bin/rm替换为rm,让shell自动匹配PATH中的可执行文件,适配不同环境的路径差异
  4. 在计算逻辑的末尾添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:36:05