不能将 bash 变量用于 tar 的排除

Cannot use bash variable for tar's exclude

我必须为 tar 命令动态构建排除项。排除列表会很短(如果有的话),因此更好的方法是为命令行构建一个 --exclude= 参数列表,而不是使用带有 --exclude-from 的临时文件。但是使用 bash 变量不起作用。看看这个例子:

~/test$ EXCLUDES=" --exclude='./do-not-backup'"
~/test$ echo $EXCLUDES
--exclude='./do-not-backup'
~/test$ tar czf backup.tgz $EXCLUDES ./
~/test$ tar tzf backup.tgz
./
./dir1/
./dir1/file1
./do-not-backup/                       <=== wrong
./do-not-backup/nofile                 <=== wrong
./dir2/
./dir2/file2
./backup.tgz
~/test$ rm backup.tgz
~/test$ tar czf backup.tgz --exclude='./do-not-backup' ./ # Same command without bash variable
~/test$ tar tzf backup.tgz
./
./dir1/
./dir1/file1
./dir2/
./dir2/file2
./backup.tgz

我想念什么?

存储可能包含空格的参数的最佳方式是在数组中。每个参数可以是一个单独的数组条目,带或不带空格。

$ excludes=(--exclude='./do-not-backup')
$ printf '%q\n' "${excludes[@]}"
--exclude=./do-not-backup
$ tar -czf backup.tgz "${excludes[@]}" ./

这里的单引号是可选的,就像您正常键入 --exclude 参数一样。如您所见,Bash 在创建数组时解析引号,它们实际上并未存储在数组值中。