Tuyau Unix dans ls

Je pensais avoir compris *Nix pipes jusqu'à maintenant... J'ai un exécutable appelé {[1] } qui renvoie 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 qu'il me donne est équivalent à avoir juste exécuté ls -l dans le répertoire courant.

Si je cours which studio , je reçois /home/me/bin/studio. Et si je lance ls -l /home/me/bin/studio, j'obtiens la sortie attendue me montrant l'emplacement du lien symbolique.

Alors pourquoi la version canalisée ne fonctionne-t-elle pas? Que n'ai-je pas grokked sur les tuyaux?

30
demandé sur Hbcdev 2013-08-13 17:50:29

3 réponses

Pour ce faire, vous avez besoin de xargs:

which studio | xargs ls -l

À Partir de man xargs:

Xargs-construire et exécuter des lignes de commande à partir de l'entrée standard

Pour bien comprendre comment les tuyaux fonctionnent, vous pouvez lire qu'est-ce qu'une explication simple pour comment les tuyaux fonctionnent dans BASH?:

Un tube Unix connecte le descripteur de fichier STDOUT (sortie standard) de le premier processus à la STDIN (entrée standard) de la seconde. Quel arrive alors est que lorsque le premier processus écrit à son STDOUT, comme la sortie peut être immédiatement lue (à partir de STDIN) par le deuxième processus.

44
répondu fedorqui 2017-05-23 11:54:40

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

ls -l "$( which studio )"

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

18
répondu choroba 2013-08-13 13:55:08

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 l'entrée standard et les arguments. L'entrée standard est un fichier spécial qui est lu en utilisant 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. {[3] } est un tableau de tableaux terminés par null de char, et argc est la longueur de celui-ci tableau.

0
répondu lamg 2016-10-31 18:17:58