Cosa fa "2> & 1" nella riga di comando?


Risposte:


78

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.


2
C'è una ragione per cui una e commerciale appare prima dell'1, ma non prima del 2? Pensavo che & fosse un personaggio riservato per l'esecuzione di un lavoro in background, ma suppongo che sia solo se la e commerciale appare come un carattere lungo alla fine di un comando ...?
Matt Huggins,

8
Poiché 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.
Chealion,

12
Pensala in questo modo: se avessi appena "1" senza e commerciale, la shell creerebbe un file chiamato "1" e reindirizzerà l'output stderr su di esso.
CarlF,

1
Va bene, questo da solo sarebbe valido allora? 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?
Matt Huggins,

1
@Matt Huggins: Sì. Ciò invierebbe invece tutti gli output da 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.
Chealion,

23

tl; dr

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 &

Nozioni di base

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.

risultato arricciatura

reindirizzamento

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.

> / dev / null 2> & 1

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

/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.

> / dev / null

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.

Finalmente

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.

Riferimenti


1
Questa è una delle migliori risposte sull'intero sito Web dal punto di vista del layout, ben fatto!
OmarOthman,

Una cosa che non capisco è perché vorresti inviare tutto /dev/null? Non vuoi i risultati di curlalmeno da qualche parte utili?
skube,

@skube Right. In questo caso non mi è chiaro perché l'utente voglia scartare sia stdout che stderr. OP probabilmente voleva solo capire cosa significasse la sintassi.
Jorge Bucaran,

5

2si riferisce a STDERR. 2>&1invierà STDERR nella stessa posizione di 1(STDOUT).


0

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

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.