Tuyauterie vers la commande «type»

10

Je veux découvrir le type de plusieurs commandes. Est-il possible de canaliser ou xargsun résultat de recherche depuis finddans la typecommande sous Linux?

Par exemple:

find . -name anacron | type

ou

find . -name anacron | xargs type
LjinKazama
la source
Je pense que la réponse d'Oli est la meilleure réponse. La réponse au chaos fonctionne, mais la réponse d'Oli est intelligente.
Helio

Réponses:

17

typen'est pas une commande normale. C'est une coquille de buitine. Voir:

$ type type
type is a shell builtin

Donc, vous devez invoquer bashavec -cpour réaliser 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. -Ien xargstermes, nous définissons ici un espace réservé {}à utiliser plus tard. Cet espace réservé est remplacé par le nom de fichier trouvé.

Pourquoi les commandes internes 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 exécute la commande directement, sans appeler 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 est introuvable dans le système de fichiers. C'est dans la coquille elle-même. Vous devez donc appeler le shell et dire au shell appelé d'appeler la commande intégrée. C'est ce qui s'est passé bash -c "command".

le chaos
la source
3
Vous pouvez le condenserfind ... -exec bash -c 'type "$@"' _ {} +
muru
2
@muru en effet, j'ai relu ma propre réponse et je l'ai vue =)
chaos
11

Il y a quelques problèmes ici (certains déjà mis en évidence):

  • typeest une fonction intégrée. Ce n'est pas une commande qui est résolue, c'est une fonction dans bash. Tu vois man bash-builtins. Cela ne fonctionne que dans le contexte de bash donc pas un sous-shell xargsou -execfourchu.
  • typeest habitué à faire sa propre recherche de chemin. Si vous lui donnez un chemin (comme cela findn'est pas coutume de le faire), il ne fera probablement que retourner ce chemin. readlink -fpourrait être mieux si vous essayez simplement de résoudre les liens symboliques; et vous pouvez passer la journée xargs readlinkou -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 typecommande peut gérer plusieurs noms à la fois, vous pouvez donc simplement lui fournir tous les noms à la fois:

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

Pour de nombreuses commandes, s'il y a trop d'arguments, vous dépasserez la limite de longueur de ligne de commande (voir getconf ARG_MAX). Cependant, cela ne s'appliquera pas dans ce cas car typeest intégré au 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).

Oli
la source
1
Merci Oli! Ce débutant linux a appris quelque chose de nouveau aujourd'hui concernant le "type" et ses comportements.
LjinKazama