3

インターネットからダウンロードした大きなプロジェクトをコンパイルしようとしていますが、configure、make、make install を実行するカスタム スクリプトがあります。問題は、いくつかの互換性フラグを渡したいのですが、プロジェクトが LDFLAGS を認識しない libtool を使用しているため、互換性フラグを渡す別の方法を見つけなければならないことです。したがって、構成を実行した後のスクリプトには、次のようなコードがあります。

COMPATFLAG="-gcc-name=/usr/local/gcc-4.2.1/bin/gcc"
sed -i "s/CC -shared/CC -shared ${COMPATFLAG}/g" libtool

${COMPATFLAG}コンパイルされているプラ​​ットフォームに応じて異なる値を取得する可能性があるため、sedステートメントに平文で入れることはできません。問題は、それが機能しないことです - の値の代わりに空のスペースを取得します${COMPATFLAG}。代わりに書くsed -i "s/CC -shared/CC -shared TEST/g" libtoolと、文字列「TEST」がファイルに追加されます。一重引用符を使用する${COMPATFLAG}と、変数の値ではなく文字列が取得されます。エクスポートしようとして${COMPATFLAG}も、まだ機能しません。なぜうまくいかないのかわかりません。何か案が?

4

2 に答える 2

6

COMPATFLAGスラッシュがあるため、sed では別の正規表現区切り文字を使用する必要があります。

sed -i "s#CC -shared#& ${COMPATFLAG}#g" libtool

また#、置換パターンで一致した文字列の繰り返しを避けるために、ここで使用しました。

このヒントを提供してくれた @JonathanLeffler のおかげで、制御文字を正規表現の区切り記号として使用することもできます。

sed -i "s^GCC -shared^G& ${COMPATFLAG}^Gg" libtool

シェルの^Gようctrl-V-Gに入力します

于 2013-08-28T17:11:39.407 に答える
3

二重引用符の|代わりにパイプを使用できます。/これは、を含むグローバル変数に対して機能します/

sed -e "s|CC -shared|CC -shared ${COMPATFLAG}|g" libtool
于 2013-08-28T17:13:29.093 に答える