Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么一个正确的shell脚本会给出一个包装/截断/损坏的错误消息?_Bash_Shell_Sh_Carriage Return - Fatal编程技术网

Bash 为什么一个正确的shell脚本会给出一个包装/截断/损坏的错误消息?

Bash 为什么一个正确的shell脚本会给出一个包装/截断/损坏的错误消息?,bash,shell,sh,carriage-return,Bash,Shell,Sh,Carriage Return,我有一个shell脚本,其中的命令看起来应该可以工作,但是它失败了,出现了一条奇怪的包装/截断/损坏的错误消息。例如: $ ls -l myfile -rw-r----- 1 me me 0 Aug 7 12:36 myfile $ cat myscript ls -l myfile $ bash myscript : No such file or directory 文件显然存在,但即使我没有,我通常也会收到这样的错误消息: $ ls -l idontexist ls: cannot

我有一个shell脚本,其中的命令看起来应该可以工作,但是它失败了,出现了一条奇怪的包装/截断/损坏的错误消息。例如:

$ ls -l myfile
-rw-r----- 1 me me 0 Aug  7 12:36 myfile
$ cat myscript 
ls -l myfile
$ bash myscript
: No such file or directory
文件显然存在,但即使我没有,我通常也会收到这样的错误消息:

$ ls -l idontexist
ls: cannot access idontexist: No such file or directory
注意它是如何包含工具名、消息字符串和文件名的,而我的没有

如果我尝试使用
mysql
,我会得到以下结果。错误消息看起来好像已包装,现在以引号开始:

Command:  mysql -h myhost.example.com
Expected: ERROR 2005 (HY000): Unknown MySQL server host 'myhost.example.com' (0)
Actual:   ' (0) 2005 (HY000): Unknown MySQL server host 'myhost.example.com
下面是我的简单ssh命令,它应该可以工作,或者至少给出一个正常的错误消息,但是它被包装成以冒号开头,以奇怪的重击结束:

Command:  ssh myhost
Expected: ssh: Could not resolve hostname myhost: Name or service not known
Actual:   : Name or service not knownname myhost

为什么会发生这种情况,我如何解决它;DR:您的脚本或数据具有Windows样式的CRLF行结尾

通过删除回车符转换为Unix样式


如何检查脚本或数据是否有回车符? 在
cat-v yourscript的输出中,它们可以检测为
^M

$ cat -v myscript
ls -l myfile^M
如果您的脚本没有它们,您的数据可能会——特别是从ini/csv文件或
curl
读取时:

hostname=$(curl https://example.com/loginhost.txt)
ssh "$hostname"            # Shows strange error
echo "$hostname" | cat -v  # Shows myhost^M
如何移除它们? 将编辑器设置为使用Unix行结束符(也称为“行终止符”或“行结束字符”)保存文件,然后重新保存

您还可以使用
dos2unix-yourscript
cat-yourscript | tr-d'\r'>fixedscript
从命令行中删除它们

如果在数据中找到,您可以通过
tr-d'\r'

hostname=$(curl https://example.com/loginhost.txt | tr -d '\r')
为什么回车会导致奇怪的错误消息? “回车”字符,也称为CR或
\r
,使光标移动到行首,并从那里继续打印。换句话说,它从一开始就开始覆盖该行。这就是为什么它们包裹得很奇怪:

Intended:     ssh: Could not resolve hostname myhost\r: Name or service not known

Written:      ssh: Could not resolve hostname myhost\r
Overwritten:  : Name or service not known
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                  
Result:       : Name or service not knownname myhost

我想知道是否值得交叉引用你的另一行结尾问题。(到目前为止,我已经看到了这个问题,还有一个问题;你有更多的问题吗?)或者甚至将一个问题作为另一个问题的副本来结束:)@chepner这是一个选择:a.令人困惑地作为一个看似不相关的问题的副本来结束,因为修复方法恰好可以解决这两个问题;B.笨拙地将多个问题添加到一篇文章中,或者C.只发布两个问题。我使用了C语言,将这两种语言都添加到bash tag wiki中,并将它们标记为社区答案,以明确这不是一个点骗局:在vi中打开文件并键入:set ff=unixGreat fix,非常感谢!