GNU/Linux >> Linux Esercitazione >  >> Linux

Grep -v Comportamento imprevisto?

Diciamo che ho un semplice stupido script che rimuove i file terminando, simile a questo:

rm *.uvw *.xyz

Lo script, o rm , per la precisione, scrive messaggi su stderr se non riesce a trovare almeno un file con la desinenza specificata.

Ora diciamo che lo script è un po' più grande e fa un po' di più con un po' più tipi di file e non sono interessato a quali tipi di file esistono e quali no, ma le lamentele sui tipi di file inesistenti ostacolano il resto di l'output e i messaggi di errore mi interessano di più, quindi voglio filtrare l'output:

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

Questo funziona per la maggior parte bene, ma rimuove la parte del messaggio delle finestre di dialogo interattive, che ad esempio chiedono se un file protetto da scrittura deve essere eliminato, quindi mi viene richiesto senza il messaggio corrispondente.

Non capisco questo comportamento e non sono riuscito a trovare alcuna informazione correlata. Qualcuno può spiegarlo?

Risposta accettata:

Il problema

Quando rm richiede l'uso dell'input, non inserisce una nuova riga alla fine del prompt:

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

grep è basato sulla linea. Può elaborare solo righe complete. Non può dire se la riga deve essere stampata finché la riga non è completa. Quindi, utilità standard per gestire il buffering, come stdbuf , non posso aiutarti.

La soluzione

Usa nullglob e rimuovi i messaggi di file mancanti.

Senza nullglob, vengono visualizzati i messaggi che non desideri:

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

Con esso, il messaggio "Nessun file o directory di questo tipo" viene soppresso:

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

Perfezionamento

Se non esiste alcun file che corrisponda a nessuno dei due glob, viene visualizzato un messaggio di errore diverso:

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

Un modo semplice per evitarlo è assicurarsi che esista almeno uno di questi file:

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

Dal momento che deleteme.xyz verrà comunque cancellato, non c'è nulla di male nel toccarlo prima di eseguire rm .


Linux
  1. Grep:Memoria esaurita?

  2. Comportamento imprevisto di uno script di shell?

  3. Verifica che uno script sia in esecuzione?

  4. Taglia / Grep e Df -h?

  5. Grep e coda -f?

Grep Regex:una guida completa

14 Esempi di comandi Grep in Linux

Come escludere in Grep

Espressioni regolari in Grep (Regex)

Come usare grep in Linux

Comando Grep in Linux/UNIX