¿Qué hace "2> & 1" en la línea de comando?

Respuestas:

78

El 1denota salida estándar (stdout). El 2denota error estándar (stderr).

Por lo tanto, 2>&1dice enviar un error estándar a donde siempre se redirige la salida estándar. Lo cual, ya que se está enviando, /dev/nulles similar a ignorar cualquier salida.

Chealion
fuente
2
¿Hay alguna razón por la que aparezca un signo y antes del 1, pero no antes del 2? Pensé que & era un personaje reservado para ejecutar un trabajo en segundo plano, pero supongo que solo si el signo y aparece como un carácter largo al final de un comando ...?
Matt Huggins, el
8
Debido a que 0(stdin), 1(stdout) y 2(stderr) son en realidad descriptores de archivo, el shell requiere un ampersand y se coloca delante de ellos para la redirección. Duplica el descriptor de archivo en este caso fusionando efectivamente las dos corrientes de información.
Chealion
12
Piénselo de esta manera: si acaba de tener "1" sin ampersand, el shell creará un archivo llamado "1" y redirigirá la salida stderr hacia él.
CarlF
1
Bien, ¿esto solo sería válido entonces? curl http://www.google.com 2>/dev/null¿Cómo sabe la línea de comando que el "2" aquí pretende significar stderr y no es realmente el segundo parámetro que estoy pasando al comando curl?
Matt Huggins
1
@ Matt Huggins: Sí. Eso enviaría toda la salida de stderrdirectamente a su /dev/nulllugar. Puede verlo en la práctica al intentarlo curl, curl 1>/dev/nully curl 2>/dev/nullsolo para ver el cambio de salida. Nuevamente, el ampersand solo es necesario para el descriptor de archivo que se redirige.
Chealion
23

tl; dr

Buscar http://www.google.comen segundo plano y descartar tanto el stdouty stderr.

curl http://www.google.com > /dev/null 2>&1 &

es lo mismo que

curl http://www.google.com > /dev/null 2>/dev/null &

Lo esencial

0, 1y 2representan los descriptores de archivo estándar en los sistemas operativos POSIX . Un descriptor de archivo es una referencia del sistema (básicamente) a un archivo o socket .

Crear un nuevo descriptor de archivo en C puede verse así:

fd = open("data.dat", O_RDONLY)

La mayoría de los comandos del sistema Unix toman algo de entrada y salida del resultado al terminal. curlbuscará lo que esté en la url especificada ( google dot com ) y mostrará el resultado en stdout.

resultado del rizo

Redireccionamiento

Como dijiste <y >se utilizan para redirigir la salida de un comando a otro lugar, como un archivo.

Por ejemplo, in ls > myfiles.txt, lsobtiene el contenido del directorio actual y >redirige su salida a myfiles.txt(si el archivo no existe, se crea, de lo contrario se sobrescribe, pero puede usarlo en >>lugar de >agregarlo al archivo). Si ejecuta el comando anterior, notará que no se muestra nada en el terminal. Eso generalmente significa éxito en los sistemas Unix. Para verificar esto, se cat myfiles.txtmuestran los contenidos del archivo en la pantalla.

> / dev / null 2> & 1

La primera parte > /dev/nullredirige el stdout, que es curlla salida de /dev/null(más sobre esto más adelante) y 2>&1redirige el stderral stdout(que acaba de ser redirigido para /dev/nullque todo se envíe a /dev/null).

El lado izquierdo de 2>&1le dice qué será redirigido, y el lado derecho le dice a dónde . El &se usa en el lado derecho para distinguir stdout (1)o stderr (2)de los archivos nombrados 1o 2. Entonces, 2>1terminaría creando un nuevo archivo (si aún no existe) llamado 1y volcará el stderrresultado allí.

/ dev / null

/dev/nulles un archivo vacío, un mecanismo utilizado para descartar todo lo escrito en él. Entonces, curl http://www.google.com > /dev/nullestá efectivamente suprimiendo curlla salida.

> / dev / null

Pero, ¿por qué todavía hay algunas cosas que se muestran en la terminal? Esta no curl es la salida regular, sino los datos enviados a stderr, utilizados aquí para mostrar información de progreso y diagnóstico y no solo errores .

curl http://www.google.com > /dev/null 2>&1ignora tanto curlla salida como curlla información de progreso. El resultado es que no se muestra nada en el terminal.

Finalmente

Al &final es cómo le dice al shell que ejecute el comando como un trabajo en segundo plano . Esto hace que el mensaje vuelva inmediatamente mientras el comando se ejecuta de forma asíncrona detrás de escena. Para ver los trabajos actuales, escriba jobsen su terminal. Tenga en cuenta que esto es diferente de los procesos que se ejecutan en su sistema. Para ver esos tipos topen la terminal.

Referencias

Jorge Bucaran
fuente
1
Esta es una de las mejores respuestas en todo el sitio web desde una perspectiva de diseño, ¡bien hecho!
OmarOthman
Una cosa que no entiendo es ¿por qué querrías enviar todo /dev/null? ¿No quieres los resultados de curlal menos algún lugar útil?
skube
@skube Derecha. En este caso no me queda claro por qué el usuario quiere descartar tanto stdout como stderr. OP probablemente solo quería entender lo que significaba la sintaxis.
Jorge Bucaran
5

2se refiere a STDERR. 2>&1enviará STDERR a la misma ubicación que 1(STDOUT).

John T
fuente
0

Lo entiendo de la siguiente manera:

Si solo desea leer la información de Salida y Error del comando en la pantalla, simplemente escriba: curl http://www.google.com

Y algunas veces desea guardar la información de Salida en un archivo en lugar de la pantalla del terminal para su posterior revisión, luego puede escribir: curl http://www.google.com > logfile

Pero de esta manera, se omitirá la información de StdErr, ya que >solo redirigirá el StdOut a logfile.

Entonces, si le importa la información de error del comando una vez que no se ejecuta, debe combinar StdOut con StdErr mediante el uso 2>&1(lo que significa doblar StdErr en StdOut), de modo que se pueda escribir la siguiente línea de comando: curl http://www.google.com > logfile2> & 1

YaOzI
fuente