Vous n'êtes pas identifié(e).
il renverrait le fichier texte suivant :
Le résultat est bien sûr proche de ce qu'on obtiendrait si on copiait-collait le texte du terminal après exécution du script.
Mon intention est d'ailleurs de reproduire ce comportement afin d'automatiser la copie de texte depuis le terminal.
J'ai tenté de réaliser mon idée avec bash en utilisant des tubes nommés (FIFO) grâce au script que voilà :
Hélas, le script se bloque après avoir lu la première ligne de l'entrée standard.
Il parvient cependant à exécuter la première ligne de script en entrée standard et à en rediriger la sortie vers le terminal, mais bloque immédiatement après.
Je me doute que ce comportement est lié au fonctionnement des tubes nommés, mais je n'arrive pas à mettre le doigt sur le défaut du script.
Quelqu'un a-t-il une idée ?
Dernière modification par petipatapon (08-04-2022 19:01:58)
Hors ligne
-->les cahiers du debutant<-- WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde
En ligne
Hors ligne
Ce que tu cherches à faire, si je comprends bien, peut être obtenu automatiquement avec l'option -x à bash (bash -x script).
C'est exactement ce que je voulais faire, merci !
Pour revenir au script, il y a une solution élémentaire qui marcherait pour bash - sans lancer de shell en arrière plan - que voilà :
Mais mieux vaut utiliser l'option -x car ce script ne peut gérer que les syntaxes qui tiennent sur une seule ligne.
Hors ligne
obligé de faire CTRL+C pour arrêter cat.
Edit : Pour vraiment illustrer
Dernière modification par Tawal (07-04-2022 21:20:32)
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
Ici, echo se bloque. Or echo se contente d'écrire dans un fichier, il n'attend pas de trouver le caractère EOF. Il devrait simplement écrire son texte dan le tube FIFO et se terminer, non ? Et pourquoi se débloque-t-il lorsqu'on cat le contenu du tube depuis un autre terminal.
2) Dans ton exemple, echo n'est pas bloquant, alors qu'il réalise exactement la mếme opération d'écriture dans le tube que dans l'exemple précédent. Je me doute que ce comportement résulte de la redirection $ exec 6<>fifo_file 4>fifo_file 5<fifo_file 6>&-. En particulier de 6<>fifo_file dont j'ignore la fonction. Que fait-elle ? Et pourquoi echo n'est-il pas bloquant quand on l'utilise ?
Dernière modification par petipatapon (08-04-2022 19:00:40)
Hors ligne
fait ceci :
- 6<>fifo_file : ouvre en écriture et lecture le descripteur fd6 vers fifo_file.
- 4>fifo_file : ouvre en écriture le descripteur fd4 vers fifo_file.
- 5<fifo_file : ouvre en lecture le descripteur fd5 vers fifo_file.
- 6>&- : ferme le fd6.
En fait, un tube nommé a besoin d'être ouvert en écriture ET en lecture pour être "non-bloquant" (6<>fifo_file).
Ensuite on peut écrire et lire "à volonté", mais autant définir un descripteur pour chaque flux (4>fifo_file et 5<fifo_file).
Puis, le fd 6 devient inutile, autant le fermer (6>&-). Et puis, c'est pas très bon à l'usage un descripteur ouvert dans les 2 sens.
J'espère avoir été assez clair
Edit:
Tu peux aussi ouvrir un fifo ainsi:
echo est "bloquant" mais est mis en arrière plan et ouvre en écriture le fifo, puis on ouvre en lecture le fifo (exec 5<fifo_file)
Là, on peut tranquillement définir un fd pour l'écriture (sans être "bloquant").
Edit2:
On pourrait faire une analogie avec le web.
Tu envoies une donnée que si tu es sûr d'avoir un aboutissant, le tube c'est pareil, le shell attend qu'il y ait une entrée et une sortie.
Dernière modification par Tawal (08-04-2022 21:32:00)
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
parce que les redirections sont faites de façon successive, de sorte que le tube soit bloquant après 4>fifo_file et n'exécute jamais 5<fifo_file. Il n'est donc ouvert qu'en écriture et bloque.
C'est pourquoi on doit l'ouvrir temporairement en lecture et en écriture avec le descripteur six, juste le temps d'effectuer les autres redirections. Puis, on peut fermer le descripteur 6 sans bloquer le tube vu qu'il est ouvert en lecture par le descripteur 5 et en écriture par 4.
Hors ligne
Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
Hors ligne