执行shell脚本报错 '\357\273\277': command not found 解决办法

本文介绍如何在vi编辑器中删除UTF-8文件中的BOM,并解释了BOM(字节顺序标记)的概念及其对文件的影响。BOM在文件开始处用于标识文件的编码方式,但有时会干扰正常的文本处理流程。

1,删除BOM,在vi下面执行下面的命令即可

:set nobomb

2,原因:

所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32)

对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就是1/2/4字节,如果是多字节,就要牵扯到字节序,UTF-8以单字节为编码单位,所以不存在字节序。UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了,除此以外,BOM的存在还可能引发一些问题。所以要UTF-8编码中BOM的检测与删除。


参考:http://huoding.com/2011/05/14/78

<think>我们正在解决CentOS系统中crontab执行脚本时出现'mongodump: command not found'错误的问题。根据引用[1]和[2]的信息,这个错误通常是因为crontab执行环境的环境变量与手动执行时的环境变量不同,导致mongodump命令所在的路径不在crontab的PATH环境变量中。 解决方法有两种思路: 1. 在脚本中设置完整的PATH环境变量,确保包含mongodump的路径。 2. 在crontab中加载所需的环境变量,例如通过source /etc/profile。 具体步骤: 步骤1:确定mongodump的完整路径 在终端执行: which mongodump 假设输出为:/usr/local/mongodb/bin/mongodump 步骤2:修改脚本,使用绝对路径执行mongodump 将脚本中的`mongodump`替换为`/usr/local/mongodb/bin/mongodump` 或者 步骤2替代方案:在脚本开头设置PATH 在脚本的顶部添加: export PATH=$PATH:/usr/local/mongodb/bin 步骤3:或者修改crontab任务,在任务命令前加载环境变量 在crontab任务行中,先加载环境变量,再执行脚本。例如: 0 0 1 * * . /etc/profile; /opt/scripts/monthly_task.sh >> /var/log/monthly_task.log 2>&1 注意:这里使用点(.)或source命令来加载环境变量,但crontab默认使用/bin/sh执行,而/bin/sh可能不支持source,所以使用点(.)更通用。也可以使用绝对路径的脚本,并确保脚本内部已经设置了正确的环境变量。 步骤4:另一种方法是直接在crontab中设置PATH 在crontab文件的开头添加环境变量设置(注意:这会影响该用户的整个crontab): PATH=/usr/bin:/bin:/usr/local/mongodb/bin 0 0 1 * * /opt/scripts/monthly_task.sh >> /var/log/monthly_task.log 2>&1 步骤5:验证 可以设置一个临时的crontab任务(比如1分钟后执行)来测试。 根据引用[5]中的例子,也可以考虑在crontab中设置SHELL和PATH变量,例如: SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mongodb/bin 0 0 1 * * /opt/scripts/monthly_task.sh >> /var/log/monthly_task.log 2>&1 注意:由于crontab的执行环境是精简的,最好在脚本内部设置好所需的环境变量。 同时,根据引用[3]和[4],注意crontab的语法,确保时间设置正确,并且命令格式正确(避免出现用户名的位置写命令等错误)。 总结:最可靠的方法是在脚本内部使用绝对路径调用mongodump,或者在脚本开头设置PATH环境变量。 示例脚本修改: 原始脚本可能有一行: mongodump ... 修改为: /usr/local/mongodb/bin/mongodump ... 或者 在脚本开头添加: export PATH=$PATH:/usr/local/mongodb/bin 然后保留原来的`mongodump`命令。 如果mongodump还依赖于其他环境变量(比如MongoDB的认证信息等),则最好在脚本中设置这些变量,或者通过配置文件加载。 另外,根据引用[2]和[5],也可以考虑在crontab中加载环境变量,但这种方法依赖于具体的环境配置文件,可能会因系统配置而异。 建议:优先采用在脚本中设置PATH的方法,这样脚本的移植性更好。 </think>### CentOS系统中解决crontab执行脚本报'mongodump: command not found'错误 #### 问题原因分析 该错误是由于 **crontab执行环境与用户环境不一致** 导致的: 1. `mongodump`命令路径未包含在crontab的`PATH`环境变量中(引用[1][2]) 2. crontab默认使用`/bin/sh`执行脚本,而非用户的登录shell(引用[3][4]) 3. MongoDB环境变量未加载到crontab执行环境(引用[5]) --- #### 解决方案(逐步操作) ##### 方法1:在脚本中指定绝对路径(推荐) ```bash # 1. 查找mongodump路径 which mongodump # 输出示例:/usr/local/mongodb/bin/mongodump # 2. 修改脚本中的mongodump命令 sudo vi /opt/scripts/monthly_task.sh ``` ```bash #!/bin/bash # 将mongodump替换为绝对路径 /usr/local/mongodb/bin/mongodump --your-parameters ``` ##### 方法2:在crontab中加载环境变量 ```bash crontab -e ``` ```cron # 加载系统环境变量后执行脚本 0 0 1 * * . /etc/profile; . ~/.bashrc; /opt/scripts/monthly_task.sh >> /var/log/monthly_task.log 2>&1 ``` ##### 方法3:在crontab中声明PATH ```cron # 在crontab开头设置PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$(which mongodump | xargs dirname) SHELL=/bin/bash 0 0 1 * * /opt/scripts/monthly_task.sh >> /var/log/monthly_task.log 2>&1 ``` ##### 方法4:在脚本中显式设置环境 ```bash #!/bin/bash # 加载MongoDB环境变量 source /etc/mongodb.conf export PATH=$PATH:$(which mongodump | xargs dirname) # 执行备份命令 mongodump --your-parameters ``` --- #### 验证步骤 1. **测试脚本执行**: ```bash # 模拟crontab环境测试 env -i /bin/sh -c "/opt/scripts/monthly_task.sh" ``` 2. **检查日志**: ```bash tail -f /var/log/monthly_task.log ``` 3. **查看cron日志**: ```bash tail -f /var/log/cron ``` --- #### 关键注意事项 1. **路径验证**: ```bash # 确保路径包含mongodump目录 echo $PATH | tr ':' '\n' | grep mongodb ``` 2. **环境变量继承**: - crontab默认不加载用户环境变量(引用[5]) - 使用`. /etc/profile`比`source`更兼容`/bin/sh`(引用[2]) 3. **权限问题**: ```bash # 确保脚本执行权限 chmod +x /opt/scripts/monthly_task.sh ``` 4. **日志记录**: ```bash # 在脚本中添加详细日志记录 echo "$(date) - Starting backup" >> /var/log/monthly_task.log mongodump ... 2>&1 | tee -a /var/log/monthly_task.log ``` --- ### 常见问题排查 1. **路径查找失败**: ```bash # 全局搜索mongodump sudo find / -name mongodump 2>/dev/null ``` 2. **环境变量差异**: ```bash # 对比环境变量差异 echo "=== Login Environment ===" > env_diff.txt env >> env_diff.txt echo "=== Cron Environment ===" >> env_diff.txt env -i /bin/sh -c "env" >> env_diff.txt ``` 3. **SELinux限制**: ```bash # 检查SELinux日志 grep cron /var/log/audit/audit.log | audit2why ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值