Exemple:
ls | echo
n'imprime rien (une ligne vierge, en fait). Je m'attendrais à ce qu'il imprime une liste de fichiers.
ls | grep 'foo'
d’autre part, fonctionne comme prévu (imprime les fichiers avec le nom "foo" dans leur nom).
Ce que je fais dans ces situations ressemble à quelque chose comme ls | while read OUT; do echo $OUT; done
ceci :
mais c'est plutôt lourd.
Pourquoi la tuyauterie fonctionne-t-elle avec certaines commandes mais pas avec d'autres? Comment puis-je contourner ce problème?
ls | echo
faire? pourquoi ne pas simplement courirls
?git cat-file
, mais ça n'a pas fonctionné. Apparemment, echo a le même comportement, je l'ai donc utilisé comme exemple.Réponses:
Il existe une distinction entre les arguments de ligne de commande et les entrées standard. Un tuyau connectera la sortie standard d'un processus à l'entrée standard d'un autre. Alors
Connecte la sortie standard de ls à l’entrée standard d’écho. Bien d'accord? Eh bien, echo ignore l’entrée standard et dumpera ses arguments en ligne de commande - qui ne sont dans ce cas aucunes - sa propre sortie standard. La sortie: rien du tout.
Il y a quelques solutions dans ce cas. La première consiste à utiliser une commande qui lit stdin et effectue un dump sur stdout, tel que cat.
Will 'work', en fonction de votre définition du travail.
Mais qu'en est-il du cas général. Ce que vous voulez vraiment, c'est convertir stdout d'une commande en arguments de ligne de commande d'une autre. Comme d'autres l'ont déjà dit,
xargs
l'outil d'assistance canonique est dans ce cas, la lecture de sa ligne de commande arguant d'une commande à partir de son stdin et la construction de commandes à exécuter.Vous pouvez également convertir ceci en utilisant la commande de substitution
$()
Feriez aussi ce que vous voulez.
Ces deux outils sont assez fondamentaux pour les scripts shell, vous devriez apprendre les deux.
Pour être complet, comme vous l'avez indiqué dans la question, l'autre méthode de base pour convertir stdin en arguments de ligne de commande est la
read
commande intégrée du shell . Il convertit les "mots" (les mots définis par laIFS
variable) en une variable temporaire que vous pouvez utiliser dans toutes les commandes.la source
ls | echo
affiche seulement une ligne vierge, carecho
aucune entrée n’est lue; la dernière commande du pipeline est en fait d’echo
imprimer une ligne vierge.Généralement:
fait en sorte que la sortie de
a
devenir l'entrée deb
. Je vous suggère de lire laPipelines
section deman bash
.Si vous voulez vraiment utiliser
ls
etecho
ensemble, voici quelques exemples (plutôt inutiles):la source
Si vous voulez
echo
lals
commande, essayez:Cela appellera
echo
avec la sortie dels
.la source
ls | xargs -I {} echo {}
si vous voulez que chaque ligne soit appelée individuellementPourquoi ne pas simplement utiliser:
Ou beaucoup plus sûr:
la source
echo *
.