Como desativar uma palavra-chave do shell?

4

Usando o comando enable builtin, podemos desativar um comando interno do shell, por exemplo echo , da seguinte forma:

enable -n echo

Mas como podemos desabilitar uma palavra-chave do shell como time ? Se nós tentarmos:

enable -n time

receberemos a seguinte "resposta":

bash: enable: time: not a shell builtin

Nota : Eu sei como executar o time que está em /usr/bin , então eu só quero saber se é possível realizar o que eu pedi no título.

    
por Radu Rădeanu 05.08.2014 / 12:57

5 respostas

6

Você pode fazer:

alias time='"time" '

(o espaço à direita é para permitir a expansão de apelidos depois disso, como um bônus).

Citar uma palavra-chave (palavras-chave que fazem parte da sintaxe da linguagem shell) impede que ela seja interpretada como uma palavra-chave, portanto, aqui, a consulta normal do comando é executada nela.

Funciona em bash , zsh , mksh , mas não ksh93 , ash ou yash .

Observe que, para instâncias bash não interativas (como em scripts), você precisa de shopt -s expand_aliases , pois, ao contrário de outros shells, bash não expande aliases por padrão quando não é interativo.

    
por 05.08.2014 / 13:20
2

Como você descobriu, não é possível desativar uma palavra-chave com enable -n .

No entanto, você pode criar uma palavra-chave com oenable -f e desabilitá-la:

  • descompacte as fontes da sua versão atual de bash
  • ./configure && make
  • Em examples/loadables , você encontrará vários exemplos de builtins carregáveis, edite um deles, por exemplo, o sync one para substituir todas as instâncias de sync por time .
  • execute make em examples/loadables .
  • Em bash , execute enable -f ./sync time .
  • enable -n time agora funciona. E help mostra: *time (além de time [-p] pipeline )

(não que isso nunca será útil para ninguém).

    
por 05.08.2014 / 14:35
1

Em vez de desabilitar a palavra-chave, se você puder chamá-la sem que o analisador do shell a encontre na posição do comando - ou na primeira palavra em um comando simples - você poderá executá-la sem problemas. O comando especificado em POSIX command foi projetado para fazer exatamente isso. Então você pode, por exemplo, chamar um comando chamado time like:

command time

Isso funciona em qualquer shell, tanto quanto eu posso dizer. É estranho, no entanto, que muitos pareçam lidar com isso de maneira diferente. Aqui está uma demonstração:

echo 'echo "$0"' >./time
chmod +x ./time
for sh in dash ksh zsh bash yash 'busybox ash' posh mksh
do  command -p $sh -c '
    PATH=.:$PATH
    printf "\n%s\n" "$0"
    time
    command time' "$sh"
done 

OUTPUT

dash
./time
./time

ksh
user    0m0.00s
sys     0m0.00s
time

zsh
shell  0.00s user 0.00s system 71% cpu 0.005 total
children  0.00s user 0.00s system 0% cpu 0.005 total
time

bash

real    0m0.000s
user    0m0.000s
sys     0m0.000s
./time

yash
./time
./time

busybox ash
./time
./time

posh
./time
./time

mksh
    0m0.00s user     0m0.00s system
./time
    
por 29.08.2014 / 22:00
0

No zsh, você pode desativar palavras-chave reservadas com o sinalizador -r .

    
por 28.12.2017 / 15:27
-2

Você não pode desativá-lo, mas pode ocultá-lo com uma função. Use a risco próprio.

shell_builtin() {
    :  ## Do nothing.
}

Para ativá-lo de volta, basta desmarcá-lo:

unset shell_builtin
    
por 05.08.2014 / 13:09