shell 脚本中的 scp 和换行符

shell 脚本中的 scp 和换行符

我有一个.sh文件,其中包含一个命令,该命令将文件从远程服务器复制到特定目录,保留原始文件名,第二行只是一条注释:

scp (host):~/filename.sql ~/
# just a comment

我将脚本命名为dbcopy.sh,将其放在我的主目录中,然后从控制台运行它,如下所示:

sh ~/dbcopy.sh

问题是由于 scp 命令后面有一个换行符,导致复制的文件的名称由一个字符组成(在下面的列表中显示为问号)而不是原始名称!

console> ls -l ~
...
-rw-rw-r--  1 (user)  (group)   158327960 26 oct 17:28 ?

如果我删除命令后的任何换行符,scp一切都会按预期工作。

我该如何处理这种情况?

答案1

问题在于我的编辑器中的行结束分隔符:它使用了\r\n序列而不是仅仅\n。因此命令的最后一个参数scp不是~/它显示的那样。它实际上是~/\r

因此,不是传递以斜杠结尾的目录名(这将指示命令将文件复制到该目录中并保留文件的名称 - 这是我预期的行为),而是在斜杠后添加了一些字符\r,这导致命令接受它作为被复制文件的新名称。

答案2

您没有包含脚本或有关如何运行脚本的信息。我不知道您是从用户cronjob还是从其他用户调用它。

也就是说,以下非常基本的测试脚本(t.sh)在 FreeBSD 上对我来说运行完美。

#!/bin/sh
echo "Pre test"
scp spider.goo:~/tColor.c ~/
echo "Post test"

像这样调用:

sh ./t.sh

输出如下:

Pre test
Password for tigger@spider:
tColor.c       100% 1805     1.8KB/s   00:00    
Post test

相关内容