Se eu executar o test
comando no bash, o test
utilitário interno (avalia expressão condicional) é iniciado:
$ 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
$
No entanto, como visto na saída type -a test
acima, existe outro test
diretório / usr / local / bin e outro diretório / usr / bin. Como os executáveis são ordenados, ou seja, os comandos internos são sempre preferidos e o restante dos comandos depende da ordem do diretório na variável $ PATH? Além disso, é possível alterar a ordem dos executáveis iniciados, por exemplo, se eu digitar test
, / usr / bin / test será iniciado em vez do bash-builtin test
?
bash
shell
command
shell-builtin
Martin
fonte
fonte
/usr/bin/test -f "$file"
...Respostas:
A prioridade mais alta é o alias do bash, depois os embutidos especiais (apenas no modo POSIX), depois as funções, os embutidos e, em seguida, uma pesquisa
$PATH
.Para executar um builtin, use
builtin test
.Para executar uma aplicação externa, use um caminho explícito:
/bin/test
.Para ignorar funções e aliases, use
command test
.Para ignorar apenas alias, use
\test
ou qualquer outro tipo de expansão.É possível desativar / ativar um builtin com
enable test
.(Atualizado de acordo com os comentários abaixo)
(Corrigida a edição incorreta do administrador que o bash havia
disable
incorporado - na verdade, existe apenasenable
)fonte
\test
ou'test'
outes't'
./
,$
, crase, e=
e qualquer um dos metacaracteres do shell ou caracteres de citação listados acima pode não aparecer em um nome alternativo ".Os comandos internos são sempre preferidos aos comandos externos. A lógica é que o comando interno é mais rápido (e, em alguns casos, como
cd
ou , apenas o comando interno pode ter o efeito desejado).test -o BASH_OPTION
Às vezes, o comando externo pode ter recursos que o shell interno não possui. Nesse caso, você pode chamar o comando externo, fornecendo um caminho explícito (ou seja, contendo uma barra) (isso ignora qualquer preocupação com a ordem em
$PATH
). Se você não deseja codificar o caminho externo, mas deseja impedir o uso do built-in, use"$(type -P test)"
(note capitalP
) no bash,"$(whence -p test)"
no ksh e=test
no zsh. Outra maneira de forçar o uso de um comando externo é usar ocommand
builtin (command -p test …
) ou passar peloenv
utilitário (env test …
).No zsh, você pode desativar um builtin com
disable test
. Isso é permanente (para o shell ou subshell atual) até que o builtin seja reativadoenable test
. No bash, você pode fazer o mesmo comenable -n test
para desativar eenable test
reativar.Você pode usar um alias ou função para forçar a execução de um comando diferente, por exemplo
alias test=/usr/bin/test
outest () { /usr/bin/test "$@"; }
. Se você tiver esse apelido, poderá impedir seu uso citando qualquer parte dele, por exemplo\test
, executará a função normal / pesquisa interna / externa. Observe que, dependendo do shell e de suas configurações, as definições de alias em uma função podem ser expandidas quando uma função é lida ou quando é executada. Se você definiu uma função, podecommand test
evitar a pesquisa de funções, bem como a pesquisa de alias (portanto, aqui otest
builtin será chamado, a menos que seja desativado).fonte
env
seria apropriado aqui também?df
a um PATH na primeira posição, removi o apelido 'df',which df
mostra / opt / bin / df, mas o df roda / bin / df -> busyboxwhich df
não mostra necessariamente o quedf
é executado. unix.stackexchange.com/questions/85249/…