Perché grep usando pipe non funziona qui?


18

Ho il seguente comando:

find / -name libGL.so.1

Che restituisce molte righe con "Autorizzazione negata". Voglio escludere tali righe, quindi ho aggiunto quanto segue:

find / -name libGL.so.1 | grep -v 'denied'

Ma l'output è lo stesso - my grep -v 'denied'non sta filtrando le righe con Permission denied. Ho provato molte varianti, ho guardato i tutorial di grep, ma non riesco a capire il problema. Eventuali suggerimenti?

Risposte:


43

Non ha nulla a che fare con grep- è perché la pipe |reindirizza il flusso di output standard stdoutmentre i Permission deniedmessaggi si trovano nel flusso di errori standard stderr. È possibile ottenere il risultato desiderato combinando i flussi utilizzando 2>&1(reindirizzare lo stream il cui descrittore di file è 2allo stream il cui descrittore di file è 1) in modo che stderroltre a essere reindirizzato stdoutall'input del comando grep

find / -name libGL.so.1 2>&1 | grep -v 'denied'

ma sarebbe più normale semplicemente scartare del stderrtutto reindirizzandolo a/dev/null

find / -name libGL.so.1 2>/dev/null

Utilizzo di | & anziché 2> & 1 |

Se dai un'occhiata alla pagina man di Bash noterai probabilmente questo errore:

Se |&viene utilizzato, l'errore standard di comando è collegato all'ingresso standard di command2 attraverso la pipe; è una scorciatoia per 2>&1 |.

Quindi puoi usare questo costrutto anche se vuoi unirti a STDERR e STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'

3
Nota aggiuntiva sulla loro combinazione: se per qualche bizzarra ragione esiste il file /foo/bar/denied/libGL.so.1, la combinazione stdoute stderr quindi il filtraggio nasconderebbe il risultato
Izkata,

5

Il tuo comando dovrebbe essere:

find / -name libGL.so.1 2>/dev/null

Find si lamenta delle autorizzazioni per l'errore standard (fd2). Per eliminare quelle righe, reindirizzare (>) lo standard verso il bucket bit (/ dev / null).


4

Le righe "permesso negato" stanno andando al flusso stderr (errore standard), ma si sta eseguendo il piping di stdout (uscita standard) tramite grep.

Puoi reindirizzare via completamente stderr con

find / -name libGL.so.1 2> /dev/null

2

Hai provato a chiamare il comando con sudo ?

sudo find / -name libGL.so.1

Se mostra ancora il messaggio, usa il già citato reindirizzamento di stderr (fd = 2) a nirvana (/ dev / null) :

sudo find / -name libGL.so.1 2> /dev/null

Altre idee qui , buona fortuna!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.