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>&1
la 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
1
denota salida estándar (stdout). El2
denota error estándar (stderr).Por lo tanto,
2>&1
dice enviar un error estándar a donde siempre se redirige la salida estándar. Lo cual, ya que se está enviando,/dev/null
es 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?stderr
directamente a su/dev/null
lugar. Puede verlo en la práctica al intentarlocurl
,curl 1>/dev/null
ycurl 2>/dev/null
solo 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.com
en segundo plano y descartar tanto elstdout
ystderr
.es lo mismo que
Lo esencial
0
,1
y2
representan 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 stdin
1 stdout
2 stderr
Crear 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.
curl
buscará 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
,ls
obtiene 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.txt
muestran los contenidos del archivo en la pantalla.> / dev / null 2> & 1
La primera parte
> /dev/null
redirige elstdout
, que escurl
la salida de/dev/null
(más sobre esto más adelante) y2>&1
redirige elstderr
alstdout
(que acaba de ser redirigido para/dev/null
que todo se envíe a/dev/null
).El lado izquierdo de
2>&1
le 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 nombrados1
o2
. Entonces,2>1
terminaría creando un nuevo archivo (si aún no existe) llamado1
y volcará elstderr
resultado allí./ dev / null
/dev/null
es un archivo vacío, un mecanismo utilizado para descartar todo lo escrito en él. Entonces,curl http://www.google.com > /dev/null
está efectivamente suprimiendocurl
la salida.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 astderr
, utilizados aquí para mostrar información de progreso y diagnóstico y no solo errores .curl http://www.google.com > /dev/null 2>&1
ignora tantocurl
la salida comocurl
la 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, escribajobs
en su terminal. Tenga en cuenta que esto es diferente de los procesos que se ejecutan en su sistema. Para ver esos tipostop
en la terminal.Referencias
fuente
/dev/null
? ¿No quieres los resultados decurl
al menos algún lugar útil?2
se refiere a STDERR.2>&1
enviará 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.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 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 > logfile
2> & 1fuente