GNU/Linux >> Tutoriels Linux >  >> Linux

Dans quel ordre les commandes canalisées s'exécutent-elles ?

Je n'ai jamais vraiment pensé à la façon dont le shell exécute réellement les commandes canalisées. On m'a toujours dit que le "stdout d'un programme est canalisé dans le stdin d'un autre », comme une façon de penser les tuyaux. Alors naturellement, j'ai pensé que dans le cas de, disons, A | B , A s'exécuterait en premier, puis B obtient la sortie standard de A , et utilise la sortie standard de A comme entrée.

Mais j'ai remarqué que lorsque les gens recherchent un processus particulier dans ps , ils incluraient grep -v "grep" à la fin de la commande pour s'assurer que grep n'apparaît pas dans la sortie finale.
Cela signifie que dans la commande ps aux | grep "bash" | grep -v "grep" il est sous-entendu que ps savait que grep était en cours d'exécution et se trouve donc dans la sortie de ps . Mais si ps termine son exécution avant que sa sortie ne soit redirigée vers grep , comment a-t-il su que grep était en cours d'exécution ?

[email protected]: ~$ ps | grep ".*"
PID TTY          TIME CMD
3773 pts/0    00:00:00 bash
3784 pts/0    00:00:00 ps
3785 pts/0    00:00:00 grep

Réponse acceptée :

Les commandes canalisées s'exécutent simultanément. Lorsque vous exécutez ps | grep … , c'est la chance du tirage au sort (ou une question de détails sur le fonctionnement du shell combiné avec un réglage fin du planificateur au plus profond du noyau) pour savoir si ps ou grep démarre en premier, et dans tous les cas, ils continuent à s'exécuter simultanément.

Ceci est très couramment utilisé pour permettre au deuxième programme de traiter les données telles qu'elles sortent du premier programme, avant que le premier programme n'ait terminé son opération. Par exemple

grep pattern very-large-file | tr a-z A-Z

commence à afficher les lignes correspondantes en majuscule avant même grep a fini de parcourir le gros fichier.

grep pattern very-large-file | head -n 1

affiche la première ligne correspondante et peut arrêter le traitement bien avant grep a fini de lire son fichier d'entrée.

Si vous lisez quelque part que les programmes canalisés s'exécutent en séquence, fuyez ce document. Les programmes canalisés s'exécutent simultanément et l'ont toujours fait.


Linux
  1. Commandes planifiées

  2. Comprendre les commandes Ssh suspectes ?

  3. Que sont les fichiers .run ?

  4. Si, sinon basé sur la commande redirigée vers grep

  5. Que signifie \b dans un modèle grep ?

Qu'est-ce que Git Bash ? Travailler avec les commandes Git Bash

Comment exécuter des commandes Linux en arrière-plan

Comment exécuter des commandes Sudo sans mot de passe

Comment exécuter les commandes sudo sans mot de passe

Comment exécuter automatiquement des commandes lors de la connexion SSH ?

Quel est l'ordre par défaut du tri Linux ?