Si j'exécute la test
commande dans bash, test
(évalue l'expression conditionnelle) l'utilitaire intégré est démarré:
$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$
Cependant, comme vu dans la sortie de type -a test
ci-dessus, il y en a un autre test
dans le répertoire / usr / local / bin et encore un autre dans le répertoire / usr / bin. Comment les exécutables sont-ils ordonnés, c'est-à-dire que les commandes intégrées sont toujours préférées et que le reste des commandes dépend de l'ordre du répertoire dans la variable $ PATH? De plus, est-il possible de changer l'ordre des exécutables démarrés, par exemple si je tape test
, alors / usr / bin / test est démarré au lieu de bash-builtin test
?
bash
shell
command
shell-builtin
Martin
la source
la source
/usr/bin/test -f "$file"
...Réponses:
La priorité la plus élevée est l'alias bash, puis les fonctions spéciales (uniquement en mode POSIX), puis les fonctions, puis les fonctions intégrées, puis une recherche dans
$PATH
.Pour exécuter une fonction intégrée, utilisez
builtin test
.Pour exécuter une application externe, utilisez un chemin d' accès explicite:
/bin/test
.Pour ignorer les fonctions et les alias, utilisez
command test
.Pour contourner uniquement l'alias, l'utilisation
\test
ou tout autre type d'extension.Il est possible de désactiver / activer une fonction intégrée avec
enable test
.(Mis à jour selon les commentaires ci-dessous)
(Correction d'une modification d'administration incorrecte que bash a
disable
intégrée - en fait, il n'y en a queenable
)la source
\test
ou'test'
outes't'
./
,$
, backtick et=
et aucun des métacaractères du shell ou des guillemets répertoriés ci-dessus peut ne pas apparaître dans un nom d'alias. "Les commandes intégrées sont toujours préférées aux commandes externes. La raison en est que la commande intégrée est plus rapide (et dans certains cas, comme
cd
ou , seule la commande intégrée peut avoir l'effet souhaité).test -o BASH_OPTION
Parfois, la commande externe peut avoir des capacités que le shell intégré ne possède pas. Dans ce cas, vous pouvez appeler la commande externe en donnant un chemin explicite (c'est-à-dire contenant une barre oblique) (cela contourne toute préoccupation concernant l'ordre dans
$PATH
). Si vous ne voulez pas coder en dur le chemin externe mais que vous voulez empêcher l'utilisation de la fonction intégrée, vous pouvez utiliser"$(type -P test)"
(majuscule de noteP
) en bash,"$(whence -p test)"
en ksh et=test
en zsh. Une autre façon de forcer l'utilisation d'une commande externe est d'utiliser lecommand
builtin (command -p test …
) ou de passer par l'env
utilitaire (env test …
).Dans zsh, vous pouvez désactiver une fonction intégrée avec
disable test
. Ceci est permanent (pour le shell ou le sous-shell actuel) jusqu'à ce que la fonction intégrée soit réactivée avecenable test
. En bash, vous pouvez faire de même avecenable -n test
pour désactiver etenable test
réactiver.Vous pouvez utiliser un alias ou une fonction pour forcer l'exécution d'une commande différente, par exemple
alias test=/usr/bin/test
outest () { /usr/bin/test "$@"; }
. Si vous avez un tel alias, vous pouvez empêcher son utilisation en en citant n'importe quelle partie, par exemple\test
exécutera la fonction normale / recherche intégrée / externe. Notez que selon le shell et ses paramètres, les définitions d'alias dans une fonction peuvent être développées lorsqu'une fonction est lue ou lorsqu'elle est exécutée. Si vous avez défini une fonction, vous pouvez utilisercommand test
pour empêcher la recherche de fonction ainsi que la recherche d'alias (donc ici, la fonctiontest
intégrée sera invoquée sauf si elle est désactivée).la source
env
serait pas approprié ici aussi?df
un chemin complet à la première position, supprimé l'alias 'df',which df
affiche / opt / bin / df, mais df exécute / bin / df -> busyboxwhich df
ne vous montre pas nécessairement ce quidf
fonctionne. unix.stackexchange.com/questions/85249/…