Comment rediriger la sortie vers l'écran ainsi que vers un fichier?

12

Mon objectif est de consigner toutes les sorties d'un script dans un répertoire que le script va créer.

Par exemple, j'ai:

~/.abc.sh:

#! /bin/bash
rails new myapp

Quand je cours ...

cd ~/code
. ~/.abc.sh

... qui créera une nouvelle application Rails dans le répertoire ~/code/myapp.

Lorsque Rails crée une application, il génère beaucoup de texte que je souhaite capturer et stocker dans un fichier journal dans le même répertoire que la railscommande nouvellement créée. Je souhaite également afficher ce texte dans le terminal.

Comment dois-je procéder?

Zabba
la source

Réponses:

23

Vous pouvez utiliser la teecommande pour cela:

command | tee /path/to/logfile

L'équivalent sans écrire dans la coque serait:

command > /path/to/logfile

Si vous souhaitez ajouter ( >>) et afficher la sortie dans le shell, utilisez l' -aoption:

command | tee -a /path/to/logfile

Veuillez noter que le tuyau n'accroche que stdout, les erreurs de stderr ne sont pas traitées par le tuyau avec tee. Si vous souhaitez enregistrer les erreurs (de stderr), utilisez:

command 2>&1 | tee /path/to/logfile

Cela signifie: exécutez commandet redirigez le flux stderr (2) vers stdout (1). Cela sera transmis au tube avec l' teeapplication.

Lekensteyn
la source
Tu veux dire ~/.abc.sh | tee <file>? Si c'est le cas, le problème est que je ne sais pas dans quel répertoire le script va créer l'application lorsque je l'appelle, alors comment saurais-je quoi donner dans l' fileargument? (Merci pour les bons exemples)
Zabba
@Zabba: qu'en est-il de la création d'un fichier temporaire et de le déplacer ensuite?
Lekensteyn
Ok, ça devrait marcher :). À cet égard, comment puis-je créer un fichier temporaire avec un nom aléatoire que je pourrai ensuite éditer puis copier vers un emplacement souhaité par la suite? Existe-t-il une commande intégrée pour obtenir un "nom de fichier temporaire"?
Zabba
@Zabba: la commande pour cela est mktemp. Voir la page de manuel man mktemp.
Lekensteyn
跪拜, travaillez comme un charme
Sun Junwen
0

scriptdémarrera une session interactive et enregistrera toutes les sorties (stdout / stderr etc.) dans un fichier, ou (avec le -cparamètre) exécutera une commande et enregistrera la sortie de cela.

script -c ~/.abc.sh -f abc.log

Remarque: dans une session interactive, vous pouvez arrêter l'enregistrement simplement en quittant la session comme vous le feriez normalement (par exemple exitou Ctrl-D).

Pour l'enregistrement de session avec lecture vidéo, vous pouvez également essayer l' ascininema .

mwfearnley
la source