Liste tous les files / binarys dans PATH en cours

Existe-t-il un moyen "simple" d'exécuter une command de style "ls -la" pour listr tous les files / exécutables binarys dans le PATH actuel?

(J'ai l'intention de canaliser la sortie dans grep, pour searchr des commands avec des préfixes inconnus mais fondamentalement connus "names", le genre de cas où l'auto-complétion / tabulation dans bash est essentiellement inutile. fonctionnalité complète "…)

 compgen -c # will list all the commands you could run. compgen -a # will list all the aliases you could run. compgen -b # will list all the built-ins you could run. compgen -k # will list all the keywords you could run. compgen -A function # will list all the functions you could run. compgen -A function -abck # will list all the above in one go. 

Voici une fonction qui répertorie le contenu des directorys $PATH . En cas d'arguments passés, la fonction ne répertorie que les commands dont le nom contient un des arguments. Les arguments sont interprétés comme des templates globaux.

 shopt -s extglob lspath () { local IFS pattern IFS='|' pattern="*@($*)*" IFS=':' for d in $PATH; do for x in "$d/"$pattern; do [ "$x" = "$d/$pattern" ] || echo "${x##*/}" done done | sort -u } 

Comme beaucoup de choses, c'est plus facile dans zsh.

 lspath () { (($#)) || set '' print -lr -- $^path/*$^@*(N:t) | sort -u } 

Le caractère ^ dans l' extension du paramètre entraîne l'ajout du text concaténé avec le tableau à chaque élément du tableau, par exemple path=(/bin /usr/bin); echo $^path/foo path=(/bin /usr/bin); echo $^path/foo imprime /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 du paramètre positionnel) avec le modificateur ^ et encore * .
(N:t) est le qualificatif glob N pour get une extension vide s'il n'y a pas de correspondance suivie par le modificateur d'historique t pour garder seulement le nom de base ("tail") de chaque correspondance.

Plus cryptique, évite l'appel externe mais cela n'a qu'un intérêt cosmétique:

 lspath () { (($#)) || set '' local names; names=($^path/*$^@*(N:t)) print -lr -- ${(ou)names} } 

Vous pouvez en effet searchr la command apropos , qui search les pages man de commands dont la description courte contient un mot-key. Une limitation est que cela ne trouve que des commands qui ont une page de manuel.

 function findinpath () { OLDIFS="$IFS" ; IFS="$(printf ':\t\n')" ; for regexp in "$@" ; do for adir in $PATH ; do find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp" done ; done ; IFS="$OLDIFS" ; } 

la search ne correspond qu'à cela: avoir au less un bit "x" (exécutable), et ce n'est pas un directory.

et l'utiliser avec une list de regexp à find:

 findinpath awk sed '\.sh$' 
 for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done 

d'abord, nous faisons écho $PATH dans sed et replace ":" par "".

alors nous faisons une search sur chacune de ces choses pour find des files avec rwx et leur écho.

2> /dev/null est si la find ne sera pas imprimer des erreurs