Commande Linux pour répertorier toutes les commandes et alias disponibles

280

Existe-t-il une commande Linux qui répertoriera toutes les commandes et alias disponibles pour cette session de terminal?

Comme si vous aviez tapé 'a' et appuyé sur tab, mais pour chaque lettre de l'alphabet. Ou exécuter 'alias' mais aussi renvoyer des commandes.

Pourquoi? Je voudrais exécuter ce qui suit et voir si une commande est disponible:

ListAllCommands | grep searchstr
ack
la source
appuyez deux fois sur le bouton TAB pour répertorier toutes les commandes disponibles avec l'environnement
ntshetty

Réponses:

599

Vous pouvez utiliser le bash (1) intégré compgen

  • compgen -c répertorie toutes les commandes que vous pourriez exécuter.
  • compgen -a répertorie tous les alias que vous pouvez exécuter.
  • compgen -b répertorie toutes les fonctions intégrées que vous pouvez exécuter.
  • compgen -k répertorie tous les mots clés que vous pouvez exécuter.
  • compgen -A function répertorie toutes les fonctions que vous pourriez exécuter.
  • compgen -A function -abck énumérera tout ce qui précède en une seule fois.

Consultez la page de manuel pour les autres complétions que vous pouvez générer.

Pour répondre directement à votre question:

compgen -ac | grep searchstr

devrait faire ce que vous voulez.

camh
la source
1
Existe-t-il un équivalent à cela pour csh / tcsh? Ces terminaux ont également une sorte de fonction de saisie semi-automatique utilisée sur l'onglet, alors peut-être que quelque chose existe?
krb686
2
Au lieu de cela compgen | grep, il peut être plus efficace de se passer la chaîne comme argument compgen(s'il est connu pour être un préfixe, comme impliqué dans la question). Dans ce cas, ce serait compgen -ac searchstr.
Toby Speight
En fait, ubuntu affiche «rien d'approprié» whatis compgenet «Aucune entrée manuelle» pour man compgen.
MarAvFe
1
@MarAvFe: C'est parce que c'est une commande bashintégrée, pas une commande séparée avec sa propre page de manuel. Vous devrez lire la bash(1)page de manuel ou exécuter help compgensur une bashligne de commande.
camh
Par extension, faire compgen -c | sort | uniq | lessaffichera toutes les commandes disponibles sans lignes dupliquées et triées par ordre alphabétique.
Fabián
39

Ajouter à .bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

Si vous souhaitez également des alias, alors:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}
Fourmis Aasma
la source
C'est très proche mais cela n'inclut pas les alias. Comment puis-je ajouter un alias | couper -f1 aux résultats mais avant le tri?
ack
1
Pourquoi s'embêter à trier si le seul but est de faire passer la sortie par grep quand même? La philosophie Unix consiste à créer des outils simples, puis à les enchaîner si nécessaire, alors laissez le tri hors ListAllCommands et si l'utilisateur veut que la sortie soit triée, il peut le faire.
danio
4
Le tri consiste à supprimer les doublons.
Ants Aasma
1
Cela ne trouve pas les commandes qui sont des liens symboliques vers des exécutables. Utilisez l'option -Lpour suivre les liens symboliques vers leur destination. Remarque: -Lest une option et ne fait pas partie de l'expression correspondante, en tant que telle, elle doit être placée avant le chemin sur la ligne de commande. Dans ce casfind -L {}
Adaephon
1
Pourrait vouloir rediriger STDERR vers / dev / null pour supprimer les avertissements de répertoire inexistants. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 pour la compatibilité zsh)
TheLonelyGhost
27

Il y a le

type -a mycommand

commande qui répertorie tous les alias et commandes dans $ PATH où ma commande est utilisée. Peut être utilisé pour vérifier si la commande existe en plusieurs variantes. A part ça ... Il y a probablement un script autour qui analyse $ PATH et tous les alias, mais je ne connais aucun de ces scripts.

