web-dev-qa-db-fra.com

Liste toutes les commandes connues d'un shell

Que puis-je taper sur mon Shell (qui se trouve être bash) qui listera toutes les commandes reconnues?

En outre, cela diffère-t-il par la coque? Ou est-ce que tous les shells ont juste un "répertoire" de commandes qu'ils reconnaissent?

Deuxièmement, une question différente, mais comment puis-je passer outre à celles-ci? En d'autres termes, comment puis-je écrire ma propre commande view pour remplacer celle qui existe sur mon système Ubuntu, qui semble simplement charger vim.

41
themirror

Vous pouvez utiliser compgen

compgen -c # will list all the commands you could run.

Pour info:

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.
68
Rahul Patil

Un Shell connaît quatre types de commandes.

  • Alias: ce sont des surnoms pour une commande avec quelques options. Ils sont définis dans le fichier d'initialisation du Shell (~/.bashrc Pour bash).
  • Fonctions: ce sont des extraits de code Shell donnés un nom. Comme les alias, ils sont définis dans le fichier d'initialisation du Shell.
  • Builtins: le Shell est livré avec un petit nombre de commandes intégrées. La plupart des builtins manipulent l'état du Shell (cd change le répertoire courant, set change les options et les paramètres de position, export change l'environnement,…). La plupart des Shell offrent en grande partie les mêmes fonctions intégrées, mais chaque Shell a quelques extensions de l'ensemble de base.
  • Commandes externes: elles sont indépendantes du Shell. Comme d'autres programmes, le Shell exécute des programmes externes en les recherchant dans le chemin de recherche exécutable . La variable d'environnement PATH contient une liste de répertoires séparés par deux points pour rechercher des programmes.

En cas de commandes de plusieurs types portant le même nom, la première correspondance dans l'ordre ci-dessus est exécutée¹.

Vous pouvez voir à quel type de commande correspond un nom en exécutant type some_name.

Vous pouvez lister les alias en exécutant le alias intégré sans argument. Il n'y a aucun moyen de lister les fonctions ou les builtins qui fonctionnent dans tous les shells. Vous pouvez trouver une liste de builtins dans la documentation du Shell.

En bash, la fonction intégrée set répertorie les fonctions avec leurs définitions ainsi que les variables. En bash, ksh ou zsh, typeset -f Répertorie les fonctions avec leurs définitions. En bash, vous pouvez lister tous les noms de commandes de tout type avec compgen -c. Vous pouvez utiliser compgen -A alias, compgen -A builtincompgen -A function Pour répertorier les commandes d'un type spécifique. Vous pouvez passer une chaîne supplémentaire à compgen pour répertorier uniquement les commandes commençant par ce préfixe.

Dans zsh, vous pouvez lister les commandes actuellement disponibles d'un type donné avec echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins} et echo ${(k)commands} (cette dernière répertorie uniquement les commandes externes).

L'extrait Shell-agnostic suivant répertorie tous les programmes externes disponibles:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Il y a un cas Edge dans les commandes Bash: hachées.

Bash Reference Manual dit:

Une recherche complète des répertoires dans $ PATH n'est effectuée que si la commande n'est pas trouvée dans la table de hachage

Essayer:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

La variable d'environnement PATH ne contient pas ~/dir-for-wat-command, compgen -c N'affiche pas wat, mais vous pouvez exécuter wat.

Si vous souhaitez masquer une commande existante, définissez un alias ou une fonction .

¹ Exception: quelques fonctions internes (appelées fonctions spéciales ) ne peuvent pas être masquées par une fonction - bash et zsh ne sont cependant pas conformes à POSIX sur ce point dans leur mode par défaut.

Essayez ceci en utilisant bash :

printf '%s\n' ${PATH//:/\/* }
4
Gilles Quenot

La liste des commandes se compose de deux ensembles:

  1. Les commandes intégrées au Shell
  2. Les commandes de votre PATH

Vous ne pouvez pas modifier les intégrés, mais vous pouvez empêcher le shell d'utiliser un intégré en spécifiant le chemin d'accès complet comme /bin/echo.

Quant aux commandes de votre PATH, vous pouvez changer cela. PATH est une liste de répertoires séparés par deux points pour rechercher des commandes. Le premier fichier correspondant a trouvé "gagne".

export PATH=~/bin:${PATH}

(Cette syntaxe ne fonctionne pas pour les shells dérivés de csh, mais pour tous les autres que je connais).

Cela exporte PATH avec ~/bin comme première entrée suivie du reste des entrées PATH existantes. Alors maintenant, votre Shell va vérifier directory calledpoubellein your home directory for a command *first* before checking the standardPATH` le système configuré. Vous pouvez facilement le faire vérifier le dernier répertoire en utilisant plutôt:

export PATH=${PATH}:~/bin

Pour que le PATH persiste pour les futures connexions, ajoutez-le à un .profile ou autre fichier Shell rc.

3
kurtm

Si vous appuyez deux fois sur la touche de tabulation puis sur y, vous obtiendrez la liste de toutes les commandes disponibles dans votre shell actuel. Pour la deuxième question, je pense que vous devriez utiliser l'alias: Shell alias .

1
coffeMug