salida - tuberias y filtros en linux
Linux(Bash): redirige todo el resultado al archivo (6)
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de redirigir todo el resultado de un programa de línea de comandos a un archivo. Estoy usando Bash. Parte del resultado se dirige a un archivo, pero algunos aún aparecen en el terminal y no se almacenan en el archivo.
Síntomas similares se describen aquí:
Redirigir todos los resultados al archivo
Sin embargo, he intentado la solución propuesta (capturar stderr) sin éxito:
<cmd> <args> > stdout.txt 2> stderr.txt
El archivo stderr.txt se crea pero está vacío.
Una pista posible es que el programa de línea de comandos es un cliente que se comunica con un servidor en la misma máquina. Es posible que parte del resultado provenga del servidor .
¿Hay alguna forma de capturar toda la salida del terminal, independientemente de su origen?
EDITAR:
Confirmé que el servidor genera la salida faltante. Ejecutando el comando en un terminal separado causa alguna salida en ambos terminales, puedo canalizar toda la salida del terminal de comando a un archivo. Esto plantea problemas sobre cómo capturar la salida del servidor, pero esa es una pregunta diferente.
Aunque no es POSIX, bash 4 tiene el operador &>
:
command &> alloutput.txt
La respuesta correcta está aquí: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html
your_command | ssh username@server "cat > filename.txt"
Puede ejecutar una subshell y redireccionar todos los resultados mientras sigue poniendo el proceso en segundo plano:
( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
Si el servidor se inicia en el mismo terminal, entonces es el stderr del servidor el que probablemente se está escribiendo en el terminal y que no está capturando.
La mejor forma de capturar todo sería ejecutar:
script output.txt
antes de iniciar el servidor o el cliente. Esto lanzará un nuevo shell con todas las salidas del terminal redirigidas output.txt y el terminal. Luego, inicie el servidor desde ese nuevo shell y luego con el cliente. Todo lo que ve en la pantalla (tanto su entrada como la salida de todo lo que se escribe en el terminal desde ese shell) se escribirá en el archivo.
Cuando haya terminado, escriba "exit" para salir del shell ejecutado por el comando de script
.
Tuve problemas con un programa bloqueado * tos PHP tos * Al estrellarse el caparazón se ejecutó en los informes el motivo del accidente, Segmentation fault (core dumped)
Para evitar que esta salida no se registre, el comando se puede ejecutar en una subshell que capturará y dirigirá este tipo de salida:
sh -c ''your_command'' > your_stdout.log 2> your_stderr.err
# or
sh -c ''your_command'' > your_stdout.log 2>&1
puede usar esta sintaxis para redirigir todas las salidas stderr y stdout a stdout.txt
<cmd> <args> > allout.txt 2>&1