私は渡されたすべてを実行するbashスクリプトを書いています。私はこれが次のように動作したいと思います:
$ ./myscript.sh echo hello world
# should run 'echo hello world'
これはこれまで私のスクリプトです。
#!/bin/bash
eval "$@"
上記の例ではうまくいきます。
$ ./myscript.sh echo hello world
# successfully runs `echo hello world`
ただし、渡された引数の中にスペースがある場合、スペースは複数の引数に分割されるため、正しく機能しません。
$ ./myscript.sh sh -c 'echo hello world'
# runs `sh -c 'echo' 'hello' 'world'` instead of `sh -c 'echo hello world'`, so nothing is printed
bashスクリプトから受け取ったすべての引数をスペースを解釈せずに評価に渡すにはどうすればよいですか?
答え1
eval
この場合、どのような利点をもたらすことができますか?これを使用してください:
"$@"
つまり
。eval "$@"
それでも必要だと思われる場合は、次の操作をeval
行います。
eval "${@@Q}"
${var@Q}
Bashがコンテンツを引用および/またはエスケープするようにしてコンテンツを再解析した後(これが実行するアクションeval
)、元の状態に戻ります。${var@Q}
コンテンツを解析する必要がある場合に便利です(例:ssh
避けられないリモートシェルにコンテンツを渡すなど)。追加の解析を避けることができる場合は避けてください。あなたの場合は、使用しないことでこれを行うことができますeval
。
この回答Bashの通知は@Q
完璧ではありません。