Si ejecuto el test
comando en bash, test
se inicia la utilidad incorporada (evalúa la expresión condicional):
$ 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
$
Sin embargo, como se ve en el resultado type -a test
anterior, hay otro test
en el directorio / usr / local / bin y otro en el directorio / usr / bin. ¿Cómo se ordenan los ejecutables, es decir, siempre se prefieren los comandos integrados y luego el resto de los comandos dependen del orden del directorio en la variable $ PATH? Además, ¿es posible cambiar el orden de los ejecutables iniciados, por ejemplo, si escribo test
, entonces / usr / bin / test se inicia en lugar de bash-builtin test
?
bash
shell
command
shell-builtin
Martín
fuente
fuente
/usr/bin/test -f "$file"
...Respuestas:
La prioridad más alta es bash alias, luego incorporaciones especiales (solo en modo POSIX), luego funciones, luego incorporaciones, luego una búsqueda
$PATH
.Para ejecutar un builtin, use
builtin test
.Para ejecutar una aplicación externa, utilice una ruta explícita:
/bin/test
.Para ignorar funciones y alias, use
command test
.Para omitir solo el alias, use
\test
o cualquier otro tipo de expansión.Es posible deshabilitar / habilitar una función integrada con
enable test
.(Actualizado de acuerdo con los comentarios a continuación)
(Se corrigió la edición de administrador incorrecta que bash ha
disable
incorporado, de hecho, solo la hayenable
)fuente
\test
o'test'
otes't'
./
,$
, acento grave, y=
y cualquiera de los metacaracteres de shell o los caracteres entre comillas mencionados anteriormente pueden no aparecer en un nombre de alias ".Los comandos integrados siempre se prefieren a los comandos externos. La razón es que el comando incorporado es más rápido (y en algunos casos, como
cd
o , solo el comando incorporado puede tener el efecto deseado).test -o BASH_OPTION
A veces, el comando externo puede tener capacidades que el shell incorporado no tiene. En ese caso, puede llamar al comando externo dando una ruta explícita (es decir, que contenga una barra inclinada) (esto evita cualquier preocupación sobre el orden
$PATH
). Si no desea codificar la ruta externa pero desea evitar el uso de la función incorporada, puede usar"$(type -P test)"
(nota mayúsculaP
) en bash,"$(whence -p test)"
en ksh y=test
en zsh. Otra forma de forzar el uso de un comando externo es usar elcommand
builtin (command -p test …
) o pasar por laenv
utilidad (env test …
).En zsh, puede deshabilitar un incorporado con
disable test
. Esto es permanente (para el shell o subshell actual) hasta que el builtin se vuelva a habilitarenable test
. En bash, puede hacer lo mismo conenable -n test
deshabilitar yenable test
volver a habilitar.Puede usar un alias o función para forzar la ejecución de un comando diferente, por ejemplo
alias test=/usr/bin/test
otest () { /usr/bin/test "$@"; }
. Si tiene ese alias, puede evitar su uso citando cualquier parte del mismo, por ejemplo\test
, realizará la función normal / incorporado / búsqueda externa. Tenga en cuenta que dependiendo del shell y su configuración, las definiciones de alias en una función pueden expandirse cuando se lee una función o cuando se ejecuta. Si ha definido una función, puede usarlacommand test
para evitar la búsqueda de funciones, así como la búsqueda de alias (por lo que aquítest
se invocará el valor incorporado a menos que esté deshabilitado).fuente
env
sería apropiado aquí también?df
a una RUTA en la primera posición, eliminé el alias 'df',which df
muestra / opt / bin / df, pero df ejecuta / bin / df -> busyboxwhich df
no necesariamente te muestra lo que sedf
ejecuta. unix.stackexchange.com/questions/85249/…