Almacené el siguiente programa en new.c
int main()
{
a;
return 0;
}
Devuelve un mensaje de error. Quiero enviar este mensaje a un archivo. Entonces usé el siguiente comando
gcc new.c > temp.txt
Pero aún estaba obteniendo la salida en la terminal. Estoy usando Ubuntu 13.04. ¿Cómo puedo hacer que funcione?
Respuestas:
Cuando compila un programa con
gcc
, hay diferentes tipos de salida: astdout
ystderr
. Normalmente, el flujo>
directo se dirigirástdout
a un archivo (por ejemplo,printf("hello world\n");
se envía el resultado de astdout
). Sin embargo, elstderr
mensaje continúa siendo enviado a la pantalla, ya que se supone que es "algo excepcional de lo que necesita que se le informe".Hay una manera de redirigir stderr a un archivo: puede hacerlo con el siguiente comando (no muy intuitivo):
donde
&>
es "bash shorthand" para "redirigir todo". Como lo señaló @CharlesDuffy, el formulario compatible con POSIX esEsto significa "compilar 'new.c' y enviar
stdout
amyFile
. Y enviarstderr
(2) al mismo lugar questdout
(&1
=" el mismo lugar que stdout ").Encontrará más detalles sobre diferentes redirecciones en http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html y http://mywiki.wooledge.org/BashFAQ/055
Por cierto, si desea enviar algo desde su programa específicamente a
stderr
, puede hacerlo con lo siguienteSi incluye eso en un programa, ejecute el programa y envíe la salida "normal" a un archivo, esto seguirá apareciendo en la consola. Entonces, si compila lo anterior en el ejecutable
urgent
, escribaen la consola, su salida aparecerá en la pantalla.
fuente
>myFile 2>&1
), así como la extensión bash (&>
).Debido a que
>
solo redirecciona stdout y se escriben los erroresstderr
, debe utilizar uno de los siguientes:...o...
&>
es una extensión BASH que redirige a ambosstdout
ystderr
a un archivo; de lo contrario, el enfoque más sencillo es la primera salida estándar de redirección (>temp.txt
), y luego hacer stderr (FD 2) una copia del identificador de archivo redirigido ya-en stdout (FD 1), así:2>&1
.fuente
Como han dicho los demás, Linux proporciona dos flujos de salida diferentes:
stdout o "salida estándar" es donde va toda la salida regular.
Puede referenciarlo utilizando el descriptor de archivo
1
.stderr , o "error estándar" es una secuencia separada para información fuera de banda.
Puede referenciarlo utilizando el descriptor de archivo
2
.¿Por qué dos flujos de salida diferentes? Considere una tubería de comandos imaginarios:
Ahora imagine que el
decrypt
comando falla y genera un mensaje de error. Si enviara ese mensajestdout
, lo enviaría a la tubería y, a menos que tuviera la palabra "secreto", nunca lo vería. Así que terminarías con un archivo de salida vacío, sin tener idea de lo que salió mal.Sin embargo, dado que la tubería solo captura
stdout
, eldecrypt
comando puede enviar sus errores astderr
donde se mostrarán en la consola.Puede redirigir
stdout
ystderr
, juntos o de forma independiente:Puede redirigir los errores
stdout
y procesarlos como si fueran resultados normales:También puede utilizar una notación "abreviada" para redirigir tanto stdout y stderr al mismo archivo:
Y, finalmente, el
>
operador primero truncará su archivo de salida antes de escribir en él. Si, en cambio, desea agregar datos a un archivo existente, use el>>
operador:fuente
$FOO
) es una fuente común de errores, y demostrarlo en ejemplos no es tan bueno. (2) El uso de nombres de variables en mayúsculas es la razón principal de los conflictos de espacio de nombres entre el entorno y las variables integradas (mayúsculas por convención) y las variables locales (minúsculas por convención). (3) Alentar a las personas a usarlo repetidamente>>
(que vuelve a abrir el archivo cada vez que se usa en un comando) en lugar de abrir un archivo una vez y dejar el descriptor de archivo abierto para que lo usen múltiples comandos da como resultado un código ineficiente.exec 4>secrets; echo "this is a secret" >&4; echo "this is another secret" >&4
exec
por simplicidad, aunque en la práctica generalmente es una mejor estrategia.command₁
>
output_file
;
command₂
>>
the_same_output_file
(
command₁
;
command₂
) >
output_file
{
command₁
;
command₂
; } >
output_file
{
;
}