0

因此,我正在尝试从 awk 脚本中执行 diff ......

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

...其中 bServers[nonServers] 和 primeReference 评估为没有特殊字符的普通字符串。因此“打印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 `('

双产...

sh: (echo: No such file or directory

三重反斜杠产生...

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

...和四个反斜杠(为了笑)只是重复这个循环,不断增加的反斜杠无限。

外壳是 GNU bash 版本 4.1.2(1)-release,awk 是 GNU Awk 3.1.7,操作系统是 CentOS 版本 6.2(最终版)。

我也尝试过单引号的变体,但也无济于事,有人知道我的 shell-escape-foo 缺少哪里吗?

4

1 回答 1

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。

于 2013-09-19T15:04:38.567 回答