我试图在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-path看起来像
'--rsync-path=sudo rsync'
如何防止这种情况?我需要留下双引号和单引号消失,我不知道它为什么会发生,我已经尝试了无数的eval和反斜杠组合而没有成功。
答案 0 :(得分:0)
你不需要阻止这一点。发生的事情是,当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
,所以你不要# 39;不用担心。
你本质上不能"修复"它,因为当shell打印出你对命令的解释时,它已经忘记了你碰巧使用了哪种表示 - 它只知道将要传递给{{1}的结果参数}。为了让它打印其他东西,你必须将一个不同的实际参数传递给rsync
,这会破坏你的rsync
命令。