Y a-t-il une ligne qui listera tous les exécutables de $ PATH dans bash.
bash
shell
path
executable
jcubic
la source
la source
in
,{
...) et des alias.Avec zsh:
Ou:
(notez que pour les commandes qui apparaissent dans plusieurs composants de
$PATH
, elles répertorieront uniquement le premier).Si vous voulez les commandes sans les chemins d'accès complets et triées pour faire bonne mesure:
(autrement dit, récupérez les clés de ce tableau associatif au lieu des valeurs).
la source
Dans n'importe quel shell POSIX, sans utiliser de commande externe (en supposant qu'il
printf
est intégré, sinon revenir àecho
) sauf pour le tri final, et en supposant qu'aucun nom exécutable ne contient de nouvelle ligne:Si vous n'avez aucun composant vide dans
$PATH
(utilisez à la.
place), ni des composants commençant par-
, ni des caractères génériques\[?*
dans les composants PATH ou les noms d'exécutables, et aucun exécutable commençant par.
, vous pouvez simplifier ceci pour:Utilisation de POSIX
find
etsed
:Si vous êtes prêt à répertorier le fichier rare non exécutable ou le fichier non régulier dans le chemin, il existe un moyen beaucoup plus simple:
Cela saute les fichiers de points; si vous en avez besoin, ajoutez le
-A
drapeau àls
si le vôtre l'a, ou si vous voulez vous en tenir à POSIX:ls -aH $PATH | grep -Fxv -e . -e ..
Il existe des solutions plus simples en bash et en zsh .
la source
$PATH
est défini et ne contient pas de composants vides, et que les composants ne ressemblent pas à des prédicats de recherche (ou aux options ls). Certains d'entre eux ignoreront également les fichiers dot.yash
etzsh
en émulation sh).find
.-prune
empêchera la liste des répertoires. Vous voulez probablement-L
au lieu de-H
comme vous voulez inclure des liens symboliques (communs aux exécutables).-perm -100
ne donne aucune garantie que le fichier soit exécutable par vous (et pourrait (peu probable) exclure les fichiers exécutables).Je suis venu avec ceci:
EDIT : Il semble que c'est la seule commande qui ne déclenche pas l'alerte SELinux lors de la lecture de certains fichiers du répertoire bin par un utilisateur apache.
la source
for
?IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
est défini et ne contient pas de caractères génériques et ne contient pas de composants vides. Cela suppose également l'implémentation GNU defind
.-type f
au lieu de (spécifique à GNU)-xtype f
, cela supprimera également les liens symboliques. Cela ne répertoriera pas non plus le contenu des$PATH
composants qui sont des liens symboliques.Que dis-tu de ça
La substitution de chaîne est utilisée avec Bash.
la source
$PATH
est défini, ne contient pas de caractères génériques ou vides, ne contient pas de composants vides. Cela suppose également que GNU find. Notez que${var//x/y}
c'est laksh
syntaxe (également prise en charge par zsh et bash). Strictement parlant, cela suppose également que les composants $ PATH ne sont pas non plus desfind
prédicats.$PATH
composants ne sont pas des liens symboliques.IFS=:
est plus robuste que cette substitution. Les chemins avec des espaces ne sont pas si rares sous Windows. Les liens symboliques sont assez courants, mais cela se résout facilement avec-H
.Si vous pouvez exécuter python dans votre shell, le one-liner suivant (ridiculement long) peut également être utilisé:
C'était surtout un exercice amusant pour moi pour voir si cela pouvait être fait en utilisant une ligne de code python sans avoir recours à la fonction 'exec'. Sous une forme plus lisible et avec quelques commentaires, le code ressemble à ceci:
la source
la source