我确信这个主题已经完全清楚了:) 开玩笑吧,我认为我找到答案的部分问题是编写搜索词。
当我通过使用数组作为参数在 bash 脚本中发出命令时,我很幸运。
例如,我调用 rsync 并创建了一个类似的数组(spolier 警报 - 稍后将引用多余的变量):
#!/usr/bin/env bash
set -euo pipefail
rf=.rsync-filter
srcff="/home/roger/home$rf"
hm=/home/roger
syncto=/tmp/to-remote/home
rsarg=(-avv --prune-empty-dirs --stats)
rsarg+=(--dry-run)
rsync "${rsarg[@]}" "$hm" "$syncto/" #works
exit
我遇到问题的地方是将 $srcff 变量添加到过滤规则并将其添加到 rsarg 数组。
rsarg+=("--filter='merge $srcff'") # no dice
# or this
rsarg+=("--filter='merge ${srcff}'") # sad trombone
运行后我得到:
$ ./home-sync-simple
Unknown filter rule: `'merge /home/roger/home.rsync-filter''
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]
我可以通过将合并规则添加到数组外部的 rsync 行并减去嵌入变量来使其工作:
rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' "$hm" "$syncto/"
用数组外部的变量替换上面的过滤器,也会以同样的方式失败:
rsync "${rsarg[@]}" "--filter='merge $srcff'" "$hm" "$syncto/"
我已经尝试了许多其他变体,我假设除了实际有效的变体之外的所有可能的变体。有时它会导致“过滤规则意外结束:合并”和其他情况。为了简洁起见,我排除了这些版本,因为我认为上面的版本更接近正确(他紧张地说道)。我猜我最终传递的参数太少/太多。
提前致谢!
答案1
如果这有效:
rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' ...
那我想你会的不是想要给 加上单引号rsync
。在这里,贝壳在rsync
看到它们之前就把它们吃掉了。您的其他示例在引号中包含引号,因此内部的引号会保留并传递以供rsync
查看。
因此在构建数组时跳过单引号:
rsarg+=("--filter=merge $srcff")
请注意,从 shell 的角度来看,等号没有什么特别的,并且不需要将后面的部分与之前的部分区别对待。与or 、 or Even--foo=bar
相同。--foo="bar"
"--foo=bar"
--fo"o=ba"r