web-dev-qa-db-fra.com

Unix pipe en ls

Je pensais avoir compris * nix pipes jusqu'à présent ... J'ai un exécutable appelé studio qui contient des liens symboliques vers mon installation de Android Studio et j'avais supposé que je pouvais obtenir l'emplacement lié à 

which studio | ls -l

Mais ça ne marche pas. Ce que cela me donne est équivalent à avoir juste lancé ls -l dans le répertoire courant.

Si je lance which studio, j'obtiens /home/me/bin/studio. Et si je lance ls -l /home/me/bin/studio, le résultat attendu me montre l'emplacement du lien symbolique.

Alors, pourquoi la version piped ne fonctionne-t-elle pas? Qu'est-ce que je n'ai pas dit à propos des pipes?

31
hcarver

Pour ce faire, vous avez besoin de xargs:

which studio | xargs ls -l

De man xargs:

xargs - construit et exécute des lignes de commande à partir d'une entrée standard

Pour bien comprendre le fonctionnement des tuyaux, vous pouvez lire Qu'est-ce qui explique simplement le fonctionnement des tuyaux dans BASH? :

Un tube Unix connecte le descripteur de fichier STDOUT (sortie standard) de le premier processus au STDIN (entrée standard) du second. Quoi arrive alors est que lorsque le premier processus écrit dans son STDOUT, que la sortie peut être immédiatement lue (à partir de STDIN) par le second processus.

47
fedorqui

ls ne lit pas ses arguments depuis l'entrée standard, mais depuis la ligne de commande. Pour obtenir le répertoire en ligne de commande, vous devez utiliser la substitution de commande:

ls -l "$( which studio )"

(Les guillemets sont nécessaires si le chemin peut contenir des espaces.)

20
choroba

Puisque ls -l ne prend aucune entrée, il ne fait rien concernant la sortie de which studio. La chose importante ici est de comprendre la différence entre une entrée standard et des arguments. L'entrée standard est un fichier spécial qui est lu à l'aide de la procédure scanf (par un programme en C par exemple), et les arguments d'un programme sont transmis à la procédure principale en tant que paramètres argv et argc. argv est un tableau de tableaux de caractères terminés par null, et argc est la longueur de ce tableau.

0
lamg