So che il >
segno viene utilizzato per il reindirizzamento dell'output nella riga di comando, ma ho problemi a trovare qualcosa che spieghi l'uso della 2>&1
riga di comando. Per esempio:
curl http://www.google.com > /dev/null 2>&1 &
So che il >
segno viene utilizzato per il reindirizzamento dell'output nella riga di comando, ma ho problemi a trovare qualcosa che spieghi l'uso della 2>&1
riga di comando. Per esempio:
curl http://www.google.com > /dev/null 2>&1 &
Risposte:
L' 1
indica output standard (stdout). La 2
denota errore standard (stderr).
Così 2>&1
dice di inviare un errore standard a qualsiasi reindirizzamento dell'output standard. Che dal momento che viene inviato /dev/null
è simile a ignorare qualsiasi output.
0
(stdin), 1
(stdout) e 2
(stderr) sono in realtà descrittori di file, la shell richiede una e commerciale da mettere davanti a loro per il reindirizzamento. In questo caso duplica il descrittore di file unendo efficacemente i due flussi di informazioni.
curl http://www.google.com 2>/dev/null
Come fa la riga di comando a sapere che qui "2" è inteso come stderr e non è in realtà il secondo parametro che sto passando al comando curl?
stderr
straight a /dev/null
. Lo si può vedere in pratica provando curl
, curl 1>/dev/null
e curl 2>/dev/null
solo per vedere come cambia l'output. Ancora una volta la e commerciale è necessaria solo per il reindirizzamento del descrittore di file.
Recupera http://www.google.com
in background ed elimina sia il simbolo stdout
e stderr
.
curl http://www.google.com > /dev/null 2>&1 &
equivale a
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
E 2
rappresentano i file standard descrittori a POSIX sistemi operativi. Un descrittore di file è un riferimento di sistema a (sostanzialmente) un file o socket .
La creazione di un nuovo descrittore di file in C può assomigliare a questa:
fd = open("data.dat", O_RDONLY)
La maggior parte dei comandi di sistema Unix accetta input e invia i risultati al terminale. curl
recupererà qualsiasi cosa si trovi all'URL specificato ( google dot com ) e visualizzerà il risultato su stdout
.
Come hai detto <
e >
vengono utilizzati per reindirizzare l'output da un comando verso altrove, come un file.
Ad esempio, in ls > myfiles.txt
, ls
ottiene il contenuto della directory corrente e >
reindirizza il suo output su myfiles.txt
(se il file non esiste, viene creato, altrimenti sovrascritto, ma è possibile utilizzare >>
invece di >
aggiungere al file). Se si esegue il comando sopra, non si noterà nulla sul terminale. Questo di solito significa successo nei sistemi Unix. Per verificare ciò cat myfiles.txt
per visualizzare il contenuto del file sullo schermo.
La prima parte > /dev/null
reindirizza l' output stdout
, ovvero curl
l'output a /dev/null
(più avanti su questo in avanti) e 2>&1
reindirizza il stderr
al stdout
(che è stato appena reindirizzato a /dev/null
così tutto verrà inviato a /dev/null
).
Il lato sinistro di 2>&1
ti dice cosa verrà reindirizzato e il lato destro ti dice dove . Il &
viene utilizzato sul lato destro di distinguere stdout (1)
o stderr (2)
da file di nome 1
o 2
. Quindi, 2>1
finirebbe per creare un nuovo file (se non esiste già) chiamato 1
e scaricare il stderr
risultato lì.
/dev/null
è un file vuoto, un meccanismo usato per scartare tutto ciò che vi è scritto. Quindi,
curl http://www.google.com > /dev/null
sta effettivamente sopprimendo curl
l'output.
Ma perché ci sono ancora alcune cose visualizzate sul terminale ?. Questo è non è curl
's output regolare, ma i dati inviati al stderr
, qui usato per la visualizzazione di progresso e le informazioni di diagnostica e non solo gli errori .
curl http://www.google.com > /dev/null 2>&1
ignora sia curl
l'output sia le curl
informazioni sullo stato di avanzamento. Il risultato è che nulla viene visualizzato sul terminale.
Alla &
fine è come si dice alla shell di eseguire il comando come lavoro in background . Questo fa sì che il prompt ritorni immediatamente mentre il comando viene eseguito in modo asincrono dietro le quinte. Per vedere i lavori correnti, digita il jobs
tuo terminale. Nota che questo è diverso dai processi in esecuzione nel tuo sistema. Per vedere quei tipi top
nel terminale.
/dev/null
? Non vuoi i risultati di curl
almeno da qualche parte utili?
Comprendo come segue:
Se vuoi solo leggere sullo schermo le informazioni su Output ed Error del comando, scrivi semplicemente:
curl http://www.google.com
E alcune volte desideri salvare le informazioni di output in un file anziché nella schermata del terminale per una successiva revisione, quindi puoi scrivere:
curl http://www.google.com > logfile
Ma in questo modo, le informazioni di StdErr verranno omesse, poiché >
reindirizza solo StdOut a logfile
.
Quindi, se ti preoccupi delle informazioni di errore del comando una volta che non viene eseguito, allora devi combinare StdOut con StdErr usando 2>&1
(il che significa piegare StdErr in StdOut), quindi la seguente riga di comando può essere scritta:
curl http://www.google.com > logfile
2> & 1