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
ls | echo
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.
ls | 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.
ls | xargs echo
Vous pouvez également convertir ceci en utilisant la commande de substitution $()
echo $(ls)
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 la IFS
variable) en une variable temporaire que vous pouvez utiliser dans toutes les commandes.
ls | echo
faire? pourquoi ne pas simplement courirls
?