Você pode usar o command
shell interno para ignorar o processo de pesquisa normal e executar o comando fornecido como um comando externo, independentemente de outras possibilidades (embutidos do shell, aliases, etc.). Isso geralmente é feito em scripts que precisam ser portáveis entre sistemas, embora provavelmente seja mais comum usar a abreviação \
(como em \rm
vez de command rm
ou ou rm
, pois, especialmente, o último pode estar associado a algo não conhecido rm -i
).
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Isso pode ser usado com um alias, assim:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
A vantagem disso, por exemplo, alias time=/usr/bin/time
é que você não está especificando o caminho completo para o time
binário, mas retornando ao mecanismo de busca de caminho usual.
O alias
comando em si pode entrar em, por exemplo, ~ / .bashrc ou /etc/bash.bashrc (este último é global para todos os usuários do sistema).
Para o caso oposto (forçando o uso do shell interno, caso haja um apelido definido), você usaria algo como builtin time
, que novamente substitui o processo de pesquisa usual e executa o shell interno nomeado. A página de manual do bash menciona que isso geralmente é usado para fornecer cd
funcionalidade personalizada com uma função chamada cd
, que por sua vez usa o builtin cd
para fazer a coisa real.
type -a <cmd>
.command
não ignora os componentes internos (excetozsh
quando não emula outras conchas). Ignora funções e essa é a principal razão de sua existência. Seu segundo papel é remover o especial em construções especiais . Ignora aliases e palavras-chave apenas porque eles são expandidos apenas na primeira posição (zsh
por exemplo, não ignora aliases globais). Não hátime
bash embutido.time
é uma palavra-chave que você pode fazer, por exemplotime { foo; bar; }
.command
funciona nesse caso em particular, como exemplificado, mas obviamente uma resposta correta é melhor do que a meia-direita.builtin time
não funciona'time' echo test
Há um atalho no bash para contornar as palavras-chave, sem precisar especificar um caminho ou usar outro built-in como
command
: Escape com uma barra invertida.Pessoalmente, acho isso mais legível e seguro, pois isso é possível:
fonte
time
vai fazer:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Isso se aplica a qualquer palavra-chave shell.(x_x)
As soluções gerais para embutidos (por exemplo, teste) são [1] :
use
env
(todas as conchas)desative o builtin (somente bash e zsh):
use qualquer barra
/
para chamar o comando (todos os shells):faça um alias (falha dentro de um script bash, exceto se
shopt -s expand_aliases
for usado):Mas o tempo não está incorporado.
A palavra
time
é uma "palavra reservada", não um comando e nem um interno. Isso permite essas soluções:Cite a palavra. Isso não funciona com os built-ins.
Muitas formas de citação funcionam:,
\time
"time"
'time'
ti\me
ti"me"
etc.Isso é útil para ignorar um alias. Mesmo se
test
estiver aliasado,\test
executará o comando PATHed (ou o interno, se não tiver sido desativado).Use o builtin
command
(isso não funciona com os built-ins):Como acima, para os built-ins, usar qualquer barra
/
funciona:Como acima para os built-ins, um alias também funciona aqui:
[1] Vamos supor que exista um executável externo
~/bin/test
que imprima "teste externo". E mais: vamos assumir que~/bin
está à frente/bin
no PATH ativo.fonte
Coloque isso no seu
~/.bashrc
:alias time=/usr/bin/time
fonte
Você pode usar o
enable
comando para desativar certos built-ins.No entanto,
time
é uma palavra-chave, portanto, isso não funcionará.Portanto, você cria um alias para substituí-lo:
fonte