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

Mil*_*eri 8 linux bash shell process-substitution

我有这个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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我一直试图通过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'cocket ignored'>&2)'

Gil*_*il' 19

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

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

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

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


Ste*_*rol 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'
Run Code Online (Sandbox Code Playgroud)