作成:コマンドが失敗した後に続行する方法?


143

コマンド$ make allrm: cannot remove '.lambda': No such file or directory停止するなどのエラーが表示されます。rm-not-found-errorsを無視してほしい。どうすれば強制メイクできますか?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex

回答:


264

-iフラグを試す(または--ignore-errors)。ドキュメントはこれを実現するためのより堅牢な方法を示唆しているようです:

コマンドラインのエラーを無視するに-は、行のテキストの最初(最初のタブの後)にa を記述します。-コマンドを実行するためにシェルに渡される前に破棄されます。

例えば、

clean:
  -rm -f *.o

これによりrm、ファイルを削除できない場合でも続行されます。

すべての例はを使用rmしていますが、エラーを無視する必要がある他のコマンド(つまりmkdir)にも適用できます。


30
いけないことを!エラーを無視しないでください。rmに-fフラグを追加するだけで、存在しないファイルを削除しようとしても失敗しなくなります。ただし、実際にファイルの削除に失敗した場合は、エラーが返されます。それはあなたが望む振る舞いです、問題があるとき失敗してください!
Kristof Provost 2012年

15
@Kristof Provost同意。rm -fユーザーが抱えている特定の問題にはより適切ですが、安全ではない場合でも、一般的な解決策について知っておくと便利です。
brian_o

1
それは本当に便利です、エリ。ありがとうございました。
Beco博士

1
Makeには$(RM)、の代わりに使用できるも用意されていますrm -f
reitermarkus

32

make -k(または--keep-goinggnumakeで)あなたが求めていることをするでしょう、私は思います。

-fエラーが発生しているdelまたはrm行を見つけて、それにエラーを追加して他のユーザーにエラーが発生しないようにする必要があります。


1
私は何も言いたくなかったのですが、彼らの考えもどうなのかと思っていました。何らかの理由でそのフラグが適切でない理由がわからない場合は、提示することをお勧めします。
TED

3
エラーを無視しないでください。Brian、Oded、NebuSoftによって提案されたソリューションは正しいです。これと受け入れられた答えは間違っています。
Kristof Provost 2012年

1
@KristofProvost-ああ。かなり公平だと思います。一般的に私はまた、問題の根源となった答えは、尋ねられた質問に直接答える答え(このようなもの)よりも優れていると信じています。そのために誰かに反対票を投じるかどうかはわかりませんが、異なるストローク...
TED

5
素敵な答え。他の回答には含まれていない簡単なトップレベルのフラグが含まれていますが、正しい動作が推奨されています。エラーは無視すべきではありませんが、オプションを知っておくとよいでしょう。
brian_o

1
コンパイラーのエラーを無視するのが便利です。これによりmake、コンパイラーが抑制した問題を修正しながら、可能な限り多くのコンパイルユニットを構築できます。そうすれば、壊れたものをすべて修正したときに、他のすべてがビルドされるのを待つ必要がなくなります。
inetknght 2016

20

クリーンに変更

rm -f .lambda .lambda_t .activity .activity_t_lambda

つまり、削除のプロンプトを表示しません。ファイルが存在しない場合でも文句を言わないでください。


16

コマンドを使用しrmてパイプの後ろでの戻りコードをブロックすることにより正常にtrue戻ります。このコマンドは常に0(成功)を返します

rm file | true

11

makeが実際に1行のエラーを無視するようにするには、単にでサフィックスを付け; true、戻り値を0に設定します。次に例を示します。

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

これにより、stderrの出力がnullにリダイレクトされ、コマンドの後にtrueが続きます(これにより、常に0が返され、makeは実際に何が起こったかに関係なくコマンドが成功したと信じ込ませます)。プログラムフローを続行できます。


1
これは、先頭のダッシュが機能しない場合に機能します(失敗する必要があるテストを実行するためのメイクファイルが提供され、後でログを解析します)
Sean Houlihane

2

あなたの変更cleanそうにrm文句はありません。

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda

1

コマンドに-fオプションを入れますrm

rm -f .lambda .lambda_t .activity .activity_t_lambda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.