1

%configure説明は非常に抽象的です。実際には、RPM .spec ファイルでマクロにパラメーターを渡そうとしています。しかし、振る舞いはまったく同じです。

を使用してそのようなスクリプトsh -x

#! /bin/sh

VAR1=" \
--enable-modules=dir so com \
--disable-userdir"

./configure $VAR1

私に与えます:

+./configure --enable-modules=dir so com --disable-userdir

私が必要とするのは:

+./configure --enable-modules='dir so com' --disable-userdir

質問: 引用符とスペースを正しく渡す方法はありますか? 引用符を配置すると、すべての文字列'dir so com'$VAR1台無しになります。$"" は何もしません。qoutes はスペースなしで最も近い文字グループを引用します。ほぼすべてを試しました。

編集:

何かを推奨する前に試してください。それが簡単だったなら、それは問題ではありません。そして、私はエコーを意味していませんでした.paramsをマクロ/外部スクリプトに渡す必要があります。Sed/cat ケミストリーは許容されますが./configure、「逆引用符」を介して直接呼び出すことはできません。またはrpmbuild、何らかの追加パラメーターを使用してそれ自体を呼び出すこともできません。qoutes なしで params を渡すとうまくいきます。

VAR1=" \
--enable-modules=dir so com \
--disable-userdir"

する:

$ sh -x test.sh
+ VAR1=' --enable-modules="dir so com" --disable-dir --disable-actions --disable-userdir'
+ ./configure '--enable-modules="dir' so 'com"' --disable-dir --disable-actions --disable-userdir`
4

3 に答える 3

2

このように、「引用符内の引用符」をエスケープすることができます

#!/bin/sh

VAR1=" \
--enable-modules=\"dir so com\" \
--disable-userdir"

echo $VAR1
于 2012-07-03T15:47:46.467 に答える
2

いいえ、恐れ入ります。./configure $VAR1変数は$VAR1IFS 文字で分割され、0 個以上の単語になります。つまり、IFS 文字で厳密に分割されます。引用符/エスケープの認識は、変数の展開の前に行われます。つまり、変数の値の一部としての引用符またはエスケープは効果がありません (それら自体を表します)。手遅れだ、逃げろ!

代わりにできることは次のようなものです

set -- "--enable-modules=dir so com" --disable-userdir
./configure "$@"

$1これは、と$2が の後の 2 つの引数であるような位置パラメータを上書きし、 which--を使用"$@"して正確にこれら 2 つの単語に展開します。

bashset 配列を誤用する代わりに配列を使用することもできます (sh私の知る限り、グローバル配列は 1 つしかありません)。

次のようなこともできます

VAR1="--enable-modules=dir so com%--disable-userdir"
OLDIFS=$IFS
IFS=%
./configure $VAR1
IFS=$OLDIFS

しかし、ええ。

于 2012-07-03T17:15:11.390 に答える
0

次の戦略のいずれかを選択します。

位置引数を置き換える

位置パラメーターを置き換えるサブシェルを開始し、特別な展開"$@"を使用してプログラムを開始します。

(set -- "--enable-modules=dir so com" --disable-userdir; ./configure "$@")

IFS の特別な値を使用する

あなたの議論がないキャラクターを選んでください|。次に、各引数を分割する引数ベクトルを準備し、|それに応じてスクリプトを開始します。

 configure_argv="--enable-modules=dir so com|--disable-userdir"
 IFS='|' ./configure $configure_argv

xargs を使用する

xargscharacter で引数を分割できることを思い出してください\000。これは与える

 configure_argv()
 {
     printf '--enable-modules=dir so com\000'
     printf '--disable-userdir\000'
 }
 configure_argv | xargs -0 ./configure
于 2014-09-13T07:41:37.917 に答える