WSLの下のBashのURLからアンパサンド(&)をエスケープします。

WSLの下のBashのURLからアンパサンド(&)をエスケープします。

?コマンドラインからいくつかのパラメータを取得し、URLパラメータを含むURL(たとえば、埋め込みや埋め込みなど&)に入力するBash関数を作成しようとしています。

URLにパラメータが1つしかない場合、&問題はありません。つまり、次の関数を定義すると:

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

で呼び出すと、test bar私のブラウザでURLが開きますhttps://example.com/?foo=bar。これは完全に正確です。

問題は、2番目の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.Windowsのcmd.exe概念であるバッチファイルを意味します。)

関連情報