Sé que el >signo se usa para la redirección de salida en la línea de comando, pero tengo problemas para encontrar algo que explique el uso de 2>&1la línea de comando. Por ejemplo:
curl http://www.google.com > /dev/null 2>&1 &
command-line
shell
redirection
Matt Huggins
fuente
fuente

Respuestas:
El
1denota salida estándar (stdout). El2denota 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.fuente
0(stdin),1(stdout) y2(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.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?stderrdirectamente a su/dev/nulllugar. Puede verlo en la práctica al intentarlocurl,curl 1>/dev/nullycurl 2>/dev/nullsolo para ver el cambio de salida. Nuevamente, el ampersand solo es necesario para el descriptor de archivo que se redirige.tl; dr
Buscar
http://www.google.comen segundo plano y descartar tanto elstdoutystderr.es lo mismo que
Lo esencial
0,1y2representan 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 .0 stdin1 stdout2 stderrCrear un nuevo descriptor de archivo en C puede verse así:
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 enstdout.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 amyfiles.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, secat myfiles.txtmuestran los contenidos del archivo en la pantalla.> / dev / null 2> & 1
La primera parte
> /dev/nullredirige elstdout, que escurlla salida de/dev/null(más sobre esto más adelante) y2>&1redirige elstderralstdout(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 distinguirstdout (1)ostderr (2)de los archivos nombrados1o2. Entonces,2>1terminaría creando un nuevo archivo (si aún no existe) llamado1y volcará elstderrresultado 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 suprimiendocurlla salida.Pero, ¿por qué todavía hay algunas cosas que se muestran en la terminal? Esta no
curles la salida regular, sino los datos enviados astderr, utilizados aquí para mostrar información de progreso y diagnóstico y no solo errores .curl http://www.google.com > /dev/null 2>&1ignora tantocurlla salida comocurlla 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, escribajobsen su terminal. Tenga en cuenta que esto es diferente de los procesos que se ejecutan en su sistema. Para ver esos tipostopen la terminal.Referencias
fuente
/dev/null? ¿No quieres los resultados decurlal menos algún lugar útil?2se refiere a STDERR.2>&1enviará STDERR a la misma ubicación que1(STDOUT).fuente
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.comY 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 > logfilePero de esta manera, se omitirá la información de StdErr, ya que
>solo redirigirá el StdOut alogfile.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> & 1fuente