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

Bash脚本无法运行:Command Not Found问题排查求助

问题:Bash脚本执行报错及语法错误排查

脚本背景

我编写了一个Bash脚本,计划作为cron任务每5分钟执行一次,功能是按预设规则读取每日生成的日志文件:通过.flag文件记录已读取的位置,当匹配到指定错误模式时,执行teste.sh重启服务。此前已解决过换行符问题,但在另一台机器测试时遇到以下问题:

遇到的错误

  1. 执行sudo ./restarScript.sh时提示:sudo: ./restarScript.sh: command not found
  2. JDoodle检测出$'\r'(已处理)和意外文件结束的语法错误,ShellCheck未发现问题
  3. 目标机器为Red Hat系统

脚本代码

#!/bin/bash

LAST_POS_FILE="last_position.flag"

PATTERN='ERROR [pt.gsoft.oasis.platform.plugins.mediaconverter.ejb.messages.MediaConverterMDB]'

LOG_FILE='/var/local/log/server.log'

if [ ! -f "$LAST_POS_FILE" ]; then
        echo 0 > "$LAST_POS_FILE"

fi

LAST_POS=$(cat "$LAST_POS_FILE")

CURR_LOG=$(date+"%Y-%m-%d")

if [ "$LOG_FILE.$CURR_LOG" -nt "$LOG_FILE" ]; then
        LOG_FILE="$LOG_FILE.$CURR_LOG"
fi

if [[ "$LOG_FILE" -nt "$LOG_FILE" ]]; then
        LINE=$(grep -E "$PATTERN" "$LOG_FILE" | awk -F: '{print $1}')

        if [ -n "$LINE" ]; then
                if [ "$LINE" -gt "$LAST_POS" ]; then
                        echo "$LINE" > "$LAST_POS_FILE"

                        ./teste.sh
                fi
        fi
fi

# end of file #

相关输出

终端执行输出

filipe@filipe-virtual-machine:~$ sudo ./restarScript.sh
sudo: ./restarScript.sh: command not found

ShellCheck检测结果

$ shellcheck myscript
No issues detected!

$

JDoodle检测结果

jdoodle.sh: line 2: $'\r': command not found
jdoodle.sh: line 4: $'\r': command not found
jdoodle.sh: line 6: $'\r': command not found
jdoodle.sh: line 8: $'\r': command not found
jdoodle.sh: line 35: syntax error: unexpected end of file
Command exited with non-zero status 2

解决方案

1. 解决"command not found"错误

  • 检查脚本执行权限:执行ls -l restarScript.sh,如果无x权限,运行chmod +x restarScript.sh添加执行权限
  • 确认路径有效性:执行sudo pwd确认脚本在当前目录,或使用绝对路径执行(如sudo /home/filipe/restarScript.sh)
  • 规避sudo环境问题:尝试sudo bash ./restarScript.sh强制用bash解释执行

2. 解决语法错误和"意外文件结束"问题

  • 清除残留换行符:即使已处理过$'\r',仍可能有残留。运行dos2unix restarScript.sh转换为Unix格式,或用sed -i 's/\r$//' restarScript.sh去除每行末尾的\r
  • 修复语法错误:
    • 第14行:date+"%Y-%m-%d"错误,date和+之间需加空格,改为CURR_LOG=$(date +"%Y-%m-%d")
    • 第20行:if [[ "$LOG_FILE" -nt "$LOG_FILE" ]]; then是无效判断(文件与自身比较永远为假),导致后续逻辑不执行,可改为if [ -f "$LOG_FILE" ]; then确保日志文件存在再处理
    • 正则转义:PATTERN中的[]是正则特殊字符,需转义,改为PATTERN='ERROR \[pt.gsoft.oasis.platform.plugins.mediaconverter.ejb.messages.MediaConverterMDB\]'
  • 检查脚本完整性:确认所有if语句都有闭合,换行符问题可能导致解析异常

3. 其他优化建议

  • 读取LAST_POS时避免空值:改为LAST_POS=$(cat "$LAST_POS_FILE" 2>/dev/null || echo 0)
  • 执行teste.sh时使用绝对路径,避免cron环境下找不到脚本
  • cron任务中统一使用绝对路径调用脚本和日志文件,规避环境变量差异问题

内容的提问来源于stack exchange,提问作者Filipe Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:05:25