Respuestas:
Sí, es posible, solo redirige la salida a un archivo:
SomeCommand > SomeFile.txt
O si desea agregar datos:
SomeCommand >> SomeFile.txt
Si también quieres stderr
usar esto:
SomeCommand &> SomeFile.txt
o esto para agregar:
SomeCommand &>> SomeFile.txt
si desea que tanto la stderr
salida como la salida se muestren en la consola y en un archivo, use esto:
SomeCommand 2>&1 | tee SomeFile.txt
(Si solo desea la salida, suelte lo 2
anterior)
make
comando en un archivo, se requiere esta sintaxis: make > someFile.txt 2>&1
(fuente: linuxquestions.org/questions/linux-newbie-8/… )
Para escribir la salida de un comando en un archivo, existen básicamente 10 formas de uso común.
Tenga en cuenta que
n.e.
en la columna de sintaxis significa "no existente".
Hay una manera, pero es demasiado complicado para encajar en la columna. Puede encontrar un enlace útil en la sección Lista al respecto.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
La secuencia de salida estándar se redirigirá solo al archivo, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.
command >> output.txt
La secuencia de salida estándar se redirigirá solo al archivo, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.
command 2> output.txt
El flujo de error estándar será redirigido solo al archivo, no será visible en el terminal. Si el archivo ya existe, se sobrescribe.
command 2>> output.txt
El flujo de error estándar será redirigido solo al archivo, no será visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.
command &> output.txt
Tanto la salida estándar como la secuencia de error estándar se redirigirán al archivo solamente, no habrá nada visible en el terminal. Si el archivo ya existe, se sobrescribe.
command &>> output.txt
Tanto la salida estándar como la secuencia de error estándar se redirigirán al archivo solamente, no habrá nada visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.
command | tee output.txt
La secuencia de salida estándar se copiará en el archivo, aún estará visible en el terminal. Si el archivo ya existe, se sobrescribe.
command | tee -a output.txt
La secuencia de salida estándar se copiará en el archivo, aún estará visible en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.
(*)
Bash no tiene una sintaxis abreviada que permita canalizar solo StdErr a un segundo comando, que se necesitaría aquí en combinación con tee
nuevamente para completar la tabla. Si realmente necesita algo así, consulte "¿Cómo canalizar stderr y no stdout?" en Stack Overflow para ver cómo se puede hacer, por ejemplo, intercambiando flujos o usando la sustitución de procesos.
command |& tee output.txt
Tanto la salida estándar como las secuencias de error estándar se copiarán en el archivo sin dejar de ser visibles en el terminal. Si el archivo ya existe, se sobrescribe.
command |& tee -a output.txt
Tanto la salida estándar como las secuencias de error estándar se copiarán en el archivo sin dejar de ser visibles en el terminal. Si el archivo ya existe, los nuevos datos se agregarán al final del archivo.
2>&1
redirige STDERR a STDOUT, 1>&2
redirige STDOUT a STDERR y 3>&1
redirigiría la secuencia 3 a STDERR.
sh: 1: Syntax error: "&" unexpected
cuando lo uso |& tee
desde un script de Python en un servidor c9.io. Parece que se está utilizando un caparazón diferente. echo $SHELL
muestra /bin/bash
y $SHELL --version
muestra la versión 4.3.11 (1) -lanzamiento. Intenté #!/bin/bash
en mi script de Python pero todavía consigo sh: 1: Syntax error
. Obtuve lo que necesitaba, así que renuncio a ordenar las rarezas entre sh
y bash
en mi servidor. Gracias.
sh
y no bash
(o tal vez bash
en sh
modo ...). Puede verificar qué está utilizando exactamente su proceso de shell actual ps -p $$ -o cmd=
, porque echo $SHELL
no es confiable y le mostrará su shell de inicio de sesión, ignorando si podría haber iniciado un subshell diferente.
También puede usar tee
para enviar la salida a un archivo:
command | tee ~/outputfile.txt
Una ligera modificación también atrapará a stderr:
command 2>&1 | tee ~/outputfile.txt
o un poco más corto y menos complicado:
command |& tee ~/outputfile.txt
tee
es útil si desea poder capturar la salida del comando mientras lo ve en vivo .
2>&1
?
Puede redirigir la salida del comando a un archivo:
your_command >/path/to/file
Para agregar el resultado del comando a un archivo en lugar de sobrescribirlo, use:
your_command >>/path/to/file
Una mejora a tener en cuenta:
Varios scripts inyectarán códigos de color en la salida que quizás no desee saturar su archivo de registro.
Para solucionar esto, puede usar el programa sed para eliminar esos códigos. Ejemplo:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
y grep
, soportan --color=auto
, que genera códigos de color solo si la salida estándar es un terminal.
Para cron
trabajos, etc., desea evitar las extensiones Bash. Los sh
operadores de redireccionamiento POSIX equivalentes son
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
Notarás que la instalación POSIX es, en cierto sentido, más simple y más directa. Se &>
tomó prestada la sintaxis, csh
que ya debería convencerlo de que es una mala idea.
some_command | tee command.log
y some_command > command.log
tienen el problema de que no guardan la salida del comando en el command.log
archivo en tiempo real.
Para evitar ese problema y guardar la salida del comando en tiempo real, puede agregar unbuffer
, que viene con el expect
paquete.
Ejemplo:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Suponiendo que log.py
contiene:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
puedes correr unbuffer python log.py | tee command.log
ounbuffer python log.py > command.log
Más información: ¿Cómo puedo guardar la salida de un comando en un archivo en tiempo real?
someCommand 2> someFile.txt
ysomeCommand 2>> someFile.txt
también redirigestterr
a someFile.txt