GNU/Linux >> Linux の 問題 >  >> Linux

GNU Makefile で使用されるシェル コマンドの終了ステータスを取得するには?

メイクファイル内-:

mycommand || (echo "mycommand failed $$?"; exit 1)

makefile アクションの各行は、新しいシェルを呼び出します。エラーは、コマンドが失敗したアクション行でチェックする必要があります。

mycommand が失敗した場合、ロジックは echo ステートメントに分岐してから終了します。


make が欲しいだけなら ツールがゼロ以外のステータスで終了した場合は中止されます make デフォルトですでにそれを行っています。

Makefile :

a: b
    @echo making [email protected]
b:
    @echo making [email protected]
    @false
    @echo already failed

.これが私の make で起こることです :

$ make
making b
make: *** [Makefile:6: b] Error 1

失敗した場合に備えて、部分的または完全に作成されたターゲットが削除されていることを確認してください。たとえば、これ

a: b
    @gena $+ > [email protected]
b:
    @genb > [email protected]

は正しくありません:最初の試行の場合、genb 失敗すると、おそらく間違った b が残ります 、これは 2 回目の試行で make が正しいと仮定します。したがって、次のようなことをする必要があります

a: b
    @gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
    @genb > [email protected]

他のいくつかのアプローチを次に示します。

shell &.SHELLSTATUS

some_recipe:
    @echo $(shell echo 'doing stuff'; exit 123)
    @echo 'command exited with $(.SHELLSTATUS)'
    @exit $(.SHELLSTATUS)

出力:

$ make some_recipe

doing stuff
command exited with 123      
make: *** [Makefile:4: some_recipe] Error 123

shell という警告があります コマンド出力はストリーミングされないため、終了時に stdout にダンプされるだけです。

$?

some_recipe:
    @echo 'doing stuff'; sh -c 'exit 123';\
    EXIT_CODE=$$?;\
    echo "command exited with $$EXIT_CODE";\
    exit $$EXIT_CODE

または、もう少し読みやすく:

.ONESHELL:

some_recipe:
    @echo 'doing stuff'; sh -c 'exit 123'
    @EXIT_CODE=$$?
    @echo "command exited with $$EXIT_CODE"
    @exit $$EXIT_CODE

出力:

$ make some_recipe

doing stuff                  
command exited with 123      
make: *** [Makefile:2: some_recipe] Error 123

これは基本的に、同じシェルで実行されるコマンドの 1 つの文字列です。


Linux
  1. コマンドの出力をシェル変数に割り当てる方法は?

  2. Sshリモートコマンドライン引数はどのように解析されますか?

  3. Linux でシェル エイリアスを使用する方法

  1. シェル コマンドを使用して mysql データベースを削除する方法

  2. コマンドが失敗した場合の終了方法

  3. bashでループの終了ステータスを取得する方法

  1. 期待されるシェルスクリプトで生成されたプロセスの終了コードを取得するには?

  2. adbシェルでsuコマンドを使用するには?

  3. シェル コマンドの出力の最初の行を取得する