En bash, llamar foo
mostrará cualquier salida de ese comando en el stdout.
Llamar foo > output
redirigiría cualquier salida de ese comando al archivo especificado (en este caso, 'salida').
¿Hay alguna manera de redirigir la salida a un archivo y mostrarlo en stdout?
foo > output
los datos se escribe en stdout y stdout es el archivo llamadooutput
. Es decir, escribir en el archivo es escribir en stdout. Usted pregunta si es posible escribir tanto en stdout como en la terminal.Respuestas:
El comando que desea se llama
tee
:Por ejemplo, si solo te importa stdout:
Si desea incluir stderr, haga:
2>&1
redirige el canal 2 (stderr / error estándar) al canal 1 (stdout / salida estándar), de modo que ambos se escriben como stdout. También se dirige al archivo de salida dado a partir deltee
comando.Además, si desea agregar al archivo de registro, use
tee -a
como:fuente
-a
argumentotee
para agregar contenido aoutput.file
, en lugar de sobrescribirlo:ls -lR / | tee -a output.file
$?
después, devolverá el código de estado detee
, que probablemente no sea lo que desea. En cambio, puedes usar${PIPESTATUS[0]}
.2>&1
vuelca las secuencias stderr y stdout.tee outfile
toma la transmisión que recibe y la escribe en la pantalla y en el archivo "archivo externo".Esto es probablemente lo que la mayoría de la gente está buscando. La situación probable es que algún programa o script esté trabajando duro durante mucho tiempo y produciendo una gran cantidad de resultados. El usuario quiere verificar periódicamente el progreso, pero también quiere que la salida se escriba en un archivo.
El problema (especialmente cuando se mezclan flujos stdout y stderr) es que el programa confía en que los flujos se descarguen. Si, por ejemplo, todas las escrituras en stdout no están enjuagadas, pero todas las escrituras en stderr están enjuagadas, entonces terminarán sin orden cronológico en el archivo de salida y en la pantalla.
También es malo si el programa solo genera 1 o 2 líneas cada pocos minutos para informar el progreso. En tal caso, si el programa no descargara la salida, el usuario ni siquiera vería ninguna salida en la pantalla durante horas, ya que ninguna de ellas pasaría por la tubería durante horas.
Actualización: el programa
unbuffer
, parte delexpect
paquete, resolverá el problema de almacenamiento en búfer. Esto hará que stdout y stderr escriban en la pantalla y el archivo inmediatamente y los mantengan sincronizados cuando se combinen y se redirijan a ellostee
. P.ej:fuente
$ stdbuf -o 0 program [arguments...] 2>&1 | tee outfile
python
tiene una opción integrada-u
que destraba la salida.Otra forma que funciona para mí es,
como se muestra en el manual de gnu bash
Ejemplo:
Para obtener más información, consulte redirección
fuente
$?
después, devolverá el código de estado detee
, que probablemente no sea lo que desea. En cambio, puedes usar${PIPESTATUS[0]}
.Principalmente puede usar la solución Zoredache , pero si no desea sobrescribir el archivo de salida, debe escribir tee con la opción -a de la siguiente manera:
fuente
Algo para agregar ...
El paquete unbuffer tiene problemas de soporte con algunos paquetes bajo Fedora y Redhat Unix.
Dejando de lado los problemas
Siguiente funcionó para mí
fuente
Usar
tail -f output
debería funcionar.fuente
Respuesta extra ya que este caso de uso me trajo aquí:
En el caso de que necesite hacer esto como otro usuario
Tenga en cuenta que el eco sucederá como usted y la escritura del archivo sucederá como "some_user", lo que NO funcionará es si tuviera que ejecutar el eco como "some_user" y redirigir la salida con >> "some_file" porque la redirección del archivo ocurrirá como tu.
Sugerencia: tee también admite agregar con el indicador -a, si necesita reemplazar una línea en un archivo como otro usuario, puede ejecutar sed como el usuario deseado.
fuente
< command > |& tee filename
# esto creará un archivo "nombre de archivo" con el estado del comando como contenido. Si ya existe un archivo, eliminará el contenido existente y escribirá el estado del comando.< command > | tee >> filename
# esto agregará estado al archivo pero no imprime el estado del comando en standard_output (pantalla).Quiero imprimir algo usando "echo" en la pantalla y agregar esos datos repetidos a un archivo
fuente
Puede hacer eso para toda su secuencia de comandos utilizando algo así al principio de su secuencia de comandos:
Esto redirige las salidas stderr y stdout al archivo llamado
mylogfile
y deja que todo vaya a stdout al mismo tiempo .Se utilizan algunos trucos estúpidos:
exec
sin comando para configurar redirecciones,tee
para duplicar salidas,NUL
carácter especificado por la$'string'
notación bash especial) para especificar que el script se reinicia (su trabajo original no puede usar ningún parámetro equivalente),pipefail
opciónFeo pero útil para mí en ciertas situaciones.
fuente
la camiseta es perfecta para esto, pero esto también hará el trabajo
fuente
;
, la salida se retrasaría mucho durante un comando lento.