あるスクリプトから別のスクリプトにシェル引数をエスケープします。

あるスクリプトから別のスクリプトにシェル引数をエスケープします。

一方./mysh0:

#!/bin/bash

exec ./mysh1 $*

そして./mysh1

#!/bin/bash

echo $1
echo $2
echo $3

mysh0このようなパラメータをどのように呼び出し、mysh1「A」、「B 2」、および「C」を印刷しますか?

これを./mysh0 A "B 2" C絶対禁物と呼んでください。

答え1

"$@"代わりに、以下を使用する必要があります$*

exec ./mysh1 "$@"

これは、すべての位置パラメータを別々の単語に拡張する正しい方法です。

を使用すると、$*すべての位置パラメータが1つの長い文字列に連結されます。最初の値はIFS区切り文字で、デフォルトのスペースはですA B 2 C

$*今二重引用符なしで使用しているので(安全上の危険を招くおそれそしてスクリプトを窒息させる)、シェルがsplit+globこれを実行します。上記で得た長い文字列はABと 4 つの単語に分けられます。2C

mysh1したがって、実際には3つではなく4つのパラメータを渡します。

関連情報