Je veux découvrir le type de plusieurs commandes. Est-il possible de canaliser ou xargs
un résultat de recherche depuis find
dans la type
commande sous Linux?
Par exemple:
find . -name anacron | type
ou
find . -name anacron | xargs type
Je veux découvrir le type de plusieurs commandes. Est-il possible de canaliser ou xargs
un résultat de recherche depuis find
dans la type
commande sous Linux?
Par exemple:
find . -name anacron | type
ou
find . -name anacron | xargs type
Réponses:
type
n'est pas une commande normale. C'est une coquille de buitine. Voir:
$ type type
type is a shell builtin
Donc, vous devez invoquer bash
avec -c
pour 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
. -I
en xargs
termes, 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"
.
find ... -exec bash -c 'type "$@"' _ {} +
Il y a quelques problèmes ici (certains déjà mis en évidence):
type
est 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 xargs
ou -exec
fourchu.type
est habitué à faire sa propre recherche de chemin. Si vous lui donnez un chemin (comme cela find
n'est pas coutume de le faire), il ne fera probablement que retourner ce chemin. readlink -f
pourrait être mieux si vous essayez simplement de résoudre les liens symboliques; et vous pouvez passer la journée 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 type
commande 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 type
est 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).