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.