Bash traite le intégré timecomme un cas spécial lors de l'analyse des lignes de commande.
Comme on peut le lire dans la page de manuel bash, la ligne telle qu'elle est tapée est d'abord divisée en une liste:
pipeline ; pipeline
où un pipeline est:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
ou dans notre cas, simplement:
time command
c'est-à-dire si le temps est présent, alors la commande doit également être présente.
[Il y a un cas particulier qui permet timed'être suivi d'une nouvelle ligne, mais cela ne s'applique pas ici]
Donc, dans notre cas, nous avons:
time;date
étant divisé en deux pipelines:
1. time
2. date
et le pipeline 1 n'est pas bien formé, car nous avons timesans commande. D'où l'erreur.
Notez que la ligne de commande timene fonctionne pas non plus ici:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analyse cela comme prévu, en 2 pipelines:
1. /usr/bin/time
2. date
et /usr/bin/timerefuse ensuite d'exécuter sans argument. Notez que c'est une erreur de /usr/bin/timepas une erreur de bash.
La raison pour laquelle le back-tick fonctionne est que le back-tick cesse d' timeêtre interprété comme un élément spécial dans le pipeline.
c'est à dire avec le back-tick:
`time`;date
il est analysé comme deux pipelines:
1. `time`
2. date
N'oubliez pas qu'un pipeline, dans notre cas, c'est:
[time] command
et le problème était que nous n'avions timepas de commande, ce qui n'est pas autorisé. Mais maintenant, nous avons simplement la commande:
`time`
sans le précédent time, car les tics inversés signifient que timec'est interprété comme la commande, pas comme un mot précédent.
Donc bash exécute alors sa commande interne timesans args, ce qui est accepté. Il ne produit aucune sortie et nous ne voyons aucune erreur.
Notez que:
`time`
exécute en fait le résultat de la fonction timeintégrée, c'est-à-dire qu'il exécute tout ce que la fonction timeintégrée produit sur stdout. Mais comme timeil n'écrit rien à lui seul, il semble fonctionner.
Enfin, il a été noté que cela fonctionne:
time ; ; date
ce que je ne peux pas expliquer, malheureusement :)
time;datevsdate;time. Cela semble être un problème avec le pipeline entrantbashet le dernier caractère généré avec latimesortie. Les résultats testés dans différents émulateurs de terminal sont les suivants: - [Bash] $ date; heure # [OK] $ heure; date # [ NotOK ] bash: erreur de syntaxe près du jeton inattendu `date '$ heure # seule erreur n'apparaît pas qu'il s'agit du résultat de n'importe quelle date. - [Csh] $ date; heure # [OK] $ heure; date # [OK] - [Tcsh] $ date; heure # [OK] $ heure; date # [OK] - [Ksh] $ date; heure # [ OK] $ heure; date # [OK]