不能使用bash变量进行tar的排除

时间:2018-02-11 11:14:55

标签: 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 ./
~/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

我想念的是什么?

1 个答案:

答案 0 :(得分:3)

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

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

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