gpt4 book ai didi

linux - 包含括号的 awk 协进程的转义序列

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:34 24 4
gpt4 key购买 nike

我正在尝试从 awk 脚本中执行差异...

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

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

双产...

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)-release,awk 是 GNU Awk 3.1.7,操作系统是 CentOS release 6.2 (Final)。

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

最佳答案

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

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 作为一个整体的原因。

关于linux - 包含括号的 awk 协进程的转义序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18897701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com