Il existe une distinction entre les arguments de la ligne de commande et l'entrée standard. Un pipe connectera la sortie standard d'un processus à l'entrée standard d'un autre. Ainsi,
ls | echo
Connecte la sortie standard de ls à l'entrée standard de echo. C'est bien, non ? Eh bien, echo ignore l'entrée standard et va déverser les arguments de sa ligne de commande - qui dans ce cas n'en sont pas - dans son propre stdout. La sortie : rien du tout.
Il existe quelques solutions dans ce cas. L'une d'elles consiste à utiliser une commande qui lit stdin et décharge stdout, comme cat.
ls | cat
Travailler, ça dépend de votre définition du travail.
Mais qu'en est-il du cas général. Ce que vous voulez vraiment, c'est convertir la sortie stdout d'une commande en arguments de ligne de commande d'une autre. Comme d'autres l'ont dit, xargs
est l'outil d'aide canonique dans ce cas, lisant ses arguments de ligne de commande pour une commande depuis son stdin, et construisant des commandes à exécuter.
ls | xargs echo
Vous pouvez également convertir ceci, en utilisant la commande de substitution $()
echo $(ls)
Je ferais aussi ce que vous voulez.
Ces deux outils sont assez fondamentaux pour le scriptage Shell, vous devriez apprendre les deux.
Pour être complet, comme vous l'indiquez dans la question, l'autre moyen de base pour convertir stdin en args de ligne de commande est la fonction intégrée de Shell. read
commande. Elle convertit les "mots" (les mots tels que définis par la commande IFS
) à une variable temp, que vous pouvez utiliser dans n'importe quelle commande.