bash 脚本中的 Tar 排除参数不起作用

bash 脚本中的 Tar 排除参数不起作用

我有一个 tar 命令行,可以直接在 shell 中正常工作。

tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

一旦我将此命令放入 bash 脚本并执行,它就会忽略排除参数。

我尝试了一些不同的语法,例如:

tar --exclude="out/pictures/\*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

tar --exclude='out/pictures/\*.{jpg,gif,png,jpeg}' -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

tar --exclude out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

tar --exclude= out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

但没有任何作用。排除参数将被简单地忽略。

一个简单的 --exclude 就像--exclude="tmp"预期的那样工作。一旦我开始使用参数,它就会破坏我假设的语法。

我在 ubuntu 18.04.5 上运行 tar (GNU tar) 1.29。

答案1

大括号扩展仅在 bash 中有效,在 sh 中无效。确保你的 shebang 设置为 bash:

#!/usr/bin/env bash

使您的脚本可执行并直接调用它

chmod +x myscript.sh
./myscript.sh

您始终可以通过在命令前面添加 echo 来验证扩展。

echo tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content

答案2

好吧,我今天学到了一些重要的东西。

bash shell 支持大括号扩展。 sh shell(sh 是 shell 吗?)但是不是。

通过像我一样运行脚本sh myscript.sh,该脚本是使用 sh shell 执行的。bash myscript.sh立即生效。

但是 sh 文件中的链接不应该#!/bin/bash强制脚本使用 bash 执行吗?

有人可以解释一下吗?我有点困惑。

作为 ./script.sh 运行它将使内核读取第一行(shebang),然后调用 bash 来解释脚本。以 sh script.sh 运行它,使用系统默认 sh 使用的任何 shell(在 Ubuntu 上,这是 Dash,它与 sh 兼容,但不支持 Bash 的一些额外功能)。

这可以解释一切,但我的 ubuntu 上的默认 shellecho $SHELL是 bash(这句话来自 2010 年,所以我假设当时 ubuntu 上的默认 shell 是 dash)。

我想理解它,即使它适用于bash myscript.sh.

答案3

试一试:

tar --exclude="out/pictures/*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C "/var/www/vhosts/mydomain.com/httpdocs content"

相关内容