¿Cómo redirigir stderr y stdout a diferentes archivos en la misma línea en el script?

180

Se mucho esto:

$ command 2>> error

$ command 1>> output

¿Hay alguna manera de que pueda enviar el stderr al archivo de error y el stdout de salida al archivo de salida en la misma línea de bash?

usuario784637
fuente

Respuestas:

292

Solo agrégalos en una línea command 2>> error 1>> output

Sin embargo, tenga en cuenta que >>es para agregar si el archivo ya tiene datos. Mientras que, >sobrescribirá cualquier dato existente en el archivo.

Entonces, command 2> error 1> output si no quieres agregar.

Solo por completar, puede escribir 1>como solo >porque el descriptor de archivo predeterminado es la salida. así 1>y >es lo mismo.

Entonces, se command 2> error 1> outputconvierte,command 2> error > output

Sujoy
fuente
3
¡Gran respuesta! Realmente me gusta su explicación de cómo 1>se puede escribir como>
user784637
¿Cómo es esto diferente de command &2>err.log, creo que estoy sintaxis totalmente confusa? (Puede estar en orden un enlace a una respuesta apropiada de todos los ismos de tubería bash)
ThorSummoner
44
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html es lo que creo que estás buscando. Fwiw, parece que command &2>err.logno es del todo legítimo: el ampersand en esa sintaxis se usa para el descriptor de archivo como objetivo, por ejemplo command 1>&2, redirigiría stdout a stderr.
DreadPirateShawn
@DreadPirateShawn, por favor no vincule el ABS como referencia: ocasionalmente contiene inexactitudes directas y muy frecuentemente contiene ejemplos de malas prácticas. wiki.bash-hackers.org/howto/redirection_tutorial es una fuente de referencia mucho mejor sobre la redirección.
Charles Duffy
27

Prueba esto:

your_command 2>stderr.log 1>stdout.log

Más información

Los números a 0través 9son descriptores de archivo en bash. 0significa entrada estándar, 1representa salida estándar, 2representa error estándar. 3a través 9son de repuesto para cualquier otro uso temporal.

Cualquier descriptor de archivo puede ser redirigido a un archivo u otro descriptor de archivo utilizando el operador >. En su lugar, puede usar el operador>> para agregar a un archivo en lugar de crear uno vacío.

Uso:

file_descriptor > filename

file_descriptor > &file_descriptor

Por favor refiérase a Bash-Scripting Guía avanzada: Capítulo 20. E / S redirección .

Quintus.Zhou
fuente
Gracias. Estoy buscando esto durante una hora
dılo sürücü
12

Como eso:

$ command >>output 2>>error
Didier Trosset
fuente
9

O si desea mezclar salidas (stdout y stderr) en un solo archivo, puede usar:

command > merged-output.txt 2>&1
ztank1013
fuente
32
Esta no es una respuesta a la pregunta.
Matthias
¿Por qué las personas fusionan productos o sugieren fusionar productos?
nurettin
@nurettin: tal vez tenga una línea de script que simplemente ejecute un comando y guarde instantáneamente la salida en un archivo de registro. El comando en cuestión puede fallar a veces, por lo que también desea guardar cualquier error al respecto, pero en el mismo archivo de registro.
streamofstars
@streamofstars sí, por supuesto, tienes razón, tal vez a veces eso es lo que la gente quiere, estaba comentando en el contexto de esta pregunta como alguien que buscaba respuestas y encontró muchas preguntas irrelevantes en todo stackoverflow.
nurettin
0

La salida de múltiples comandos se puede redirigir. Esto funciona para la línea de comandos o más útil en un script bash. El -sdirige la contraseña de inmediato a la pantalla.

Los cmds de stdout / stderr de Hereblock se envían a archivos separados y nada que mostrar.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Los cmds stdout / stderr de Hereblock se envían a un solo archivo y se muestran.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Los cmds stdout / stderr de Hereblock se envían a archivos separados y stdout para mostrar.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Dependiendo de quién es usted (whoami) y nombre de usuario, se puede requerir o no una contraseña.

rahogaboom
fuente