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 子系统上,我也不必担心转义...
我需要在几个 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 子系统上,我也不必担心转义...