2010-09-22 1 views
3

J'ai un script bash qui a quelques fonctions qui sont toutes appelées dans 1 fonction. Comment puis-je canaliser toutes les sorties de toutes les fonctions jusqu'à la principale? J'utiliserai aussi tee pour afficher cette sortie à terme et à un fichier journal.Comment rediriger la sortie des appels de fonction imbriqués dans bash?

func 1 

func 2 

func 3 
    func 1 

func 4 
    func 2 
    func 3 


call func 4 # i want to grab it here 
+0

Je vais avoir du mal à comprendre la question. La sortie passe à la sortie standard ou à l'erreur standard, quel que soit le nombre de fonctions shell ou de commandes réelles impliquées. Vous pouvez déjà le diriger dans un pipeline à partir du "principal". Qu'est-ce que cela signifie même de "canaliser" la sortie des fonctions shell "jusqu'à la principale"? – DigitalRoss

+0

Eh bien, j'utilise tee pour enregistrer la sortie ainsi que l'afficher dans le terme. Le problème est que l'une des fonctions appelle un script externe et qu'aucune de ces sorties n'est en cours de journalisation. La seule façon dont j'ai pu le connecter est si je dirige et té la sortie sur cet appel spécifique au script. Si j'essaie de le connecter aux deux emplacements, le fichier est verrouillé et ne fonctionne pas correctement. – zarzar

Répondre

3

Comme DigitalRoss dit, tout va stdout au même endroit et de la tuyauterie et aire de départ fonctionne quelle que soit la profondeur des fonctions et des scripts sont imbriqués (jusqu'à des limites du système). Dans la démo ci-dessous, la fonction f4 montre une façon de le faire et f5 en démontre une autre.

$ f1() { echo f1; } 
$ f2() { echo f2; } 
$ f3() { echo f3; f1; } 
$ f4() { echo f4; f2; f3; } 
$ f4 
f4 
f2 
f3 
f1 
$ f4 | tee tee.out 
f4 
f2 
f3 
f1 
$ cat tee.out 
f4 
f2 
f3 
f1 
$ f5() { { echo f4; f2; f3; } | tee tee2.out; } 
$ f4 | tee tee.out 
f4 
f2 
f3 
f1 
$ cat tee.out 
f4 
f2 
f3 
f1 
7

Hmm, en cas de doute, utilisez () qui se déroulera un sous-shell et rediriger toute sa production.

Alors, essayez quelque chose comme:

(mytoplevelfunc) | tee whatever 
+0

Je pense que c'est ce que je cherchais. Merci! – zarzar

0
$ { echo aaaa; echo bbbb >/tmp/x; echo cccc; } >/tmp/y 
$ cat x 
bbbb 
$ cat y 
aaaa 
cccc 

même réelle redirection imbriquée travaux
(et pas seulement avec (), mais même avec {})

Questions connexes