Bashスクリプトで実行すると、コマンドライン引数がスペースに分割されるのを防ぎます。

Bashスクリプトで実行すると、コマンドライン引数がスペースに分割されるのを防ぎます。

次のようにbash変数でコマンドを実行しようとしています。

cmd="python -m mymodule 'argument 123 456' argument2=32 argument3=234"
$cmd

一重引用符で囲まれているにもかかわらず、最初の文字列でコマンドライン引数を分割するようです。

['argument', '123', '456', 'argument2=32', 'argument3=234']

このようなことが起こらないように私ができることはありますか?エスケープされた二重引用符\"、バックティックを試してみましたが、`何も機能しません。それでも、最初のコマンドライン引数はスペースに分割されます。

ベストアンサー1

あなたの場合、コマンドと引数を配列に保存することをお勧めします。

cmd=( "python" "-m" "mymodule" "argument 123 456" "argument2=32" "argument3=324" )

次のように実行します。

"${cmd[@]}"
  • 重要なのは、${cmd[@]}anを使用しているかのように配列の内容を引用符で囲んで@二重引用符で囲むことです。これにより、シェルは各要素が二重引用符で囲まれているかのように配列要素のリストに展開し、単語の分割を防ぎます(Forを参照)。はいこれに関連する質問と回答より多くの情報を知りたい場合)。

  • また、シェルが個別に独自の配列要素として処理する各トークンを追加する必要があります(たとえば、別々の要素でなければなりません"-m"。解釈することができます)- もっと"mymodule""-m mymodule"m mymodulem mymoduleこのQ&Aより多くの洞察を得るために)。

おすすめ記事