2009-04-14 1 views
17

私はPythonスクリプトをリファクタリングするときに、わざわざ仕事を自動化するためにMakefile(LinuxではGNU makeを使っている)を使います。 スクリプトは出力ファイルを作成します。私は、出力ファイルが私のリファクタリングに直面しても変わらないことを確認したいと思います。makeのシェルステータスコード

しかし、コマンドのステータスコードを取得して、後続のシェルifコマンドに影響を及ぼす方法が見つかりませんでした。

次のルールは、問題を示す:

check-cond-codes: 
    diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$$!= 
    diff -q poalim report2008_4.csv; echo differences: =$$!= 

最初の「差分」は二つの等しいファイルを比較し、2つ目は、2つの異なるファイルを比較します。 出力は次のようになります。

diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$!= 
no differences: == 
diff -q poalim report2008_4.csv; echo differences: =$!= 
Files poalim and report2008_4.csv differ 
differences: == 

だから、明らかに '$$!' 'diff'のステータスコードをキャプチャする間違った変数です。 SHELL:=/bin/bash をMakefileの先頭に使っても問題は解決しませんでした。

実際のルールの 'if'コマンドで、必要な値を返す変数(もしあれば)が使用されます。

すべてのコマンドをMakefileにインラインで書き込む代わりに小さなアドホックシェルスクリプトを作成する代わりに、これは望ましくないことですが、私は最後の手段として使用します。

関連:

答えて

4

使用 '$$?' '$$!'の代わりに(第4回答がExit Shell Script Based on Process Exit Codeのおかげで)

+0

私は '$$'あなたが提供されたリンクには約何かを見つけることができません!。 URLを変更して、4番目の答えの下にある 'share'リンクを使って'プロセス終了コードに基づく出口シェルスクリプトの4番目の答え 'を直接指し示すことができますか?ポジション – SebMa

0

bash変数は$?ですが、どうしてこの状態コードを印刷したいのですか?

-4

「\ $?」を試してください。 $$がmakefileによって解釈されていると思います。

3

それぞれのコマンドが別々のサブシェルで実行されていることを忘れないでください。

あなたはかなり頻繁にのようなものを参照理由です

my_target: 
    do something \ 
    do something else \ 
    do last thing. 

とデバッグを、彼らと意志-pオプションを実行するコマンドを出力しませんが、すべての有用-nオプションを忘れないでくださいさまざまなビットとピースが設定されている場所を含む完全なmake環境を表示します。

HTH

歓声、

+1

これは受け入れられた答えではないのはなぜですか?元のポスター@Omer Zakは2日前に活動しています。コピーペーストの回答は得られませんが、問題を解決するために必要な技術を正確に提示します(複数行のBash)。 –

34

私はあなたが前のコマンドの終了コードを与える$?シェル変数、探していると思います。たとえば:

$ diff foo.txt foo.txt 
$ echo $? 
0 

は、あなたのメイクファイルでこれを使用するには、$$?のように、$をエスケープする必要があります:

all: 
    diff foo.txt foo.txt ; if [ $$? -eq 0 ] ; then echo "no differences" ; fi 

はメイクで自分のルール本体内の各コマンドの中で実行されることに注意してください。別のサブシェル。例えば、以下は動作しません。

all: 
    diff foo.txt foo.txt 
    if [ $$? -eq 0 ] ; then echo "no differences" ; fi 

diffifコマンドが異なるシェルプロセスで実行されるため。コマンドの出力ステータスを使用する場合は、前の例の場合と同じシェルのコンテキストで実行する必要があります。

+0

$$の動機付けは有用です。 – Arun

+1

プレーン 'diff foo.txt foo.txt &&エコー"相違なし "'はよりスリムに見えます:) –

+0

注意: 'echo $$? ; $ $を引き起こす?おそらくエコーが成功したため、エコー後に0になることがあります。これは、私が 'echo $$? 'をテストしたことを確認するために、if文が常に真であることを引き起こしました。 echo $$ ?; 'errorlevel = 1の場合echo 1、then 0 – SketchBookGames

2

あなたはifに結果コードを渡している場合は、単に行うことができます:

all: 
    if diff foo.txt foo.txt ; then echo "no differences" ; fi