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 &
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 &
Respuestas:
El 1
denota salida estándar (stdout). El 2
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.
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.
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 intentarlo curl
, curl 1>/dev/null
y curl 2>/dev/null
solo para ver el cambio de salida. Nuevamente, el ampersand solo es necesario para el descriptor de archivo que se redirige.
Buscar http://www.google.com
en segundo plano y descartar tanto el stdout
y stderr
.
curl http://www.google.com > /dev/null 2>&1 &
es lo mismo que
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
y 2
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 .
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. curl
buscará lo que esté en la url especificada ( google dot com ) y mostrará el resultado en stdout
.
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 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.txt
muestran los contenidos del archivo en la pantalla.
La primera parte > /dev/null
redirige el stdout
, que es curl
la salida de /dev/null
(más sobre esto más adelante) y 2>&1
redirige el stderr
al stdout
(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 distinguir stdout (1)
o stderr (2)
de los archivos nombrados 1
o 2
. Entonces, 2>1
terminaría creando un nuevo archivo (si aún no existe) llamado 1
y volcará el stderr
resultado allí.
/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 suprimiendo curl
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 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>&1
ignora tanto curl
la salida como curl
la información de progreso. El resultado es que no se muestra nada en el terminal.
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 jobs
en su terminal. Tenga en cuenta que esto es diferente de los procesos que se ejecutan en su sistema. Para ver esos tipos top
en la terminal.
/dev/null
? ¿No quieres los resultados de curl
al menos algún lugar útil?
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 > logfile
2> & 1