12

我有这个 shell 脚本,我用它来备份我的系统。有一行:

tar -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> >(grep -v 'socket ignored' >&2)

如您所见,我一直在尝试使用此博客文章过滤掉 tar 中烦人的、无用的“套接字忽略”错误。

我在执行时从 shell 得到的是:

/bin/sysback:第 45 行:意外标记>' /bin/sysback: line 45:tar -Pzcpf /backups/backup --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude附近的语法错误=var/log / 2> >(grep -v 'socket被忽略' >&2)'

4

4 回答 4

25

您使用的语法是基本 shell 语法的 bash 扩展,因此您必须小心使用 bash 运行脚本。(Ksh 也有>(…)进程替换,但在重定向后不支持它。Zsh 会很好。)

鉴于您收到的错误消息,您在 bash 中运行此脚本,但在其 POSIX 兼容模式下,而不是在完全 bash 模式下。注意使用显式#!/bin/bash行调用您的脚本。#!/bin/sh不会这样做,即使/bin/sh是 bash 的符号链接,因为如果在 name 下调用 bash,它会以 POSIX 模式运行sh。如果您使用 bash 功能,请始终按名称调用 bash。

如果要使用 bash 功能,请注意不要设置环境变量POSIXLY_CORRECT或在命令行上传递选项。--posix

或者,不要使用这种特定于 bash 的语法;使用便携式构造,例如Stephane Rouberol提出的构造。

于 2012-08-25T13:57:41.147 回答
7

怎么样:

 tar -Pzcpf /backups/backup.tar.gz --directory=/ \
     --exclude=proc --exclude=sys --exclude=dev/pts \
     --exclude=backups --exclude=var/log 2>&1 | grep -v 'socket ignored'
于 2012-08-25T10:39:30.713 回答
2

我发现在 gentoo 上,如果 sh 是 /bin/bash 的链接,如果您使用 'sh "scriptname"' 调用脚本,它不会将其作为 bash 脚本运行并失败:

matchmorethan.sh: line 34: syntax error near unexpected token `<'
matchmorethan.sh: line 34: `done < <( cat $matchfile )'

因此,如果您需要使用 Process Substitution 功能,您需要专门使用 bash 运行它。但我没有找到任何参考。

于 2015-05-13T07:03:10.773 回答
2

实际上,当 GNU tar 提供忽略“套接字忽略”警告的选项时,您不必在 std 错误中进行这种重定向。

tar --warning='no-file-ignored' -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> new.err

您可以在此处找到带有更多忽略选项的原始链接

于 2015-08-27T05:19:04.523 回答