代码之家  ›  专栏  ›  技术社区  ›  ptmr.io

Bash脚本出错;执行跟踪中有“\r”个字符

  •  0
  • ptmr.io  · 技术社区  · 7 年前

    我正在尝试制作一个小脚本,或多或少自动地将我的项目目录与共享git repo同步。然而,我似乎没有把第一句话说对。因此,理论上这应该是好的:

    #!/bin/bash
    rsync -trnv /mnt/d/project/bundle/ /mnt/d/bundle/ --exclude=".git" --delete
    cd /mnt/d/bundle/
    git add .
    read -p "" msg
    git commit -m $msg
    git push origin master
    cd "${0%/*}"
    

    脚本失败了,afaik,因为它完全忽略了rsync命令的第二个选项。此外,它找不到目录,这是一个绝对路径,并且存在。请参见:

    $ bash -x ptmrbundle-rsync.sh
    + rsync -trnv /mnt/d/bundle/ /mnt/d/project/bundle/ --exclude=.git $'--delete\r' rsync: --delete\#015: unknown option rsync error: syntax or usage error (code 1) at main.c(1572) [client=3.1.1]
    + cd $'/mnt/d/bundle/\r' : No such file or directory: cd: /mnt/d/bundle/
    

    注意:在windows的linux子系统上工作。

    因此,命令行在shell itselt中工作正常,但在中使用时。sh脚本(如果完全失败)。怎么了?

    1 回复  |  直到 4 年前
        1
  •  1
  •   daKmoR    7 年前

    在Windows或Linux上,行尾是不同的。

    考虑文件

    Line A
    Line B
    Libe C
    

    在Windows上

    Line A\r\n
    Line B\r\n
    Libe C\r\n
    

    在Linux上

    Line A\n
    Line B\n
    Libe C\n
    

    正如您所看到的,在如何定义线的端点方面存在差异。

    显然,您保存的文件以Windows行结尾 \r\n 所以Linux并不“关心” \r 它假定它是您正在编写的脚本的一部分。。。所以你实际上是在执行

    #!/bin/bash\r
    rsync -trnv /mnt/d/project/bundle/ /mnt/d/bundle/ --exclude=".git" --delete\r
    cd /mnt/d/bundle/\r
    git add .\r
    read -p "" msg\r
    git commit -m $msg\r
    git push origin master\r
    cd "${0%/*}"\r
    

    这将导致各种问题。

    要解决此问题,请在编辑器中打开该文件并更改行尾。

    e、 g.在记事本中++

    1. 打开文件
    2. 编辑->Eol转换->Unix(LF)
    3. 保存文件