从 cron 作业执行 bash 脚本时出现“/bin/bash^M: 错误的解释器:没有这样的文件或目录”错误

"/bin/bash^M: bad interpreter: No such file or directory" error when executing a bash script from a cron job

Restore_DB.sh :-

#!/bin/bash
mysql -u user -ppassword DB_name < /home/A/B/SQL_File.sql

我使用上面的代码从 cron 作业恢复了 MySQL 数据库,但我收到了下面的错误

/usr/local/cpanel/bin/jailshell: /home/A/B/Restore_DB.sh: /bin/bash^M: bad interpreter: No such file or directory

这是我使用的 cron 作业命令:-

/home/A/B/Restore_DB.sh

他看起来像是 unixoid 和 MS-Windows 之类系统上不同行尾编码的问题。

使用 unixoid 系统固有的以 \n 结尾的行,而不是 MS-Windows 样式。那一个包含一个额外的字符,通常显示为您在错误消息中看到的内容 (^M)。

您可以使用十六进制编辑器仔细查看有问题的行。这使您可以准确地查看字符串中使用了哪些不可打印的字符。

尝试 dos2unix 是否可以修复您的文件:

$ dos2unix /home/A/B/Restore_DB.sh

如果 dos2unix 还不存在,您可以使用您的发行版的包管理器安装它。

问题是换行编码,Windows/DOS 换行编码与 Unix 不同。

  • Unix 换行序列:\n(仅换行符)
  • Windows换行序列:\r\n(2个字符,回车return和换行)

https://en.wikipedia.org/wiki/Newline#Representations

yum install dos2unix

很有魅力!!!!

我只是 运行 在 OS X 上加入了这个并且注意到 dos2unix 可以作为 brew 公式使用:

brew install dos2unix