Unix tuyau dans ls

Je pensais avoir compris * nix pipes jusqu’à présent … J’ai un exécutable appelé studio qui est lié à mon installation d’ Android Studio et j’avais supposé que je pouvais obtenir l’emplacement lié avec

 which studio | ls -l 

Mais ça ne marche pas. Ce que cela me donne équivaut à exécuter simplement 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 indiquant l’emplacement du lien symbolique.

Alors, pourquoi la version avec conduites ne fonctionne-t-elle pas? Qu’est-ce que je n’ai pas vu sur les pipes?

Pour ce faire, vous avez besoin de xargs :

 which studio | xargs ls -l 

De l’ man xargs :

xargs – Construire et exécuter des lignes de commande à partir d’une entrée standard

Pour bien comprendre le fonctionnement des pipes, vous pouvez lire Quelle est une explication simple du fonctionnement des pipes dans BASH? :

Un canal Unix connecte le descripteur de fichier STDOUT (sortie standard) du premier processus au STDIN (entrée standard) du second. Ce qui se passe alors, c’est que lorsque le premier processus écrit sur son STDOUT, cette sortie peut être immédiatement lue (depuis STDIN) par le second processus.

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

 ls -l "$( which studio )" 

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

Puisque ls -l ne prend aucune entrée, il ne fait rien pour la sortie de which studio . L’important ici est de comprendre la différence entre les entrées standard et les 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 parameters argv et argc . argv est un tableau de tableaux terminés par un caractère nul, et argc correspond à la longueur de ce tableau.