evalを使用して$ @を実行するときにargsのスペースを保存する方法

evalを使用して$ @を実行するときにargsのスペースを保存する方法

私は渡されたすべてを実行する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完璧ではありません。

おすすめ記事