3

我通常使用 scp 来复制东西,但现在我正在尝试习惯更强大的 rsync 命令。它通过仅复制已更改的文件来帮助我使用更少的带宽。但是,rsync 有很多复杂的参数,所以我想,嘿,我就做一个简单的 Bash 脚本,调用命令 'rscp'。所以,我开始构建这样的东西。请注意,在下面的示例中,我的 Web 主机使用除了 22 之外的不同端口号,这就是为什么使用 $1 的原因。

#!/bin/bash

rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7

所以,我希望它的用法是这样的:

rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite

你看,这会让它更接近我对 scp 命令的使用。

但是,当我运行此程序时,出现此错误:

building file list ... 
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]

但是如果我回到常规的 rsync 命令,它工作得很好。

谁能弄清楚我在我的 Bash 脚本中做错了什么?

4

2 回答 2

7

/var/www/mysite/* 由 shell 扩展,因此传入的参数比在脚本中处理的参数多得多。

变量也不用单引号代替,因此您需要使用双引号。(参见 bash手册页

试试这个:

#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"

首先我们将端口从参数列表中取出(使用移位),然后我们使用特殊的“$@”,它指的是参数(在这种情况下是脚本),并被转换为所有参数,但每个都是单独的在双引号中。(有关更多详细信息,请参见 bash手册页)。

于 2008-11-16T19:07:54.030 回答
0

你不能在技术上把它变成一个函数吗?:

    rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}

然后当你运行它时: rscp 3822

于 2016-12-24T04:38:57.413 回答