2011-03-08 5 views
1

Je souhaite compter le nombre de lignes générées par une commande dans un script bash. à savoirProblème de redirection de sortie bash

COUNT=ls | wc -l

Mais je veux aussi le scénario pour sortir la sortie d'origine à partir ls. Comment faire cela? (Ma commande réelle n'est pas ls et il a des effets secondaires donc je ne peux pas courir deux fois..)

Répondre

4

Le tee(1) utilitaire peut être utile:

$ ls | tee /dev/tty | wc -l 
CHANGES 
qpi.doc 
qpi.lib 
qpi.s 
4 

info coreutils "tee invocation" comprend cet exemple ci-dessous, qui pourrait être plus instructive du pouvoir » tee(1):

wget -O - http://example.com/dvd.iso \ 
    | tee >(sha1sum > dvd.sha1) \ 
     >(md5sum > dvd.md5) \ 
    > dvd.iso 

qui télécharge le fichier une fois, envoie la sortie par deux processus enfants (comme commencé via bash(1) substitution de processus) et aussi stdout tee(1), qui est redirigé vers un fichier.

+2

Voici une variante pour mettre le nombre de lignes dans une variable, plutôt que de l'ajouter à la sortie: 'COUNT = $ (ls -l | tee/dev/tty | wc -l)' –

+0

@Gordon Davisson, merci, ce serait être plus utile pour ce que @nakiya voulait. :) – sarnold

+0

Techniquement, c'est la substitution de processus de Bash. –

2
ls | tee tmpfile | first command 
cat tmpfile | second command 
+0

Il fonctionne! Merci. – nakiya

0

T-shirt est une bonne façon de le faire, mais vous pouvez faire quelque chose de plus simple:

ls > __tmpfile 

cat __tmpfile | wc -l 
cat __tmpfile 

rm __tmpfile