¿Cómo mostrar la salida de una línea de comandos en la consola y guardar la salida en un archivo de texto?


25

¿Cómo puedo ejecutar sudo apt-get installpor AMBOS ver el proceso de instalación (de largo en mi caso) y guardar la salida en un archivo de texto?


¿Es solo apt-getcorrecto?
Braiam

@Braiam Creo que la solución que acepté se puede aplicar a todos los demás comandos, ¿crees que sí?

Respuestas:


17

usa el scriptcomando. Copiará todo lo que vaya a la pantalla en un archivo

script -c "sudo apt-get install things" script-file.script

scriptenvía la salida del comando a un archivo, pero no lo muestra en la pantalla.
Aaron

2
@ BryceAtNetwork23. ¿Intentaste el comando? guión hace salida de envío a la pantalla.
exore

1
Yo si. Corrí script -c "history" ~/hist.txty vi la salida indicando Script startedy Script done, pero no vi la salida del comando real en la pantalla.
Aaron

10
@ BryceAtNetwork23 historyes un shell incorporado, no un comando externo. Lo que sucede es: 1) la secuencia de comandos comienza, 2) la secuencia de comandos busca el comando de historial, no lo encuentra, por lo que adivina que debería ejecutarse a través de un shell. 3) el script ejecuta el comando a history través de un shell 4) se inicia un nuevo shell y ejecuta el comando interno del historial. Como se trata de un nuevo shell no interactivo, la historia no tiene nada que decir.
exore

1
scriptTambién se puede ejecutar de forma interactiva. Simplemente escriba scripten el símbolo del sistema. Obtendrá un nuevo shell, y cualquier comando que escriba tendrá su salida guardada. Escriba exitpara finalizar el shell y guardar el archivo. De manera predeterminada, se llama a la salida typescripty contendrá todo lo que se muestra en la pantalla, ya sea que lo haya escrito o que haya sido la salida de un comando. El historycomando también debería estar disponible en el nuevo shell también.
Brian Minton

52

Puede usar el teecomando para lograr esto.

sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt

Mira aquí para más información , o ejecutaman tee

Nota: Como otros han mencionado, 2>&1es necesario redirigir STDERR a STDOUT para detectar cualquier error. Consulte esta pregunta de StackOverflow para obtener una buena explicación de lo que 2>&1realmente hace.


Agregaría "2> y 1" antes de "|"
Olivier Dulac

2
Esto es más práctico que scriptya que el comando no tiene que ser citado. Entonces, ventajas como completar bash es más fácil de lograr.
Dan

2
@Dan: la secuencia de comandos no necesita -c "something ...": if lo dejará en un shell y finalizará cuando salga de ese shell. Permite múltiples comandos, etc. Además, mantiene más información de "formateo", lo que permite reproducir algunas cosas más (como: pantalla clara, etc.) (pero eso también puede estropear la salida ... ymmv)
Olivier Dulac

2
@Dan + funciona con funciones, alias, incorporados e incluso grupos de comandos y subcapas. Esta debería ser la respuesta aceptada de la OMI.
Darkhogg

1
podría usar en |&lugar de 2>&1 |en bash
jfs

15

tee hará el trabajo según sea necesario.

Para capturar la salida en un archivo, use:

sudo apt-get install your_software | tee log_file.txt

Esto solo capturará la salida, pero no los mensajes de error. Si también desea grabar mensajes de error, modifique el comando para que sea:

sudo apt-get install your_software 2>&1  | tee log_file.txt

O, dado que es bash compatible con el |&operador , sudo apt-get install your_software |& tee log_file.txtcanalizará stdout y stderr a tee. (Felicitaciones a JF Sebastian que sugirió esto en otra parte .)
Eliah Kagan

9

Una de las ventajas de apt-get (y APT en general) es que almacenan archivos de registro para casi todo, incluso la salida del terminal de cualquier comando que ejecute, en el /var/log/apt. Por ejemplo, esta es la última entrada en mi /var/log/apt/term.log:

Log started: 2014-06-20  16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20  16:46:33

Ahora, comparando con la salida real:

➜  ~  sudo apt-get remove xdotool 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...

Me salvó varias líneas que no son relevantes en la mayoría de los casos, y lo hace automáticamente. Por lo tanto, no necesita ningún comando adicional para hacer lo que quiere hacer, apt-get lo hace por usted.


1

prueba el comando tee . Puedes encontrar aquí algunos ejemplos.

Uso simple:

  <command> | tee file

ejemplo:

  sudo apt-get install whatYouWant | tee outputFile
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.