cmd/bash/awk 转义字符要求的奇怪差异

Strange difference in cmd/bash/awk escape character requirement

我需要在几个 Windows 系统上 运行 一个看起来很奇怪的命令行,我希望能够在 Windows 7 和 Git for Windows (GfW) 或 Windows 10 with Ubuntu 18.04 运行ning on Windows Subsystem for Linux (WSL)。

命令行当然不是这里显示的命令行,但原理是一样的。我需要从 Windows 命令行使用 awk,我需要从 bash 中调用 awk 以便能够在 WSL 和 GfW 上重复使用相同的命令行,我需要进行整个调用来自同一个命令提示符会话。

On Windows 10 with Ubuntu 18.04 运行ning on Windows Linux 子系统:

cmd /c "echo Something strange is going on |bash -c "awk '{ print  }'""
Something strange is going on

现在,awk 遗漏了 $1 变量。我需要转义美元符号:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print $1 }'""
Something

看起来更好,只输出了第一个字!

现在,Windows 7 和 Windows 的 Git 相同:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print $1 }'""
awk: cmd. line:1: { print $1 }
awk: cmd. line:1:         ^ backslash not last character on line
awk: cmd. line:1: { print $1 }
awk: cmd. line:1:         ^ syntax error

等等,什么?!我不能再使用反斜杠来转义美元符号了!那是怎么回事?我需要删除它:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print  }'""
Something

我在这里做错了什么?为什么我需要根据它是在 Win7/GfW 还是 Win10/WSL 上执行来以不同方式转义完全相同的命令行?我也尝试过使用 ^ 转义命令行,但据我所知,美元符号不需要特别注意与 cmd.exe?

一起使用

我认为应该特别注意 bash 之前的管道符号。尝试用插入符号 ^|.

转义它

嵌套的双引号和单引号也可能存在问题。我不知道他们在解析时是否会干扰。也许尝试用反引号替换外面的。

我还没有真正找到对正在发生的事情的有效解释,但一个简单的解决方法是使用脚本文件而不是使用命令行调用 Awk,如下所示:

cmd /c "echo Something strange is going on |bash -c "awk -f script.awk""

脚本文件只包含以前的脚本(实际上更高级):

{ print  }

至少该命令行在Windows 7 with Git for Windows 和 Windows 10 with Ubuntu 18.04 运行 在 Windows 的 Linux 子系统上,我也不必担心转义...