我正在将嵌入式平台上的 bash 从 4.1.9 更新到最新版本 (4.4.12),并且我看到在将转义参数传递到脚本的这个简单场景中的行为发生了变化。
脚本/tmp/printarg:
#! /bin/sh
echo "ARG |$*|"
Run Code Online (Sandbox Code Playgroud)
我像这样调用脚本:
bash -c "/tmp/printarg \\"abc\\""
Run Code Online (Sandbox Code Playgroud)
我已经在运行 bash 4.3.42 的几个平台(原生 x86_64 Linux)以及运行 bash 4.1.9 和 4.2.37 的几个嵌入式平台(ARM 和 PPC)上尝试了这个,所有这些平台都报告了我的期望:
38$ bash -c "/tmp/printarg \\"abc\\""
ARG |abc|
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 bash 4.4.12(原生 X86 或嵌入式平台)运行它时,我得到了这个:
$ bash -c "/tmp/printarg \\"abc\\""
ARG |abc\| <<< trailing backslash
Run Code Online (Sandbox Code Playgroud)
如果我在命令行中的第二个转义引号和结束引号之间添加一个空格,那么我将不再看到额外的反斜杠:
$ bash -c "/tmp/printarg \\"abc\\" "
ARG |abc | <<< trailing space, but backslash is gone
Run Code Online (Sandbox Code Playgroud)
这感觉像是一种回归。有什么想法吗?我也尝试通过更改启用各种兼容选项(compat40、compat41、compat42、compat43)。