awk coprocess包含括号的转义序列

时间:2013-09-19 14:39:09

标签: linux bash shell awk escaping

我正试图在awk脚本中执行diff ...因此...

cmd="diff <(echo \""bServers[nonServers]"\") <(echo \""primeReference"\")"
print cmd
while (( cmd | getline result) > 0 ) {print result}
close(cmd)}

...其中bServers [nonServers]和primeReference评估为没有特殊字符的vanilla字符串。因此,“print cmd”产生......

diff <(echo "
> /var/tmp/text1.txt 818e9c0fc3dd92e86c80704419b1cc0d") <(echo "
> /var/tmp/text2.txt 00efcc10b376dbdd6d0972635eb650c4")
2c2
< /var/tmp/text1.txt 818e9c0fc3dd92e86c80704419b1cc0d
---
> /var/tmp/text2.txt 00efcc10b376dbdd6d0972635eb650c4

...剪切并粘贴到命令行时效果很好。但是当作为Awk命令的一部分运行时返回...

/var/tmp/text2.txt 818e9c0fc3dd92e86c80704419b1cc0d")
sh: -c: line 0: syntax error near unexpected token `('
'h: -c: line 0: `diff <(echo "

打开括号之前的单个转义反斜杠会产生......

awk: warning: escape sequence `\(' treated as plain `('

Double产生......

sh: (echo: No such file or directory

三个反斜杠产生......

awk: warning: escape sequence `\(' treated as plain `('
...
sh: (echo: No such file or directory

...和四个反斜杠(笑声)只是不断增加反斜率的循环重复循环。

shell是GNU bash版本4.1.2(1) - 发布,awk是GNU Awk 3.1.7,OS是CentOS 6.2版(最终版)。

我尝试使用单引号的变体也没有用,有没有人知道我的shell-escape-foo缺乏的地方?

1 个答案:

答案 0 :(得分:2)

sh是awk中的默认shell而不是bash所以如果可能的话,你最好只使用bash作为一个整体。如果以sh运行,Bash也会以POSIX模式运行,并且无法识别进程替换(<(..))。但是,如果sh实际上是bash的链接,则可以尝试禁用POSIX模式。

cmd="shopt +o posix\ndiff <(echo \""bServers[nonServers]"\") <(echo \""primeReference"\")"

或明确调用bash:

cmd="bash -c \"exec diff <(echo '"bServers[nonServers]"') <(echo '"primeReference"')\""

bServers[nonServers]primeReference仍可能会影响语法。这就是为什么在需要读取外部命令输出时大多数时候使用bash作为一个整体的原因。