Utiliser la commande «time» intégrée dans bash plutôt que la commande externe

12

En travaillant avec la timecommande, je suis tombé sur une situation où je devrais utiliser la commande intégrée timeplutôt que la commande externe GNU time /usr/bin/time. Alors, comment puis-je faire cela? J'ai vu quelque part que l'utilisation enableet / ou commandaiderait, mais ils ne l'ont pas fait.

Ceci est un cas d'utilisation:

watch "time ls"

qui utilise la /usr/bin/timecommande externe , dont je ne veux pas! Cela se produit lorsque timej'appelle la fonction bash interne lorsque j'exécute time lssur un terminal, comme ceci:

$ time ls

Veuillez noter que la demande opposée exacte a été répondue ici:

Il y a beaucoup de différence avec deux commandes. L'intérieur timeest plus précis (ce que je veux), mais la commande externe a plus d'options (dont je n'ai pas besoin).

Ho1
la source
watch 'bash -c "builtin time ls"'peut-être?
glenn jackman
1
voir ici comment forcer bash à utiliser des builtins, voir la réponse2 de Petr Utzl: builtin timedevrait faire l'affaire.
Fiximan
2
@Fiximan, timen'est pas une fonction intégrée bash, c'est un mot réservé du langage, vous pouvez donc chronométrer les pipelines (comme time foo | bar) ou les commandes composées (comme time for i in...;done)
Stéphane Chazelas

Réponses:

13

Par défaut, watchexécute votre commande avec /bin/sh -c '...'la sortie que vous voyez est la façon dont /bin/shinterprète la timecommande. Votre /bin/shapparemment n'a pas de fonction intégrée time.

Pour exécuter la commande avec un autre shell, utilisez l' -xoption pour supprimer la valeur par défaut, puis ajoutez votre propre invocation explicite du shell dont vous voulez la construction.

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

Peu importe comment vous exécutez watch, la commande que vous regardez n'est pas un enfant du shell qui a exécuté la watchcommande, de sorte que les paramètres du shell ne sont pas directement pertinents.

Stéphane Chazelas
la source