Usando o comando "time" interno no bash, em vez do comando externo

12

Trabalhando com o timecomando, me deparei com uma situação em que eu deveria usar o timecomando de tempo GNU interno e não externo /usr/bin/time. Então, como posso fazer isso? Vi em algum lugar que o uso enablee / ou commandajudaria, mas eles não ajudaram.

Este é um caso de uso:

watch "time ls"

que usa o /usr/bin/timecomando externo , que eu não quero! Isso acontece quando timeinvoca a função bash interna quando eu corro time lsem um terminal, assim:

$ time ls

Observe que a solicitação exatamente oposta foi respondida aqui:

Há muita diferença com dois comandos. O interno timeé mais preciso (o que eu quero), mas o comando externo tem mais opções (o que eu não preciso).

Ho1
fonte
watch 'bash -c "builtin time ls"'possivelmente?
Glenn Jackman
1
veja aqui como forçar o bash a usar builtins, veja a resposta 2 de Petr Utzl: builtin timedeve fazer o truque.
Fiximan
2
@Fiximan, timenão é um embutido no bash, é uma palavra reservada da língua para que você possa tempo pipelines (como time foo | bar) ou comandos compostos (como time for i in...;done)
Stéphane Chazelas

Respostas:

13

Por padrão, watchexecuta seu comando com, /bin/sh -c '...'portanto, a saída que você vê é como /bin/shinterpreta o timecomando. Seu /bin/shaparentemente não tem um builtin time.

Para executar o comando com um shell diferente, use a -xopção para se livrar do padrão e, em seguida, adicione sua própria chamada explícita do shell cujo built-in você deseja.

watch -x bash -c 'time ls'
watch -x zsh -c 'time ls'

Não importa como você executa watch, o comando que você está assistindo não é filho do shell que executou o watchcomando, de modo que as configurações do shell não são diretamente relevantes.

Stéphane Chazelas
fonte