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