ensoleillé256
la source
1
Même si ce n'est pas une réponse à la question, je pense que c'est une meilleure solution au problème que l'appel à grep. Vous pouvez donc taper -a foo et si foo n'est pas disponible, il retourne une commande introuvable ou quelque chose comme ça. Vous pouvez donc rechercher une commande sans appeler la commande elle-même.
Janusz
1
En fait, c'est une réponse à la question, comme l'OP a demandé "Je voudrais exécuter ce qui suit et voir si une commande est disponible", donc le but est de voir si une commande est disponible et cette réponse fonctionne clairement.
lothar
2
@lothar, que se passe-t-il si la commande que vous recherchez est, euh, qu'est-ce que c'est, "startserver" ?, "serverstart" ?, "server-something-or-other" ?. Je sais, je vais juste "grep -i" pour le serveur et voir s'il est là. Oups. Bzzz, pas avec cette solution. matey :-) Je ne vais pas voter contre cette réponse (car elle est utile même si de manière limitée) mais une solution complète prendrait en compte que grep est pour les expressions régulières , pas seulement les chaînes fixes.
paxdiablo
6

Utilisez "quelle recherche". Renvoie le chemin du binaire ou la configuration d'alias s'il s'agit d'un alias

Modifier: si vous recherchez une liste d'alias, vous pouvez utiliser:

alias -p | cut -d= -f1 | cut -d' ' -f2

Ajoutez-le à la réponse de recherche que vous souhaitez. Suppose que vous utilisez bash ..

Aaron
la source
6

Les autres commandes ne fonctionnaient pas pour moi sur les systèmes embarqués, car elles nécessitent bash ou une version plus complète de xargs (busybox était limité).

Les commandes suivantes devraient fonctionner sur n'importe quel système de type Unix.

Liste par dossier:

ls $(echo $PATH | tr ':' ' ')

