Bashスクリプト:標準エラーメッセージをカスタムエラーメッセージに変更する

Bashスクリプト:標準エラーメッセージをカスタムエラーメッセージに変更する

私は独自の小さなバックアップスクリプトを書こうとしました。スクリプトを実行すると問題が発生しますが、コマンドはrm関係ありません。私はまだ出力を処理したいのですが(ジョブが失敗したかどうかによって異なるメッセージを表示します)、rm現在は次のようになります。
ls -t | tail -n +$startnumber | xargs -d '\n' rm && echo "Removed old backup(s)." || echo "No more than $keepnumber files; nothing to do."
残念ながら、出力は次のようになります。
rm: missing operand Try 'rm --help' for more information. No more than 14 files; nothing to do.
最初の2行を削除して直接出力したいです。 「より明確な」メッセージ。私は試してみましたが、rm -fこれは常に(そして不正確に)成功した​​出力をトリガします。

答え1

これらのrmメッセージは標準エラー(stderr)で送信されます。標準エラー出力(stderr)を次にリダイレクトできます/dev/null

xargs -d '\n' rm 2>/dev/null

これにより、両方の行が端末に印刷されるのを防ぎ、カスタムメッセージのみが表示されます。

答え2

私は一時ファイルにファイルのリストを保存し、それを試す前にその中にある行数を数えますrm。 (または最初にファイル数を数えてください。)

rmエラーをからにリダイレクトすることもできますが、これは/dev/nullマスクされます。効果的なエラーもあります。

説明する

tmpfile=$(mktemp)
ls -t | tail -n +$startnumber > $tmpfile
if [ -s "$tmpfile" ] ; then
    echo not empty, do something with filelist in $tmpfile
else
    echo empty, do something else
fi
rm "$tmpfile"

もちろん、ls何らかの理由でファイル名に改行文字が含まれていると問題が発生します。 (はい、可能です。この場合、一部のファイルは削除する必要がありますが、削除されなかったことを意味します。)

関連情報