一尘不染

带有进程替换的Shell脚本中的语法错误

linux

我有此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’套接字被忽略’>&2)’


阅读 333

收藏
2020-06-02

共1个答案

一尘不染

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

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

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

2020-06-02