Quelle est la différence entre les commandes de diffusion et d’exécution séquentiellement?

run est un fichier qui traite une entrée de stdin et affiche un résultat sur stdout

quand j’écris:

$ ./run  actual.json $ diff out.json actual.json 

Je comprends qu’il n’y a pas de différence

alors quand j’écris:

 $ ./run  actual.json | diff out.json actual.json 

Je m’attends à ce qu’il n’y ait pas de différence mais à la place, il y a une différence qui est tout dans out.json

Quelle est la différence entre ces deux commandes? D’après ce que je comprends, la commande (|) exécute la commande sur la gauche, puis la commande sur la droite, donc elles doivent être les mêmes.

D’après ce que je comprends, la commande (|) exécute la commande sur la gauche, puis la commande sur la droite, donc elles doivent être les mêmes.

C’est complètement faux.

Les deux programmes sont exécutés en même temps; la sortie du premier est redirigée vers l’entrée du second.

Cela signifie que dans votre

 $ ./run < in.json > actual.json | diff out.json actual.json 

diff est démarré lorsque actual.json n’est pas écrit, donc vide, donc out.json est nouveau.

Vous pouvez laisser le diff commencer lorsque ./run est terminé.

./run actual.json; diff out.json actual.json

Lorsque vous utilisez uniquement actual.json pour votre diff, vous pouvez le faire

 diff out.json <(./run < in.json) 

EDIT: Comme suggéré par @Glenn, j'ai supprimé des exemples non pertinents.