Bash “time” embutido em string não é executado

1
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

O que está acontecendo aqui? Não é uma questão de shell builtins não funcionar, porque isso funciona:

$ cmd2='echo wef'
$ $cmd2
wef

Alguma idéia?

Edit: eu encontrei uma diferença:

$ type time
time is a shell keyword

Vs:

$ type echo
echo is a shell builtin

Então a questão agora é - por que um trabalho embutido em uma string e uma palavra-chave não funciona?

    
por ACK_stoverflow 21.06.2017 / 21:47

2 respostas

2

time como uma palavra-chave GNU Bash tem uma localização muito específica onde é aceita, veja por exemplo a sintaxe para uma construção de pipeline de comando:

The format for a pipeline is [time [-p]] [!] command1 [| command2 ...]

Isto faz o hardcode da posição da palavra-chave fora das expansões (como commandN será onde os parâmetros e variáveis serão expandidos). De fato, também a semântica se aplica a todo o pipeline, não ao comando, então provavelmente é por isso que deve ser uma palavra-chave.

Há um shell integrado em times (em POSIX a especial interno ), para isso a expansão funciona já que a primeira palavra pode ser um executável ou um shell embutido.

Como alternativa, GNU coreutils contém um executável /bin/time .

Na verdade, time não é palavra reservada em POSIX Shell (embora o bash o reconheça no modo posix de qualquer maneira ( a menos que um - seja seguido por razões não óbvias)).

Dentro de uma expressão eval , as palavras-chave são reconhecidas por bash , portanto, isso pode ser usado para aprimorar dinamicamente comandos com a criação de perfil de tempo. (No entanto, por outro lado, exige uma rodada adicional de cotação)

    
por 21.06.2017 / 22:23
0

Em vez de usar cmd = 'time sleep 2', tente usá-lo como cmd = '/ usr / bin / time sleep 2' para obter o comando em tempo real.

Você pode ler o seguinte no tempo do homem:

Os usuários do shell bash precisam usar um caminho explícito para executar   o comando de tempo externo e não a variante integrada do shell. No sistema   onde o tempo é instalado em / usr / bin, o primeiro exemplo se tornaria        / usr / bin / time wc / etc / hosts

    
por 21.06.2017 / 23:19