-->

语法错误在shell脚本进程替换(Syntax error in shell script with

2019-06-17 21:06发布

我有我用来备份我的系统这个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)”

Answer 1:

你使用的语法是一个bash扩展的基本shell语法,所以你必须小心使用bash运行脚本。 (KSH也有>(…)进程替换,但重定向后不支持它。岩组就可以了。)

由于错误信息你得到,你正在运行在bash这个脚本,但在其POSIX兼容模式,而不是完全的bash模式。 请注意使用显式调用脚本#!/bin/bash线。 #!/bin/sh不会做,即使/bin/sh是一个符号链接到bash的,因为在庆典POSIX模式,如果它的名义下调用运行sh 。 按名称,如果你使用bash特性始终调用庆典。

另外要注意不要设置环境变量POSIXLY_CORRECT或通过--posix ,如果你想使用bash特性在命令行选项。

另外,不要使用这个特定的bash语法; 使用便携式构建体如所提出的一个史蒂芬Rouberol 。



Answer 2:

怎么样:

 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'


Answer 3:

我发现,在Gentoo此外,如果SH是为/ bin / bash的一个链接,如果你调用脚本“sh‘的脚本名称’”它不运行它作为一个bash脚本和失败:

matchmorethan.sh: line 34: syntax error near unexpected token `<'
matchmorethan.sh: line 34: `done < <( cat $matchfile )'

所以,如果你需要使用进程替换功能,您需要专门在bash运行它。 但我没有找到这个任何引用。



Answer 4:

其实你不必去为这样的重定向性病错误时的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

你可以找到更多在这里忽略选项原文链接



文章来源: Syntax error in shell script with process substitution