我正试图在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缺乏的地方?
答案 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作为一个整体的原因。