2013-10-09 9 views
0

J'ai un script ksh93 (mais la question n'est pas liée à ksh).Comment enregistrer une sortie de script shell dans le script

Actuellement, je lance mon script avec quelque chose comme:

./script 2>&1 | tee logfile 

Je me demande ce que dois-je eu dans mon script pour obtenir exactement le même résultat (sortie écran et un fichier journal contenant à la fois stdout et stderr). Bien sûr, je veux éviter d'ajouter '| tee logfile 'pour chaque écho/impression que je fais.

Bien sûr, un moyen de faire cela pourrait être d'envelopper mon script dans un autre qui exécute simplement './script 2> & 1 | tee logfile 'mais je me demandais si cela pouvait être fait dans le script lui-même.

Répondre

2

Une technique commune qui est un peu fragile:

#!/bin/sh 
test -z "$NOEXEC" && { NOEXEC=1 exec "$0" "[email protected]" 2>&1 | tee logfile; exit; } 
... 

Ceci annule la valeur de retour et de sortie avec la valeur retournée par tee. Cela peut ou peut ne pas être un problème et peut être le comportement souhaité.

+0

Pourriez-vous commenter la nécessité de la 'sortie'? Il semble que le script quittera toujours avec le statut 0, quel que soit le statut de sortie de 'tee'. – chepner

+0

Peu importe, 'exit' est nécessaire pour empêcher le script de s'exécuter deux fois. Mais peut-être que "exit $?" Est nécessaire. – chepner

+1

'exit' sans arguments est le même que' exit $? ' –

3

Si le contenu actuel de votre script:

command1 arg1 
command2 arg2 

Vous pouvez envelopper ce lot (dans le script) comme ceci:

{ 
command1 arg1 
command2 arg2 
} 2>&1 | tee logfile 

Le { au code } est maintenant une unité de redirection d'E/S dans le script; la redirection d'E/S à la fin s'applique à toutes les commandes jointes. Il ne crée pas de sous-shell; toutes les variables définies dans les commandes sont disponibles pour le script après la redirection d'E/S. Les { et } sont légèrement syntaxiques; en particulier, } doit être précédé d'un point-virgule ou d'une nouvelle ligne.

+0

votre solution semble plus "propre" que celle de william, mais utilisée avec mon script, elle revient sans faire tout le boulot. bizarre, je ne sais pas pourquoi, et je n'ai pas le temps d'enquêter pour le moment. J'ai beaucoup de commande exécutée via ssh sur des machines distantes qui ne sont pas exécutées dans le support (en utilisant ksh93). – claf

+0

Odd - Je ne sais pas pourquoi cela arriverait. –

Questions connexes