Comment afficher à la fois la sortie d'une ligne de commande sur la console et enregistrer la sortie dans un fichier texte?

25

Comment puis - je courir sudo apt-get installpar BOTH voir le processus d'installation (longue dans mon cas) et sauver sa sortie dans un fichier texte?


la source
Est-ce à peu près apt-getjuste?
Braiam
@Braiam Je pense que la solution que j'ai acceptée peut être appliquée à toutes les autres commandes, pensez-vous que oui?

Réponses:

17

utilisez la scriptcommande. Il copiera tout ce qui va à l'écran dans un fichier

script -c "sudo apt-get install things" script-file.script
exore
la source
scriptenvoie la sortie de la commande dans un fichier, mais ne l'affiche pas à l'écran.
Aaron
2
@ BryceAtNetwork23. Avez-vous essayé la commande? le script ne envoie une sortie à l' écran.
exore le
1
J'ai fait. J'ai couru script -c "history" ~/hist.txtet j'ai vu la sortie indiquant Script startedet Script done, mais je n'ai pas vu la sortie de la commande réelle sur l'écran.
Aaron
10
@ BryceAtNetwork23 historyest un shell intégré, pas une commande externe. Ce qui se passe est: 1) le script démarre, 2) le script recherche la commande d'historique, ne la trouve pas, il suppose donc qu'il devrait l'exécuter via un shell. 3) le script exécute la commande history via un shell 4) un nouveau shell démarre et exécute la commande interne historique. Puisqu'il s'agit d'un nouveau shell non interactif, l'histoire n'a rien à dire.
exore le
1
scriptpeut également être exécuté de manière interactive. Tapez simplement scriptà l'invite de commande. Vous obtiendrez un nouveau shell, et toutes les commandes que vous tapez auront leur sortie enregistrée. Tapez exitpour terminer le shell et enregistrez le fichier. Par défaut, la sortie est appelée typescriptet elle contiendra tout ce qui apparaît sur votre écran, que vous l'ayez tapé ou que ce soit la sortie d'une commande. La historycommande devrait également être disponible dans le nouveau shell.
Brian Minton
52

Vous pouvez utiliser le tee commande pour accomplir cela.

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

Regardez ici pour plus d'informations ou exécutezman tee

Remarque: Comme d'autres l'ont mentionné, il 2>&1est nécessaire de rediriger STDERR vers STDOUT pour détecter les erreurs. Voir cette question StackOverflow pour une bonne explication de ce qui 2>&1se passe réellement.

Aaron
la source
J'ajouterais "2> & 1" avant le "|"
Olivier Dulac
2
C'est plus pratique que scriptpuisque la commande n'a pas besoin d'être citée. Il est donc plus facile d'accomplir des avantages comme l'achèvement de bash.
Dan
2
@Dan: le script n'a pas besoin du -c "something ...": if vous déposera alors dans un shell, et se terminera lorsque vous quitterez ce shell. Permet plusieurs commandes, etc. De plus, il conserve plus d'informations sur le "formatage", permettant la relecture de plus de choses (comme: écran clair, etc.) (mais cela peut aussi gâcher la sortie ... ymmv)
Olivier Dulac
2
@Dan + fonctionne avec des fonctions, des alias, des commandes intégrées et même des groupes de commandes et des sous-coquilles. Cela devrait être la réponse acceptée OMI.
Darkhogg
1
vous pourriez utiliser |&au lieu de 2>&1 |dans bash
jfs
15

tee fera le travail au besoin.

Pour capturer la sortie dans un fichier, utilisez:

sudo apt-get install your_software | tee log_file.txt

Cela ne capturera que la sortie, mais pas les messages d'erreur. Si vous souhaitez également enregistrer des messages d'erreur, modifiez la commande pour qu'elle soit:

sudo apt-get install your_software 2>&1  | tee log_file.txt
Alex C
la source
Ou, puisque bash prend en charge l' |&opérateur , sudo apt-get install your_software |& tee log_file.txtdirigera à la fois stdout et stderr vers tee. (Félicitations à JF Sebastian qui a suggéré cela ailleurs .)
Eliah Kagan
9

L'un des avantages d'apt-get (et d'APT en général) est qu'ils stockent des fichiers journaux pour presque tout, même la sortie du terminal de toute commande que vous exécutez, dans le /var/log/apt. Par exemple, c'est la dernière entrée de mon /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

Maintenant, en comparant avec la sortie réelle:

➜  ~  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) ...

Cela m'a sauvé plusieurs lignes qui ne sont pas pertinentes dans la plupart des cas, et cela se fait automatiquement. Donc, vous n'avez besoin d'aucune commande supplémentaire pour faire ce que vous voulez faire, apt-get le fait pour vous.

Braiam
la source
1

essayez la commande tee . Vous pouvez trouver ici quelques exemples.

Utilisation simple:

  <command> | tee file

Exemple:

  sudo apt-get install whatYouWant | tee outputFile
Lety
la source