【发布时间】:2015-06-14 04:45:21
【问题描述】:
我正在尝试运行将文件复制到新位置的 rsync 命令。如果我直接运行 rsync 命令,在命令行上没有任何参数扩展,rsync 会按照我的预期进行
$ rsync -amnv --include='lib/***' --include='arm-none-eabi/include/***' \
--include='arm-none-eabi/lib/***' --include='*/' --exclude='*' \
/tmp/from/ /tmp/to/
building file list ... done
created directory /tmp/to
./
arm-none-eabi/
arm-none-eabi/include/
arm-none-eabi/include/_ansi.h
...
arm-none-eabi/lib/
arm-none-eabi/lib/aprofile-validation.specs
arm-none-eabi/lib/aprofile-ve.specs
...
lib/
lib/gcc/
lib/gcc/arm-none-eabi/
lib/gcc/arm-none-eabi/4.9.2/
lib/gcc/arm-none-eabi/4.9.2/crtbegin.o
...
sent 49421 bytes received 6363 bytes 10142.55 bytes/sec
total size is 423195472 speedup is 7586.32 (DRY RUN)
但是,如果我将过滤器参数包含在一个变量中,并使用该变量调用命令,则会观察到不同的结果。 rsync 复制了一些我确实不期望的额外目录:
$ FILTER="--include='lib/***' --include='arm-none-eabi/include/***' \
--include='arm-none-eabi/lib/***' --include='*/' --exclude='*'"
$ rsync -amnv ${FILTER} /tmp/from/ /tmp/to/
building file list ... done
created directory /tmp/to
./
arm-none-eabi/
arm-none-eabi/bin/
arm-none-eabi/bin/ar
...
arm-none-eabi/include/
arm-none-eabi/include/_ansi.h
arm-none-eabi/include/_syslist.h
...
arm-none-eabi/lib/
arm-none-eabi/lib/aprofile-validation.specs
arm-none-eabi/lib/aprofile-ve.specs
...
bin/
bin/arm-none-eabi-addr2line
bin/arm-none-eabi-ar
...
lib/
lib/gcc/
lib/gcc/arm-none-eabi/
lib/gcc/arm-none-eabi/4.9.2/
lib/gcc/arm-none-eabi/4.9.2/crtbegin.o
...
sent 52471 bytes received 6843 bytes 16946.86 bytes/sec
total size is 832859156 speedup is 14041.53 (DRY RUN)
如果我 echo 失败的命令,它会生成成功的确切命令。复制输出并直接运行会给我预期的结果。
对于 bash 参数扩展的工作原理,我显然遗漏了一些东西。有人可以解释一下为什么这两种不同的调用会产生不同的结果吗?
【问题讨论】:
-
扩展
FILTER变量时,内部单引号不被删除。在rsync行上方添加set -x并比较手动运行和变量运行的输出以了解我的意思。这就是mywiki.wooledge.org/BashFAQ/050 的全部意义所在。 -
谢谢,
set -x提供了很多关于这里发生了什么的见解。 wiki 条目解释了很多。