google zx を使っていて、コマンドをstringで組み立ててshellで実行しようとしたらうまくいかなかった。
Passing commands from string · Issue #224 · google/zx
Quotes | google/zx
stringをそのまま渡してしまうとquoteされてしまい、文字列全体が一つのコマンドとして認識されているらしい。
解決策1 スペースで分割する
スペースで分割した配列としてコマンドを渡すことで実行されるようになる。
依然として残る問題
shell scriptの引数に空白が含まれている場合に、上記では期待通りにならない。
$ cat $'\'Hello' $'world\''
cat: "'Hello": No such file or directory
cat: "world'": No such file or directory
スペースではなくなにか別の文字列で区切って組み立てるなどで無理やり対応できるかもしれないが、あまりきれいではないのでどうしたものか。そこで次の解決策にする
解決策2 配列として渡す
shell scriptのコマンド cat "Hello world"
をそのままコピペはできなくなり、配列に書き直す手間は発生するが、これであれば確実である。
これを応用して、アクセスキーを環境変数にセットしながらコマンドを実行する AWS CLI のラッパーが作れる。