2

echo $()でbashスクリプト呼び出しをラップすると、非常に奇妙な状況が発生します。これは奇妙なことで、どのコードを提示すればよいかわからないので、一般的な状況について説明します。「run.sh」と呼ぶスクリプトがあり、出力があります。これは通常、空白と改行を使用して、非常に適切にフォーマットされています。

この出力を、以前に一度実行したときに取得した値と比較しようとしています。これを行うために、コードは、これら2つが同じであるかどうかを確認することにより、「新しい」値と古い値を比較します。

expression=$(./runProcess.sh "$process");
expected=$(cat UnitTests/expect-process-$process);
if [ "$expression" == "$expected" ]; then

明らかに、将来のテストと比較するために「古い」の値を取得するには、$(./runProcess.sh)手動で計算する必要があります。これを行うと、空白が大幅に少ないバージョンの出力が得られます。lsしかし、その真ん中に中身が出てくるので、明らかに間違っています。つまり、これら2つのコマンドを実行すると次のタイプの出力が得られます。

./runProcess.sh g,g:

R2With2Gluons =

    + ncol*i_*pi_^2*A*g^2 * (
       - 17/24*d_(mu1,mu2)*d_(m1,m2)*p1.p1
       - 31/8*d_(mu1,mu2)*d_(m1,m2)*p1.p2
       - 17/24*d_(mu1,mu2)*d_(m1,m2)*p2.p2
       + 7/12*d_(m1,m2)*p1(mu1)*p1(mu2)
       + 1/24*d_(m1,m2)*p1(mu1)*p2(mu2)
       + 89/24*d_(m1,m2)*p1(mu2)*p2(mu1)
       + 7/12*d_(m1,m2)*p2(mu1)*p2(mu2)
       );

 0.01 sec out of 0.01 sec


echo $(./runProcess.sh g,g):
R2With3Gluons = + coeff(m1,m2,m3)*ncol*pi_^2*A*g^3 Auto Diagrams UnitTests colourCalc.frm form.set functions.frm output.frm process.frm process.mid qgraf2form.frm qgrafProcessor.py runProcess.sh runProcesses.sh test vertices.frm ( + 35/24*d_(mu1,mu2)*p1(mu3) - 35/24*d_(mu1,mu2)*p2(mu3) - 35/24*d_(mu1,mu3)*p1(mu2) + 35/24*d_(mu1,mu3)*p3(mu2) + 35/24*d_(mu2,mu3)*p2(mu1) - 35/24*d_(mu2,mu3)*p3(mu1) ); 0.40 sec out of 0.40 sec

そしてここにlsがあります:

ls:
Auto              form.set          process.mid       runProcesses.sh
Diagrams          functions.frm     qgraf2form.frm    test
UnitTests         output.frm        qgrafProcessor.py vertices.frm
colourCalc.frm    process.frm       runProcess.sh

必要に応じて正確な例を提供できますが、これが十分に明らかになっていることを願っています。なぜこれが起こっているのでしょうか?OS XMountainLionでbashを使用しています。

4

2 に答える 2

1

正確なスクリプトなしで言うのは難しいですが、最初に、あなたの比較:

old == $(./run.sh);

する必要があります:

if [[ "$old" == "$(./run.sh)" ]]; then
于 2012-11-30T17:21:43.350 に答える
1

より多くの引用符を使用してください!!!

試す:

echo "$(./run.sh)"

代わりは。(はい、引用符で囲みます)。

試す:

old=$(./run.sh)
echo "$old"

正しい出力が得$oldられます(引用符で囲みます)。さて、あなたのテストに関しては、sampson-chenのアドバイスに従って使用してください。

[[ "$old" == "$(./run.sh)" ]]

(変数を割り当てるときに変数やコマンド置換を引用する必要はありませんがold、原則として、毎回引用符を使用できます)。((この投稿に対するGordon Davissonの優れたコメントを参照してください。私は実際に賛成しましたが、グロブと内部の変数の引用についていくつかの注意点があります[[ ... ]]))。

編集。投稿を編集したので、非効率的なを使用しているようですcat。それ以外の:

expected=$(cat UnitTests/expect-process-$process)

使ってください

expected=$(< "UnitTests/expect-process-$process")
于 2012-11-30T17:28:37.903 に答える