Existe-t-il un moyen "facile" d'exécuter une commande de style "ls -la" pour répertorier tous les fichiers / binaires exécutables dans le CHEMIN actuel?
(J'ai l'intention de diriger la sortie dans grep, pour rechercher des commandes avec des préfixes inconnus mais essentiellement des "noms" connus, le genre de cas où l'auto-complétion / tabulation dans bash est essentiellement inutile. Donc, une sorte de "auto inverse" fonctionnalité complète "...)
bash
ls
path
autocomplete
pme
la source
la source
ls -la
?Réponses:
la source
which $(compgen -A function -abck)
?Voici une fonction qui répertorie le contenu des répertoires
$PATH
. Si des arguments sont passés, la fonction répertorie uniquement les commandes dont le nom contient l'un des arguments. Les arguments sont interprétés comme des motifs globaux.Comme beaucoup de choses, c'est plus facile dans zsh.
Le
^
caractère dans l' expansion des paramètres entraîne l'ajout du texte concaténé avec le tableau à chaque élément du tableau, par exemple lespath=(/bin /usr/bin); echo $^path/foo
impressions/bin/foo /usr/bin/foo
./*$^@*
ressemble à une insulte de bande dessinée mais est en fait le caractère ordinaire/
, le caractère générique*
, le paramètre spécial$@
(le tableau des paramètres de position) avec le^
modificateur, et encore*
.(N:t)
est le qualificatif globN
pour obtenir une expansion vide s'il n'y a pas de correspondance suivi du modificateur d'historiquet
pour ne conserver que le nom de base («queue») de chaque correspondance.Plus cryptique, évite l'appel externe mais cela n'a qu'un intérêt cosmétique:
Vous pouvez en fait rechercher la
apropos
commande, qui recherche des pages de manuel de commandes dont la courte description contient un mot-clé. Une limitation est que cela ne trouve que les commandes qui ont une page de manuel.la source
^
semble n'entraîner aucune sortie pour un appel "sans arguments"? Si vous le supprimez, vous pouvez tous les répertorier et toujours rechercher des mots clés uniques (mais pas une liste d'entre eux). Le(Non:t)
semble dire que les astérisques devraient être élargis? Impossible de comprendre ce dernier.path
, mais quand je l'exécute dans le shell, c'est bien $ PATH mais avec des espaces au lieu de:
. Le reste est limpide :)$path
est une fonctionnalité zsh: c'est un paramètre lié , un tableau qui est automatiquement mis à jour lorsqu'ilPATH
est mis à jour et vice versa.la recherche ne correspond qu'à: avoir au moins un bit "x" (exécutable) défini, et qui n'est pas un répertoire.
et l'utiliser avec une liste d'expressions régulières à trouver:
la source
echo $PATH | tr ':' '\n' | sort | uniq -d
nous faisons d'abord écho
$PATH
dans sed et remplaçons ":" par "".puis nous faisons une recherche sur chacune de ces choses pour trouver des fichiers avec rwx et les faire écho.
2> /dev/null
est doncfind
pas imprimer des erreursla source
-maxdepth 1
et-type f
dans votre recherche, sinon vous trouverez des sous-répertoires et leurs fichiers (ce que la recherche PATH ne fera pas). De plus, votre test de permission est bizarre - devrait juste pour+x
, je pense?:/bin
ou/bin::/usr/bin
. Essayez d'ajouters/::/:.:/;s/^:/.:/;s/:$/:./
à lased
commande.find
pouvez rechercher plus de chemins, vous pouvez donc le faire sans la boucle:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
bien sûr, les noms de répertoire contenant des espaces vont le gâcher, mais celui basé sur la boucle a le même problème de toute façon.for
. Ilfor
va donc parcourir une liste de 4 mots. Pour manipuler le découpage des mots mieux définir laIFS
fonction de votre besoin:IFS=':'; find $PATH -perm +rwx …
.