我有此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)’
>' /bin/sysback: line 45:
您使用的语法是基本Shell语法的bash扩展,因此您必须小心使用bash运行脚本。(Ksh也具有>(…)进程替换,但在重定向后不支持它。Zsh可以。)
>(…)
给定您收到的错误消息,您正在bash中运行此脚本,但是以其POSIX兼容模式运行,而不是以完全bash模式运行。注意用显式#!/bin/bash行调用脚本。#!/bin/sh即使/bin/sh是bash的符号链接也不会这样做,因为bash如果以name调用,则以POSIX模式运行sh。如果使用bash功能,请始终按名称调用bash。
#!/bin/bash
#!/bin/sh
/bin/sh
sh
如果要使用bash功能,也请注意不要设置环境变量POSIXLY_CORRECT或--posix在命令行上传递选项。
POSIXLY_CORRECT
--posix