次のように、終了してファイルを削除する単純な愚かなスクリプトがあるとします。
rm *.uvw *.xyz
スクリプト、またはrm
、正確には、指定された末尾のファイルが少なくとも1つ見つからない場合、stderrにメッセージを書き込みます。
ここで、スクリプトが少し大きく、ファイルタイプが少し多いと、どのファイルタイプが存在し、どのファイルタイプが存在しないかについては興味がありませんが、存在しないファイルタイプについての不満が残りの部分を妨げているとしましょう。私がもっと興味を持っている出力メッセージとエラーメッセージなので、出力をフィルタリングしたいと思います:
rm *.uvw *.xyz 2>&1 | grep -v "No such file or directory"
これはほとんどの部分で正常に機能しますが、インタラクティブダイアログのメッセージ部分が削除されます。たとえば、書き込み保護されたファイルを削除するかどうかを尋ねられるため、メッセージが表示されずにプロンプトが表示されます。
私はこの動作を理解しておらず、関連情報を見つけることができませんでした。誰かがこれを説明できますか?
承認された回答:
問題
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
洗練
どちらのグロブにも一致するファイルがまったくない場合は、別のエラーメッセージが表示されます。
$ 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
を実行する前に触れても害はありません。 。