1

この呼び出しの結果を取得しようとしています

TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
M=$?

残念ながら、/mydir/が存在しない場合、問題がなかったかのように、 の結果$?は依然として ' 0' です。何も返さない場合0は、 ' ' 以外のものを取得したいと思います。find

どうすればいいですか?

4

3 に答える 3

2

リンクによる :

bash バージョン 3 では、パイプラインの終了コードの動作を変更し、ゼロ以外の終了コードを返す最後のプログラムの終了コードとしてパイプラインの終了コードを報告するオプションが導入されました。テスト プログラムに続くプログラムがゼロ以外の終了コードを報告しない限り、パイプラインはその終了コードがテスト プログラムの終了コードであると報告します。このオプションを有効にするには、次を実行します。

set -o pipefail

それで

TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
M=$?

異なる動作をし、エラーを認識します。StackOverflow Bestに関する以前の投稿も参照してください。

ジャック。

于 2013-07-19T14:43:22.940 に答える
1

bashpipefailオプションを有効にすることができます。ドキュメント (からhelp set):

 pipefail     the return value of a pipeline is the status of
              the last command to exit with a non-zero status,
              or zero if no command exited with a non-zero status

したがって、次のように書くことができます。

set -o pipefail
TMP=$(find /mydir/ -type f -mmin +1440 | xargs --no-run-if-empty rm -f)
M=$?
set +o pipefail

findまた、なぜ内部でコマンドを実行しているの$( ... )ですか? エラーを出力したくない場合は、STDERR を にリダイレクトします。また、またはフラグを/dev/nullに使用して、パイプから入力を受信しない場合にコマンドを実行しないようにすることをお勧めします。-r--no-run-if-emptyxargs

于 2013-07-19T14:23:06.853 に答える
0

ディレクトリが bash に存在するかどうかを確認します。

if [ ! -d "mydir" ]; then
    exit 1 #or whatever you want, control will stop here
fi
TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
...
于 2013-07-19T14:17:32.850 に答える