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
command-line
bash
find
LjinKazama
la source
la source
Réponses:
type
n'est pas une commande normale. C'est une coquille de buitine. Voir:Donc, vous devez invoquer
bash
avec-c
pour réaliser ce que vous voulezOu encore plus simple (pas besoin de
xargs
):Il appellera
bash -c "type ./file"
, avec chaque fichier trouvé parfind
.-I
enxargs
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
: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"
.la source
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 voisman bash-builtins
. Cela ne fonctionne que dans le contexte de bash donc pas un sous-shellxargs
ou-exec
fourchu.type
est habitué à faire sa propre recherche de chemin. Si vous lui donnez un chemin (comme celafind
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éexargs 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: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 cartype
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).la source