代码之家  ›  专栏  ›  技术社区  ›  DotNetRussell

Bash equal variables is not equal[复制]

  •  0
  • DotNetRussell  · 技术社区  · 7 年前

    我有一个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
    

    请注意它是如何包含工具名称的 ls ,一个消息字符串和文件名,而我的没有。

    如果我尝试使用 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
    

    为什么会发生这种情况,我该怎么解决?

    0 回复  |  直到 10 年前
        1
  •  15
  •   that other guy    10 年前

    DR:您的脚本或数据具有Windows风格的CRLF行结尾。

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


    如何检查脚本或数据是否有回车符?

    ^M 在的输出中 cat -v yourscript :

    $ 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')
    

    为什么回车会产生奇怪的错误信息?

    \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