web-dev-qa-db-fra.com

Piping to "type" command

Je veux savoir le type de plusieurs commandes. Est-il possible de canaliser ou xargs un résultat de recherche de find dans la commande type sous Linux?

Par exemple:

find . -name anacron | type

ou

find . -name anacron | xargs type
10
LjinKazama

type n'est pas une commande normale. C'est un Shell Buitin. Voir:

$ type type
type is a Shell builtin

Vous devez donc appeler bash avec -c pour obtenir ce que vous voulez.

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

Ou encore plus simple (pas besoin de xargs):

$ find . -name anacron -exec bash -c "type {}"  \;

Il appellera bash -c "type ./file", avec chaque fichier trouvé par find. -I dans xargs signifie que nous définissons ici un espace réservé {} à utiliser ultérieurement. Cet espace réservé est remplacé par le nom de fichier trouvé.

Pourquoi les fonctions intégrées de Shell ne fonctionnent pas avec xargs:

[...] Les commandes intégrées sont contenues dans le shell lui-même. Lorsque le nom d'une commande intégrée est utilisé comme premier mot d'une commande simple, le shell l'exécute directement, sans invoquer un autre programme. [...]


xargs lit les éléments de l'entrée standard, [...] et exécute la commande

La commande dans ce cas est un simple excutable, et un shell intégré n'est pas un exécutable. Il ne peut pas être trouvé dans le système de fichiers. C'est dans la coquille elle-même. Vous devez donc appeler le shell et demander au shell appelé d'appeler la commande intégrée. C'est ce qui est arrivé avec bash -c "command".

17
chaos

Il y a quelques problèmes ici (certains ont déjà été soulignés):

  • type est une fonction intégrée. Ce n'est pas une commande qui est résolue, c'est une fonction dans bash. Voir man bash-builtins. Cela ne fonctionne que dans le contexte de bash, donc pas de sous-shell forké xargs ou -exec.
  • type est habitué à faire sa propre recherche de chemin. Si vous lui donnez un chemin (comme find est habituel), il retournera probablement ce chemin. readlink -f pourrait être mieux si vous essayez simplement de résoudre des liens symboliques; et vous pouvez accéder à xargs readlink ou -exec readlink -f {} + toute la journée.

Cela ne veut pas dire que vous ne pouvez pas faire ce que vous essayez de faire. Il y a deux options. La commande type peut gérer plusieurs noms à la fois, vous pouvez donc lui fournir tous les noms à la fois:

type $(find /usr/sbin -name anacron)

Pour de nombreuses commandes, s'il y a trop d'arguments, la limite de longueur de ligne de commande est dépassée (voir getconf ARG_MAX). Cependant, cela ne s'appliquera pas dans ce cas car type est intégré dans le shell et ne génère pas de nouvel ID de processus (la limite de longueur s'applique à la fonction exec () utilisée par le processus enfant dans une ligne de commande normale).

11
Oli