Il y a une distinction entre les arguments de la ligne de commande et l'entrée standard. Un tuyau reliera 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 l'écho. C'est bien, non ? Eh bien, echo ignore l'entrée standard et videra ses arguments de ligne de commande - qui ne sont pas dans ce cas - sur sa propre sortie standard. La sortie : rien du tout.
Il y a quelques solutions dans ce cas. L'une d'entre elles consiste à utiliser une commande qui lit stdin et envoie les arguments à stdout, comme par exemple cat.
ls | cat
Fonctionnera, selon votre définition du travail.
Mais qu'en est-il du cas général. Ce que vous voulez vraiment, c'est convertir les stdout d'une commande en args de ligne de commande d'une autre. Comme d'autres l'ont dit, xargs
est l'outil d'aide canonique dans ce cas, en lisant ses args de ligne de commande pour une commande à partir de sa stdin, et en construisant des commandes à exécuter.
ls | xargs echo
Vous pouvez également convertir cette partie, en utilisant la commande de substitution $()
echo $(ls)
ferait également 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'indiquez dans la question, l'autre moyen de base pour convertir stdin en args de ligne de commande est la commande read
intégrée au shell. Elle convertit les “mots” (mots définis par la variable IFS
) en une variable temp, que vous pouvez utiliser dans n'importe quelle exécution de la commande.