我有我用来备份我的系统这个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)
正如你所看到的,我一直在努力过滤掉恼人的,无用的“插座忽略”焦油错误,使用这个博客帖子 。
我从壳得到什么在执行时是:
/ bin中/ sysback:线45:邻近意外的标记语法错误>' /bin/sysback: line 45:
沥青-Pzcpf /备份/备份--directory = / --exclude = PROC --exclude = SYS --exclude = dev的/ PTS --exclude =备份--exclude =无功/日志/ 2>>(grep的-v '插座忽略'>&2)”
你使用的语法是一个bash扩展的基本shell语法,所以你必须小心使用bash运行脚本。 (KSH也有>(…)
进程替换,但重定向后不支持它。岩组就可以了。)
由于错误信息你得到,你正在运行在bash这个脚本,但在其POSIX兼容模式,而不是完全的bash模式。 请注意使用显式调用脚本#!/bin/bash
线。 #!/bin/sh
不会做,即使/bin/sh
是一个符号链接到bash的,因为在庆典POSIX模式,如果它的名义下调用运行sh
。 按名称,如果你使用bash特性始终调用庆典。
另外要注意不要设置环境变量POSIXLY_CORRECT
或通过--posix
,如果你想使用bash特性在命令行选项。
另外,不要使用这个特定的bash语法; 使用便携式构建体如所提出的一个史蒂芬Rouberol 。
怎么样:
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'
我发现,在Gentoo此外,如果SH是为/ bin / bash的一个链接,如果你调用脚本“sh‘的脚本名称’”它不运行它作为一个bash脚本和失败:
matchmorethan.sh: line 34: syntax error near unexpected token `<'
matchmorethan.sh: line 34: `done < <( cat $matchfile )'
所以,如果你需要使用进程替换功能,您需要专门在bash运行它。 但我没有找到这个任何引用。
其实你不必去为这样的重定向性病错误时的GNU tar提供的选项忽略警告“忽略插座”。
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
你可以找到更多在这里忽略选项原文链接