Shell(/bin/bash
)正在为从for
循环中的文件读入的变量添加单引号,导致rsync
失败。
我有一个shell脚本执行一堆rsync
s。输入文件如下所示:
/home/account/this
子目录
for循环如下所示:
IFS=$'\n'
for SOURCE_DEST in `cat file_list`
do
rsync -av -e 'ssh -p 2222' account@domain.com:$SOURCE_DEST
done
如果没有IFS=$'\n'
,默认情况下$SOURCE_DEST
只会包含:
/home/account/this
代替/home/account/this subdirectory
。
但是,当我使用IFS=$'\n'
运行此脚本时,它会在$SOURCE_DEST
周围放置单引号,例如:'account@domain.com:/home/account/this subdirectory'
,这会导致rsync失败并执行奇怪的操作。
示例:
rsync --delete-after -av -e 'ssh -p 2222' 'account@domain.com:/home/account/this subdirectory'
失败了,我需要的是没有单引号:
rsync --delete-after -av -e 'ssh -p 2222' account@domain.com:/home/account/this subdirectory
答案 0 :(得分:1)
我将假设没有名称包含空格,因为你使用空格作为分隔符,那么如何做这样的事情:
while read line
do
line=($line) # split line on its spaces
rsync -av -e 'ssh -p 2222' account@domain.com:${line[0]} ${line[1]}
done < file_list
这一次读取你的file_list一行,在空格处分割它,然后使用它作为args的第一个和第二个“word”。
正如Johnsyweb所指出的那样,你可能意味着该目录实际上确实有一个空格,你想将它传递给rsync
。在那种情况下,我会说:
while read line
do
rsync -av -e 'ssh -p 2222' "account@domain.com:${line// /\ }"
done < file_list
这应该导致所有空间被转义,我认为这可能是你以前缺少的。