Cómo redirigir stderr a un archivo [duplicado]

157

Al usar nohup para poner un comando para ejecutar en segundo plano, parte del contenido aparece en el terminal.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Quiero guardar ese contenido en un archivo.

    
pregunta André M. Faria 18.05.2015 - 14:31

2 respuestas

258

Hay dos flujos de salida principales en Linux (y otros sistemas operativos), salida estándar (stdout) y error estándar (stderr). Los mensajes de error, como los que muestra, se imprimen en un error estándar. El operador de redirección clásico ( command > file ) solo redirige la salida estándar, por lo que aún se muestra un error estándar en el terminal. Para redirigir también a stderr, tiene algunas opciones:

  1. Redirige stdout a un archivo y stderr a otro archivo:

    command > out 2>error
    
  2. Redirige stderr a stdout ( &1 ) y luego redirige stdout a un archivo:

    command >out 2>&1
    
  3. Redirige ambos a un archivo:

    command &> out
    

Para obtener más información sobre los diversos operadores de control y redirección, consulte aquí .

    
respondido por el terdon 18.05.2015 - 14:50
4

Lo primero que hay que tener en cuenta es que hay dos formas dependiendo de su propósito y del shell, por lo tanto, esto requiere una ligera comprensión de múltiples aspectos. Lo más típico es a través de 2> en conchas de Bourne , como dash (que está vinculado simbólicamente a /bin/sh ) y bash ; primero es el shell predeterminado y compatible con POSIX y el otro es lo que la mayoría de los usuarios usan para la sesión interactiva. Se diferencian en la sintaxis y las funciones, pero afortunadamente para nosotros la redirección de errores funciona igual (excepto el &> no estándar). En el caso de csh y sus derivados, la redirección de stderr no funciona del todo allí.

Regresemos a 2> parte. Dos cosas clave para notar: > significa operador de redirección, donde abrimos un archivo y 2 entero representa el descriptor de archivo stderr; de hecho, así es exactamente como el estándar POSIX para el lenguaje de shell define la redirección en sección 2.7 :

[n]redir-op word

Para la redirección simple > , el entero 1 está implícito para stdout , es decir, echo Hello World > /dev/null es exactamente igual a echo Hello World 1>/dev/null . Tenga en cuenta que el entero o el operador de redirección no se pueden citar, de lo contrario, Shell no los reconoce como tal, y en su lugar se trata como una cadena de texto literal. En cuanto al espaciado, es importante que el entero esté justo al lado del operador de redirección, pero el archivo puede estar junto al operador de redirección o no, es decir, command 2>/dev/null y command 2> /dev/null funcionarán bien.

La sintaxis un tanto simplificada para un comando típico en shell sería

 command [arg1] [arg2]  2> /dev/null

El truco aquí es que la redirección puede aparecer en cualquier lugar. Eso es tanto 2> command [arg1] y command 2> [arg1] son válidos. Tenga en cuenta que para bash shell, existe &> forma de redirigir las corrientes stdout y stderr al mismo tiempo, pero de nuevo, es específico de bash y si se esfuerza por la portabilidad de las secuencias de comandos, es posible que no funcione. Ver también Ubuntu Wiki y ¿Cuál es la diferencia entre & amp; & gt; y 2 & gt; & amp; 1 .

Nota: El operador de redirección > trunca un archivo y lo sobrescribe, si el archivo existe. El 2>> se puede usar para anexar stderr al archivo.

Si nota, > es para un solo comando. Para las secuencias de comandos, podemos redirigir la corriente de stderr de todo el script desde el exterior como en myscript.sh 2> /dev/null o podemos utilizar integrado en el ejecutor . El ejecutor incorporado tiene la capacidad de volver a cablear la secuencia para toda la sesión de shell, por así decirlo, ya sea de forma interactiva o mediante script. Algo como

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

En este ejemplo, el archivo de registro debe mostrar stat: cannot stat '/etc/non_existing_file': No such file or directory .

Sin embargo, otra forma es a través de las funciones. Como kopciuszek señaló en su respuesta, podemos escribir la declaración de función con la redirección ya adjunta, es decir

some_function(){
    command1
    command2
} 2> my_log_file.txt
    
respondido por el Sergiy Kolodyazhnyy 03.05.2018 - 09:48

Lea otras preguntas en las etiquetas