我有一个 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"