11

特定のbashスクリプトが正常に終了したか中断されたかに関係なく、終了するたびに実行する必要のある一般的なクリーンアップコードがたくさんあります。これを実現するために疑似信号を使用すると思いましtrap "..." EXITた。

一般的なクリーンアップに加えて、スクリプトが正常に完了した場合にのみ実行する必要がある特定のクリーンアップも1つあります。'trap'ブロックに変数をテストさせることで、これをトリガーできると思いました。

#!/bin/bash
done=false;
trap "{        
           #generic cleanup code goes here.
           if $done
           then
               #cleanup to be done only on completion goes here.
               echo Test;
           fi
       }" EXIT
#main script goes here
done=true;

ただし、これは機能しません。次のコードを実行しても、「テスト」がエコーされることはありません。exit後に明示的な呼び出しを追加しても、done=true;何も変更されません。私は何が欠けていますか?

乾杯!

4

1 に答える 1

21

トラップは補間されており、トラップが実行されるときではなく、トラップが定義されるときに$doneの値を使用しています。トラップ定義を一重引用符で囲むか、関数を定義できます。関数の定義はおそらくよりクリーンです:

#!/bin/sh
done=false
cleanup() { if test "$done" = true; then echo Test; fi; }
trap cleanup EXIT
done=true

これが機能するのは、関数が定義されたときではなく、関数が呼び出されるまで関数内の変数の展開が延期されるためです。

于 2012-02-10T16:50:16.367 に答える