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>&1riga 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>&1riga di comando. Per esempio:
curl http://www.google.com > /dev/null 2>&1 &
Risposte:
L' 1indica output standard (stdout). La 2denota errore standard (stderr).
Così 2>&1dice 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/nullCome 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?
stderrstraight a /dev/null. Lo si può vedere in pratica provando curl, curl 1>/dev/nulle curl 2>/dev/nullsolo 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.comin background ed elimina sia il simbolo stdoute stderr.
curl http://www.google.com > /dev/null 2>&1 &
equivale a
curl http://www.google.com > /dev/null 2>/dev/null &
0, 1E 2rappresentano 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. curlrecupererà 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, lsottiene 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.txtper visualizzare il contenuto del file sullo schermo.
La prima parte > /dev/nullreindirizza l' output stdout, ovvero curll'output a /dev/null(più avanti su questo in avanti) e 2>&1reindirizza il stderral stdout(che è stato appena reindirizzato a /dev/nullcosì tutto verrà inviato a /dev/null).
Il lato sinistro di 2>&1ti 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 1o 2. Quindi, 2>1finirebbe per creare un nuovo file (se non esiste già) chiamato 1e scaricare il stderrrisultato lì.
/dev/nullè un file vuoto, un meccanismo usato per scartare tutto ciò che vi è scritto. Quindi,
curl http://www.google.com > /dev/nullsta effettivamente sopprimendo curll'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>&1ignora sia curll'output sia le curlinformazioni 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 jobstuo terminale. Nota che questo è diverso dai processi in esecuzione nel tuo sistema. Per vedere quei tipi topnel terminale.
/dev/null? Non vuoi i risultati di curlalmeno 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 > logfile2> & 1