无法将bash变量用于tar';s排除

无法将bash变量用于tar';s排除,bash,tar,Bash,Tar,我必须动态地为tar命令构建排除。排除列表将非常短(如果有),所以更好的方法是为命令行构建一个--exclude=参数列表,而不是使用带有--exclude from的临时文件。但是使用bash变量不起作用。看看这个例子: ~/test$ EXCLUDES=" --exclude='./do-not-backup'" ~/test$ echo $EXCLUDES --exclude='./do-not-backup' ~/test$ tar czf backup.tgz $EXCLUDES ./

我必须动态地为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
~/test$EXCLUDES=“--exclude=”./不备份”
~/test$echo$EXCLUDES
--排除='。/不备份'
~/test$tar czf backup.tgz$EXCLUDES/
~/test$tar tzf backup.tgz
./
/dir1/
/dir1/file1

./don backup/存储可能包含空格的参数的最佳方法是在数组中。每个参数都可以是单独的数组项,可以有空格,也可以没有空格

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

这里的单引号是可选的,与您正常键入
--exclude
参数时完全相同。正如您所看到的,Bash在创建数组时解析引号,而引号实际上并不存储在数组值中。

Versions:在Ubuntu 16.04.3 LTS(Bash 4.3.48(1)-release,tar(GNU tar)1.28和CentOS 7(Bash 4.2.46(2)-release,tar(GNU tar)1.26)上观察到的相同行为。