我有一个脚本,它使用一些动态生成的参数调用rsync
命令,但是我无法正确传递它们。
这里有一些摘录:
logfile="$logDir/$(timestamp) $name.log"
echo "something" >> "$logfile"
params="-aAXz --stats -h --delete --exclude-from $exclude --log-file=$logfile $src $dest"
if [ "$silent" = "" ]; then
params="-v $params --info=progress2"
fi
rsync $params
如果日志文件是例如/tmp/150507 test.log
something
语句实际写入/tmp/150507 test.log
,但rsync
将其日志写入/tmp/150507
(删除第一个空格后的所有内容)。
如果我在params中明确引用了日志文件的名称,rsync会引发异常:
params="-aAXz --stats -h --delete --exclude-from $exclude --log-file=\"$logfile\" $src $dest"
错误:
rsync:无法打开日志文件" / tmp / 150507:没有此类文件或目录(2)
忽略"日志文件"设置。
如何在不失去在文件名中使用空格的情况下动态生成参数?
答案 0 :(得分:1)
日志文件名称需要更多引用:
declare -a params
params=(-aAXz --stats -h --delete --exclude-from "$exclude" --log-file="$logfile" "$src" "$dest")
if [ "$silent" = "" ]; then
params+=(-v "$params" --info=progress2)
fi
rsync "${params[@]}"
在这种情况下,您应该考虑使用BASH数组来构成动态命令行。