0

私のパッケージがmakeコマンドにあるディレクトリのレイトバインディングをしようとしています。基本的に、WITH_OPTIONS コマンド ラインには、configure スクリプトと同様に、スペースで区切られたリンク オプションのリストが含まれています。問題は、このスクリプトへのコマンド ラインが解析された後、ディレクトリが後でバインドされることです。したがって、適切な変数バインディングを取得するには、テンプレート文字列を評価する必要があります。Bash FAQ、特に記事50をグーグルで読んで読むことができる最も近いものは次のようなものです:

MAKE_INSTALL="make install"
TEMPLATE=('--first=$a' '--second=$b' '--third=$a')

# Parse Parameters
a=/first/path
b=/second/path
TEMPLATE_REPL=$( eval echo ${TEMPLATE[@]} )
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE_REPL\""
$CMD

$CMD に含まれると予想されるのは、1 つのコマンドと 2 つのパラメーターを含む文字列です。

make install WITH_OPTIONS="--first=/first/path --second=/second/path --third=/first/path"

ただし、引用符で囲まれた部分を保持するためにbashを取得できないため、次のように解析し続けます。

make install 'WITH_OPTIONS="--first=/first/path' '--second=/second/path' '--third=/first/path"'

これは明らかに完全に間違っており、実行するとコマンドラインが正しく表示されません。

私は何が欠けていますか?引用符の間のビットを 3 ではなく 1 つのパラメーターとして保持するにはどうすればよいですか?

4

3 に答える 3

1
MAKE_INSTALL="make install"
TEMPLATE='--first=$a --second=$b --third=$a'

# Parse Parameters
a=/first/path
b=/second/path
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE\""
eval $CMD

ennuikiller が指摘したように、Arrays は不要ですが、Johnathan Leffler が私が実行しようとしているコマンドである make を指摘しているため、二重引用符を無視するものであるため、正しいアプローチは $CMD を実行するときに eval を呼び出すことです。これは私のスクリプトに収まるように少し作業が必要ですが、それが問題の基本的な解決策だと思います。ennuikiller にこの解決策を完全に評価することはできませんが、少なくとも評価で +1 を付けていただければ幸いです。

(Ed: 2 番目の eval が必要なため、最初の eval は削除できます。)

于 2013-04-09T21:09:47.207 に答える
0

変数 (変数置換) を使用して、bash スクリプトで遅延バインディングを使用する一般的な例を次に示します。

#!/usr/bin/env bash

A_tmp="echo -n Late binding: \$B !!!"             ## note the slash before $
B="test string"

A=`eval $A_tmp`

echo $A

このスクリプトは以下を出力します。

Late binding: test string !!!
于 2013-04-26T06:57:46.270 に答える