假设我有以下 shell 脚本:
#!/bin/bash \n
echo "Hello World" \n
运行它给出
Hello world.
现在假设我有以下 shell 脚本
#!/bin/bash \r\n
echo "Hello world" \r\n
运行它给出结果:
bad interpreter: No such file or directory
对于新手 - 这并不能真正指出问题的原因(假设原因是空格)。您真正需要的是一个告诉您问题所在的错误。
我的问题是:如何让 bash 为带有 Windows 行结尾的文件提供相关错误?
编辑:
这里的上下文是某人查看文件但没有看到行结尾 - 并且无意中造成了这种情况。当被问及 Unix 上的文本文件和 Windows 上的文本文件之间的区别时,他们回答说:“你是什么意思?这只是纯文本?”该问题旨在提示用户查看问题的根本原因。
答案1
问题是错误发生在 bash 运行之前。
#!
当您运行以then开头的脚本时核心查看该行的其余部分并运行它,并将文件名作为第一个参数。因此,当您有 DOS 格式的文件时,内核将看到/bin/bash^M
并尝试将其作为程序运行。当然,这是不存在的。
如果你想变得有点疯狂可以/bin/bash^M
创建一个名为...的程序
$ ls -lb /bin/bash?
-rwxr-xr-x 1 root root 61 Jun 18 22:41 /bin/bash\r
$ cat /bin/bash?
#!/bin/sh
echo Convert your program to Unix format!
exit 255
$ file foo
foo: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ cat -v foo
#!/bin/bash^M
echo hello^M
$ ./foo
Convert your program to Unix format!
$ dos2unix foo
dos2unix: converting file foo to Unix format ...
$ ./foo
hello
不过,我不确定我会推荐这个!
相反,我建议进行教育和诊断“运行手册”(例如file
命令报告 CRLF 行终止符)。