【发布时间】:2012-08-20 16:17:38
【问题描述】:
我有一个用来备份我的系统的 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)
如您所见,我一直在尝试使用 this blog post 过滤掉 tar 中恼人的、无用的“socket被忽略”错误。
执行时我从 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)'
【问题讨论】:
-
我认为
2> >(应该是2>(。 -
在此更改后没有给出语法错误,但也没有过滤掉输出。
-
>(...) 进程替换语法是非标准功能,您的 shell 显然不支持它。使用不同的 shell,或者可能是更新版本的 bash。
-
我的立场是正确的,
2> >(似乎是将 stderr 重定向到子 shell 的方法,并且运行(echo "FOO";echo "FOO" >&2) 2> >(grep -v FOO >&2)使用 GNU bash 4.2.24 输出单个“FOO”。你用的是什么外壳? -
cron将使用sh运行您的脚本,在Debian 系统上是dash,而不是bash。在您的脚本中添加!#/bin/bash可能会有所帮助(但我对cron并不熟悉,并且没有直接使用Debian 的经验)。
标签: linux bash shell process-substitution