Bash脚本无法运行:Command Not Found问题排查求助
问题:Bash脚本执行报错及语法错误排查
脚本背景
我编写了一个Bash脚本,计划作为cron任务每5分钟执行一次,功能是按预设规则读取每日生成的日志文件:通过.flag文件记录已读取的位置,当匹配到指定错误模式时,执行teste.sh重启服务。此前已解决过换行符问题,但在另一台机器测试时遇到以下问题:
遇到的错误
- 执行
sudo ./restarScript.sh时提示:sudo: ./restarScript.sh: command not found - JDoodle检测出
$'\r'(已处理)和意外文件结束的语法错误,ShellCheck未发现问题 - 目标机器为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\]'
- 第14行:
- 检查脚本完整性:确认所有
if语句都有闭合,换行符问题可能导致解析异常
3. 其他优化建议
- 读取
LAST_POS时避免空值:改为LAST_POS=$(cat "$LAST_POS_FILE" 2>/dev/null || echo 0) - 执行
teste.sh时使用绝对路径,避免cron环境下找不到脚本 - cron任务中统一使用绝对路径调用脚本和日志文件,规避环境变量差异问题
内容的提问来源于stack exchange,提问作者Filipe Gonçalves
相关产品推荐
相关产品推荐

