grep -v 予期しない動作

grep -v 予期しない動作

次のように終了してファイルを削除するシンプルで愚かなスクリプトがあるとします。

rm *.uvw *.xyz

rm正確に言えば、スクリプトが指定された終わりのファイルを1つ以上見つけることができない場合は、stderrにメッセージを書き込みます。

スクリプトが少し大きく、より多くのファイル形式でより多くの作業を実行すると仮定すると、どのファイル形式があり、どのファイル形式がないかについてはあまり興味がありませんが、存在しないファイル形式が残りの作業をブロックしていると文句を言います。出力とエラーメッセージに興味があるので、出力をフィルタリングしたいと思います。

rm *.uvw *.xyz 2>&1 | grep -v "No such file or directory"

これは、ほとんどの場合うまく機能しますが、書き込み禁止ファイルを削除する必要があるかどうかを尋ねるなど、対話型ダイアログボックスのメッセージ部分を削除するため、メッセージなしでプロンプトのみが表示されます。

私はこの動作を理解しておらず、それに関する情報を見つけることができません。誰かがこれを説明できますか?

ベストアンサー1

質問

rm が入力を要求する場合、プロンプトの末尾に改行文字を追加しません。

$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'?

grepラインベースです。完全な行のみを処理できます。完了する前にその行を印刷する必要があるかどうかはわかりません。したがって、バッファリング処理のための標準ユーティリティ(例stdbuf:)は役に立ちません。

解決策

nullglobを使用して、欠落しているファイルメッセージを削除します。

nullglob がない場合、予期しないメッセージが表示されます。

$ rm *.uvw *.xyz
rm: cannot remove '*.uvw': No such file or directory
rm: remove write-protected regular empty file 'a.xyz'? n

これを使用すると、「該当するファイルやディレクトリはありません」というメッセージは表示されません。

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'? n

整える

2つのglobに一致するファイルがまったくない場合は、他のエラーメッセージが表示されます。

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: missing operand
Try 'rm --help' for more information.

これを防ぐ簡単な方法は、そのファイルが1つ以上存在することを確認することです。

shopt -s nullglob
[ -e "deleteme.xyz" ] ||touch deleteme.xyz
rm *.uvw *.xyz

deleteme.xyzとにかく消されるから、走る前に触っても悪いことはないrm

おすすめ記事