スクリプトnerf
はスクリプトherd
を呼び出し、スクリプトはスクリプトを呼び出しますer
。 に渡す必要のある引数を明示的に受け取るnerf
on フラグを使用します。herd
er
これは以前は問題ではありませんでした。 がコマンド ラインから呼び出されたばかりのnerf
ときherd
は、 -p フラグの引数を単一引用符で囲むことができ、 's によって解釈されることはありませんでしherd
たgetopts
が、代わりにer
'sによって解釈されましたgetopts
。
しかし、最終的に に移動する必要があるフラグで値を生成したer
ので、 で変数を展開する必要があります$file_contents
が、に到達するまではnerf
によって解釈されないようにします。getopts
er
これら 3 つのスクリプトはいずれも変更できます。
$ cat nerf
#!/bin/bash
file_contents="`cat one_liner_file`"
er_args="-jkl -m $file_contents"
./herd -p "$er_args" # <-- the problem
$ cat herd
#!/bin/bash
passthru_args=""
while getopts "p:a:b:cde" opt
do
case $opt in
p) passthru_args="$OPTARGS" ;;
...
esac
done
./er "$passthru_args"
$ cat er
#!/bin/bash
while getopts "jklm:" opt
do
case $opt in
...
esac
done
上記のマークされた行で単一引用符を使用すると、リテラル文字列 "$er_args" が渡されます。二重引用符を使用すると、フラグは によって直接解釈されherd
ます。二重引用符の中に一重引用符を使用すると、フラグは getopts によって解釈されません。
ここにはエレガントな解決策はないと思いますが、間違っている場合はお知らせください。私が考えることができる唯一の解決策はくだらないです:
- を通じてすべて
er
のフラグを明示的に公開しherd
ます。 er
からコールを削除し、herd
直接 に配置しnerf
ます。- ???