Envoyer une copie de la sortie d'un script dans un fichier

10

Disons que j'ai un script Zsh et que je voudrais le laisser imprimer la sortie STDOUT, mais aussi copier (vider) sa sortie dans un fichier sur le disque.

De plus, le script démarre avec l'option suivante

set -o xtrace

ce qui l'oblige à être verbeux et à afficher les commandes qu'il exécute. Je voudrais également capturer cette sortie dans un fichier sur le disque.

Ma compréhension est que si je le fais

./my_script.sh > log.txt

il sera simplement envoyé STDOUTà log.txt, mais que se passe-t-il si je veux également voir la sortie dans le terminal?

J'ai lu teeet l' MULTIOSoption dans Zsh, mais je ne sais pas comment les utiliser.

Quand je fais:

./my_script | tee log.txt

Je peux voir la sortie sur le terminal, mais le fichier ne log.txtsemble pas tout capturer (en fait, il ne capture pratiquement rien).

Amelio Vazquez-Reina
la source
./my_script.sh > log.txt 2>&1
mikeserv
On dirait que vous recherchez la scriptcommande. Ou peutmyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Réponses:

12

Il se peut que votre script génère une sortie vers stdoutet stderr, et que vous n'obteniez qu'un seul de ces flux dans votre fichier journal.

./my_script.sh | tee log.txtva en effet tout afficher sur le terminal, mais ne fera que vider stdoutle fichier journal.

./my_script.sh > log.txt 2>&1 fera le contraire, en déposant tout dans le fichier journal, mais sans rien afficher à l'écran.

L'astuce consiste à combiner les deux avec tee:

./myscript.sh 2>&1 | tee log.txt

Cela redirige stderr( 2) vers stdout( 1), puis redirige stdoutvers tee, qui le copie dans le terminal et dans le fichier journal.

L' zshéquivalent multios serait:

./myscript.sh >&1 > log.txt 2>&1

Autrement dit, redirigez stdout à la fois vers la stdout d'origine et log.txt (en interne via un canal vers quelque chose qui fonctionne comme tee), puis redirigez stderr vers cela également (vers le canal vers le teeprocessus de type interne ).

savanto
la source
Merci - Concernant votre dernière ligne, pourquoi pas ./myscript.sh >&1 2>&1 > log.txt? (ie changer l'ordre des deux dernières redirections). Y aurait-il une différence entre eux?
Amelio Vazquez-Reina
Votre variante ne sort pas sur stdout, juste pour log.txt. La dernière ligne de la réponse (ajoutée par @ StéphaneChazelas et pas moi-même) sort dans les deux.
savanto
0

nohup permet à un travail de continuer même si la console meurt ou est fermée, utile pour de longues sauvegardes, etc., mais ici nous utilisons sa journalisation automatique.

nohup myscript.sh & ; tail -f nohup.out
zzapper
la source