tar 排除在 bash 中不起作用

tar 排除在 bash 中不起作用

我无法使用 bash 脚本进行 tar 排除。

#!/bin/bash


CMD='tar --exclude=*.{db,log,token} -zcvf /home/pi/backup/2020.11.08-18.04.59.backup.tgz -P /home/pi/backup/test'
echo $CMD
sudo $CMD

但是,如果我运行 echo 输出命令,它就会起作用。

tar --exclude=*.{db,log,token} -zcvf /home/pi/backup/2020.11.08-18.04.59.backup.tgz -P /home/pi/backup/test

我正在尝试根据文件扩展名排除文件。

焦油(GNU 焦油)1.30

答案1

在 bash 中你应该使用一个数组:

cmd=(tar --exclude='*'.{db,log,token} -zcvf /home/pi/backup/2020.11.08-18.04.59.backup.tgz -P /home/pi/backup/test)

echo "${cmd[@]}"

=> tar --exclude=*.db --exclude=*.log --exclude=*.token ...

"${cmd[@]}"
# etc

上面的内容'*'是为了防止有人在您的当前目录中植入名为--exclude=foo.log,之类的文件,--exclude=bar.log以便使您的命令失败;-)

请注意,这与 tar 无关,而是与您的 shell (bash) 及其解析和扩展命令行的方式有关;此外,{db,log,...}其他 shell(如 dash 或 busybox sh)都不支持数组或大括号扩展。

相关内容