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
.
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.
Un Shell connaît quatre types de commandes.
~/.bashrc
Pour bash).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.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 builtin
compgen -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.
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//:/\/* }
La liste des commandes se compose de deux ensembles:
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 called
poubellein your home directory for a command *first* before checking the standard
PATH` 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.
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 .