在 WSL 下转义 Bash 中 URL 中的与号 (&)

在 WSL 下转义 Bash 中 URL 中的与号 (&)

我正在尝试编写一个 Bash 函数,该函数将从命令行获取一些参数并将它们放入包含 URL 参数(即 contains?&)的 URL 中。

如果URL中只有一个参数,则没有&,也没有问题,即,如果我定义以下函数:

test() {
    cmd.exe /c start https://example.com/\?foo=$1
}

并用 调用它test bar,它会在我的浏览器中打开 URL https://example.com/?foo=bar,这是完全正确的。

问题是当我想添加第二个 URL 参数时。然后我将函数扩展如下:

test() {
    cmd.exe /c start https://example.com/\?foo=$1\&baz=$2
}

但是当我用 调用它时test bar qux,在浏览器中打开与之前相同的 URL ( https://example.com/?foo=bar),并且我的终端显示错误'baz' is not recognized as an internal or external command, operable program or batch file.

将 URL 用双引号括起来也没有帮助:当我将其更改为

test() {
    cmd.exe /c start "https://example.com/\?foo=$1\&baz=$2"
}

它打开了 URL https://example.com//?foo=bar",但我仍然收到错误'baz' is not recognized as an internal or external command, operable program or batch file.

答案1

由于是cmd.exe通过命令调用的,因此cmd.exe转义语法需要使用,而不是 Bash 转义语法,即&需要转义为^&(并且?不需要转义)。以下工作按预期进行:

test() {
    cmd.exe /c start "https://example.com/?foo=$1^&baz=$2"
} 

(请注意,这'baz' is not recognized as an internal or external command, operable program or batch file.是由 生成的错误cmd.exe:它指的是批处理文件,这是 Windows 概念。)

相关内容