如何让 bash 为带有 Windows 行结尾的文件提供相关错误?

如何让 bash 为带有 Windows 行结尾的文件提供相关错误?

假设我有以下 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 行终止符)。

相关内容