Quebra automática 'time' (e palavras-chave semelhantes) na chamada de outro script

2

Eu tenho um script de Bash (vamos chamá-lo de clock ), que deve funcionar como um wrapper semelhante à palavra-chave time no Bash, por exemplo, clock ls deve fazer alguma coisa e, em seguida, executar ls . Aqui está um exemplo desse script:

#!/bin/bash
echo "do something"
$@

Observe que ele não usa exec para permitir a incorporação de elementos internos.

No entanto, quando o argumento para encapsular é a palavra-chave time , ele não funciona como esperado: a saída mostra que ele executa o comando /usr/bin/time , não a palavra-chave shell.

Como posso fazer meu script wrapper tratar palavras-chave (como time ) exatamente como se elas tivessem sido digitadas diretamente no shell?

Observação : na minha pergunta relacionada , aprendi como fazer isso funcionar quando clock era uma função Bash no mesmo script, mas no meu caso de uso real, clock é na verdade um script Bash em si, então a solução anterior não funciona. Além disso, as soluções mencionadas na questão relacionada (usando $@ diretamente ou executando exec bash -c ""$@"" ) não funcionam neste caso.

Uma solução parcial que encontrei foi usar eval $@ , mas é muito pouco confiável. Ele funciona neste caso simples com time , mas falha em muitas situações, como em clock ls '~$Document1' .

    
por anol 21.04.2015 / 20:01

1 resposta

0

Pelo que me lembro, o bash tem o comando builtin , que o força a executar, você adivinhou, o comando interno, mesmo que haja um arquivo em PATH com o mesmo nome.

Eu testei, fazendo este script em /usr/bin :

#!/bin/bash
echo "This is /usr/bin/cd, and it does nothing"

E aqui estão os resultados:

jarmund@jarmint/etc$ /usr/bin/cd ~
This is /usr/bin/cd, and it does nothing
jarmund@jarmint/etc$ builtin cd ~
jarmund@jarmint~$ 

Conclusão: prefixar seu comando com builtin deve remover qualquer ambiguidade que o shell possa estar experimentando.

    
por 21.04.2015 / 20:30