Nei sistemi simili a Unix, esistono due percorsi di output che, se non modificati, invieranno output sullo schermo. L'errore standard (o stderr) è quello che cattura la maggior parte degli errori e delle condizioni di errore.
Per passare il messaggio di autorizzazione negata nello stderr allo stesso flusso di output di "output normale" è necessario combinare i due. Nel tuo esempio, affinché tu grep -v
possa operare correttamente su di esso, combini stdout (output standard) e stderr con la sintassi arcana che vedi.
Dal manuale GNU Bash sezione 3.2.2 Pipeline :
Se ' |&
' è utilizzato, command1 ‘s errore standard, oltre al suo standard output, è collegato al command2 ‘s input standard attraverso il tubo; è una scorciatoia per 2>&1 |
. Questo reindirizzamento implicito dell'errore standard sull'output standard viene eseguito dopo qualsiasi reindirizzamento specificato dal comando.
Inoltre, come sottolinea Geirha, se vuoi semplicemente sbarazzarti dell'output stderr, vorresti fare qualcosa di simile
find -name 'myfile.*' 2> /dev/null
o forse
find -name 'myfile.*' 2> /tmp/errorlog
E nota che se hai stringhe di comandi, come find
passare un output a xargs
te, dovresti mettere l'intera pipeline di comandi tra parentesi per catturare l'output da tutti i componenti del comando. Per esempio,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Se hai lasciato fuori le parentesi e hai fatto questo invece -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
vedresti comunque errori di autorizzazione negati da find o egrep, ma stderr verrebbe reindirizzato per xargs.
Come hai visto, probabilmente eliminerai lo stderr solo dopo averne visto il contenuto durante una prova.
Si noti che con GNU find
e, per quanto ne so, qualsiasi opzione compatibile con POSIX find
, l' -print
opzione è implicita. Se lo desideri, puoi comunque fornirlo esplicitamente.