Liste toutes les commandes par nom

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort
Olivier Lasne
la source
Cela dépend toujours tr. Pourquoi pas simplement ls $(echo ${PATH//:/ })?
mschilli
5

Essayez ce script:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done
Victor Hugo
la source
C'est la seule solution de code à ce jour qui le fait pour toutes les commandes, pas seulement pour voir si une commande connue donnée existe. +1.
paxdiablo
3

Pour les utilisateurs de Mac ( find n'a pas -executable et xargs n'a pas -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'
voûte
la source
Merci pour cela. J'utilise en fait un non-mac unix où la réponse @AntsAasma n'a pas fonctionné. Cela fonctionne pour moi sur Mac et mon Unix aussi. Quelle commande puis-je taper pour déterminer la version Unix sur laquelle je suis, afin que je puisse répondre ici pour aider les autres à résoudre mon problème?
prismaticorb
Linux <corporate_proprietary_build_info_here> 12 décembre 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb
3

Il est utile de répertorier les commandes en fonction des mots clés associés à la commande.

Utilisation: man -k "your keyword"

n'hésitez pas à combiner avec:| grep "another word"

par exemple, pour trouver un éditeur de texte: man -k editor | grep text

Bouvreuil
la source
2

Essayez d'appuyer sur ALT-? (alt et point d'interrogation en même temps). Donnez-lui une seconde ou deux pour construire la liste. Cela devrait fonctionner en bash.

Igor Krivokon
la source
3
Ou essayez d'appuyer sur Esc au début d'une ligne vide à quatre reprises.
éphémère
C'est incroyablement utile, et je ne le savais pas déjà merci :-)
Chris Huang-Leaver
2

Voici une solution qui vous donne une liste de tous les exécutables et alias. Il est également portable pour les systèmes sans xargs -d(par exemple Mac OS X), et gère correctement les chemins contenant des espaces.

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

Utilisation:, myscript.sh [grep-options] patternpar exemple pour trouver toutes les commandes qui commencent par ls, sans tenir compte de la casse, faites:

myscript -i ^ls
Adam Rosenfield
la source
2

méthode de raccourci pour répertorier toutes les commandes. Ouvrez le terminal et appuyez deux fois sur le bouton "tab" . C'est montrer toutes les commandes dans le terminal

denny
la source
1
Et vous grepexpliquez exactement comment?
Toby Speight
2

Alternativement, vous pouvez obtenir une liste pratique de commandes couplée à des descriptions rapides (tant que la commande a une page de manuel, ce que la plupart font):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

Ensuite, vous le saluez comme vous le souhaitez.

apropos -s 1 '' | grep xdg

rendements:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

Les résultats ne semblent pas être triés, donc si vous cherchez une longue liste, vous pouvez lancer un | trier | au milieu, puis dirigez-le vers un téléavertisseur comme less / more / most. ala:

apropos -s 1 '' | sort | grep zip | less

Qui retourne une liste triée de toutes les commandes qui ont "zip" dans leur nom ou leur brève description, et pompe ce pageur "moins". (Vous pouvez également remplacer "moins" par $ PAGER et utiliser le pager par défaut.)

Katastic Voyage
la source
1

Vous pouvez toujours effectuer les opérations suivantes:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

Le shell exécutera la commande uniquement s'ils sont de toute façon répertoriés dans le chemin env var.

OscarRyz
la source
1

cela dépend, j'entends par là que cela dépend du shell que vous utilisez. voici les contraintes que je vois:

  1. doit s'exécuter dans le même processus que votre shell, pour intercepter les alias, les fonctions et les variables qui affecteraient les commandes que vous pouvez trouver, pensez PATH ou EDITOR bien qu'EDITOR puisse être hors de portée. Vous pouvez avoir des variables non exportées qui peuvent affecter les choses.
  2. il est spécifique au shell ou vous allez dans le noyau, / proc / pid / enviorn et vos amis n'ont pas assez d'informations

J'utilise ZSH alors voici une réponse zsh, elle fait les 3 choses suivantes:

  1. chemin de vidage
  2. vide les noms d'alias
  3. vide les fonctions qui sont dans l'env
  4. les trie

C'est ici:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

Si vous utilisez zsh, cela devrait le faire.

ms4720
la source
0

Le problème est que la tabulation complète recherche votre chemin, mais toutes les commandes ne se trouvent pas dans votre chemin.

Pour trouver les commandes dans votre chemin en utilisant bash, vous pouvez faire quelque chose comme:

pour x in echo $PATH | cut -d":" -f1; faire ls $ x; terminé

nikudesu
la source
0

Voici une fonction que vous pouvez mettre dans votre fichier bashrc:

fonction commande-recherche
{
   oldIFS = $ {IFS}
   IFS = ":"

   pour p dans $ {PATH}
   faire
      ls $ p | grep 1 $
   terminé

   export IFS = $ {oldIFS}
}

Exemple d'utilisation:

$ command-search gnome
gnome-audio-profiles-properties *
gnome-eject @
porte-clés gnome *
gnome-keyring-daemon *
montage gnome *
gnome-open *
enregistreur de son gnome *
gnome-text-editor @
gnome-umount @
gnome-volume-control *
autorisation-polkit-gnome *
vim.gnome *
$

FYI: IFS est une variable que bash utilise pour diviser les chaînes.

Il pourrait certainement y avoir de meilleures façons de procéder.

Craig Wright
la source
-1

peut-être que je me méprends, mais que se passe-t-il si vous appuyez sur Échap jusqu'à ce que vous ayez les possibilités Afficher tous les X?

LB40
la source
-2
compgen -c > list.txt && wc list.txt
certains1
la source
1
Pensez à ajouter une brève description de ce que cela fait ou comment cela est censé fonctionner. À tout le moins, spécifiez un lien de référence (généralement la page de manuel appropriée) pour suivre et comprendre la solution proposée.
TheCodeArtist
L'utilisation d'un fichier n'est pas toujours une bonne option. Si vous en avez besoin, faites-en au moins un fichier tmp (si la sécurité n'est pas un problème.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary
-3

Pourquoi ne tapez-vous pas simplement:

seachstr

Dans le terminal.

La coquille dira quelque chose comme

seacrhstr: command not found 

ÉDITER:

Ok, je prends le downvote, parce que la réponse est stupide, je veux juste savoir: Quel est le problème avec cette réponse !!! Le demandeur a déclaré:

et voyez si une commande est disponible.

Taper la commande vous dira si elle est disponible !.

Probablement, il / elle voulait dire "sans exécuter la commande" ou "l'inclure dans un script" mais je ne peux pas lire son esprit (ce n'est pas que je ne peux pas régulièrement c'est juste qu'il porte un déflecteur de lecture d'esprit )

OscarRyz
la source
4
Je veux savoir si la formathddcommande existe. Oh attendez, je viens de l'exécuter et de voir. gee. Merci :)
Jeffrey Jose
5
Probablement plus sûr d'utiliser «qui» pour ce faire.
danio
Étant donné qu'il s'agit de Stack Overflow , et non de Super User , une réponse programmatique serait plus appropriée.
Toby Speight
-5

dans debian: ls / bin / | grep "whatImSearchingFor"

Gabriel Sosa
la source
1
les exécutables existent dans tous les répertoires de $ PATH, pas seulement / bin.
PhrkOnLsh