原因:
报错: -sh: /opt/bin/bdgo.sh: /bin/bash^M: bad interpreter: No such file or directory
- 这种情况经常发生在 Windows 系统创建的脚本,放到 UNIX 上运行
- 在 Windows 和 Unix 系统之间传输文件时没有使用 ASCII 方式
- 在 Windows 中系统的回车使用 CRLF 样式的换行符,但 UNIX是LF
- 带有 Windows 换行符的脚本在 Bash 中执行,报错信息中会包含 “
^M
” - shell 试图将
/bin/bash^M
作为解释器路径,但这个路径不存在 - 这几天用 VS code 写了几行脚本,传到 Ubuntu 运行报错
- 推荐 notepad++ 以前一至用它读写脚本
- 剔除 Shell script 里面的 Windows 换行符即可
解决方法:
例子,剔除 /opt/bin/bdgo.sh 中的 Windows 换行符:
VS code 编辑器
在编辑器的右下: CRLF 点击可以切换为 LF
工具 dos2unix:
dos2unix /opt/bin/bdgo.sh
vi 编辑器
vi /opt/bin/bdgo.sh
:set ff=unix
:wq
sed 命令
sed -i 's/\r$//' /opt/bin/bdgo.sh
awk 命令
awk '{ sub("\r$", ""); print }' /opt/bin/bdgo.sh > /opt/bin/bdgo.sh.tmp && mv /opt/bin/bdgo.sh.tmp /opt/bin/bdgo.sh
结束:
初学 UNIX/LINUX 买过 2 本书(记忆中的),一本是 unix shell 编程 ,一本是 unix/linux 命令大全之类的名字,这是我工作后位数不多的,能看完的书。 书里还是 /bin/sh,bash 在其中一本有提到,大概比世界晚了10年。
那时在商超机房,第一次看到厉害的脚本,是他们盗版来的某国超市的完整系统。后台的界面是运行在 shell 中... 太有意思了。但会 Unix SQLplus 不好找工作,就去改学 CCNA/CCNP MCSE DBA... 学㕑考证。含金量最高的证书:中级厨师,做饭水平越升。
因为 bash 可以用键盘的 向上/向下 找到 .bash_history 中的命令,很方便。也被陆续发布的 Linux/Unix 成为默认 Shell,让 script 的功能加更强大。
shell script 也有它的缺点,比如不同 shell 兼容,数据中能是字符串,I/O 性能杀手等等。