Bash traite le intégré time
comme 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 time
d'ê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 time
sans commande. D'où l'erreur.
Notez que la ligne de commande time
ne 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/time
refuse ensuite d'exécuter sans argument. Notez que c'est une erreur de /usr/bin/time
pas 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 time
pas 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 time
c'est interprété comme la commande, pas comme un mot précédent.
Donc bash exécute alors sa commande interne time
sans 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 time
intégrée, c'est-à-dire qu'il exécute tout ce que la fonction time
intégrée produit sur stdout. Mais comme time
il 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;date
vsdate;time
. Cela semble être un problème avec le pipeline entrantbash
et le dernier caractère généré avec latime
sortie. 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]