我正试图在bash脚本中执行这样的rsync;
rsync -e "ssh ${flags_ssh}" -avRz --rsync-path="sudo rsync" $direcNew $(eval echo ${user_name})@$(eval echo ${instance_address}):$(eval echo ${mountdir}`)
然而,当我使用bash-x运行这个时,如下所示:
bash -x ./myscript
我知道它正在尝试运行该命令,除了选项rsync路径看起来像
'--rsync-path=sudo rsync'
如何防止这种情况发生?我需要双引号保留,单引号消失,我不知道为什么会发生这种情况,我尝试过无数次eval和反斜杠的组合,但都没有成功。
您不需要阻止这种情况。实际情况是,当shell解析--rsync-path="sudo rsync"
时,它会删除引号(在引号具有将空格作为参数的一部分而不是参数之间的分隔符的预期效果之后)。然后,当它看到它处于-x模式时,它会给出一个表示,该表示会导致空间被以这种方式处理,并打印出来。它可以打印任何等效的表示,包括(但不限于)以下任何一种:
--rsync-path="sudo rsync"
"--rsync-path=sudo rsync"
--rsync-path=sudo rsync
--rsync-path=sudo" "rsync
'--rsync-path=sudo rsync'
$'--rsync-path=sudo rsync'
...etc
它选择了一个与你不同的表示并不重要,因为这些都是完全等价的——它们都会导致完全相同的东西作为参数传递给rsync
,所以你不需要担心
您本质上也无法"修复"它,因为当shell打印其对命令的解释时,它已经忘记了您碰巧使用了哪个表示形式——它只知道将传递给rsync
的结果参数。为了让它打印其他内容,您必须向rsync
传递一个不同的实际参数,这将破坏rsync
命令。