Comment le shell gère echo -n ?

Comment le shell gère echo -n ? - C - Programmation

Marsh Posté le 14-10-2015 à 15:13:28    

Bonjour,
 
Je me pose une question sur le fonctionnement de la commande echo dans un shell, plus précisément avec l'option -n.
Comment le shell fait-il pour passer à la ligne suivante sans écrire un saut de ligne ?
 

Citation :


$prompt> echo -n test
test%
$prompt>  


L'option -n permet de ne pas écrire de saut de ligne, cependant le shell doit lui sauter une ligne pour passer le prompt à a prochaine ligne, non ?
J'ai fais des tests en C ( dans un minishell que j'ai fais ) mais il y a rien à faire, je n'arrive pas à obtenir le même résultat.
 
Savez-vous comment c'est fait ?
Merci.

Reply

Marsh Posté le 14-10-2015 à 15:13:28   

Reply

Marsh Posté le 14-10-2015 à 17:08:58    

Je suis pas sur d'avoir bien pigé ta question. QQue chose comme ça?  
printf("test" );
fflush(stdout);
 
A+,


Message édité par gilou le 14-10-2015 à 17:10:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-10-2015 à 19:17:02    

Je me suis mal exprimé, imaginons un programme "my_shell" qui correspond à un shell ^^, ce dernier implémente le builtin echo.
A chaque fin de commande, le prompt s'affiche (on saute donc une ligne pour afficher le prompt sur la prochaine ligne, comme un shell normal quoi).
 

Citation :


$prompt> ./my_shell
$my_shell> pwd
/un/path/ (le shell saute une ligne a la fin de la commande pour afficher son prompt)
$my_shell> ...


 
Cependant, dans le cas de la commande echo -n, je ne comprend pas comment ça fonctionne.
 

Citation :


$my_shell> echo -n Salut
Salut% (à cette instant si le shell saute une ligne pour afficher le prompt, le "%" n'apparaît pas et ça fausse le résultat de la commande echo -n)


 
Du coup, je ne comprend pas comment le shell reprend la main après la commande echo -n, sans sauter une ligne qui comme vu plus haut, fausserai le résultat de la commande echo -n.
 
Merci gilou.


Message édité par bill g@te le 14-10-2015 à 19:17:46
Reply

Marsh Posté le 14-10-2015 à 22:31:23    

C'est comme je le pensais, c'est pas le shell, mais la commande echo, qui gère ça, en rajoutant un \n ou non à la fin selon que le -n est positionné ou non: https://gist.github.com/dchest/1091803
 
Certes, ce qui précède n'est pas le source d'une commande shell, mais d'une commande indépendante, en allant voir aussi le source du bash de gnu, on a à la fin du code:
  if (display_return)
    putchar ('\n');
ou display_return est un flag mis a 0 par l'option -n
 
A+,

Message cité 1 fois
Message édité par gilou le 14-10-2015 à 22:57:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-10-2015 à 23:03:38    

Tu mets un saut de ligne dans le prompt ?

Reply

Marsh Posté le 15-10-2015 à 14:42:28    

gilou a écrit :

C'est comme je le pensais, c'est pas le shell, mais la commande echo, qui gère ça, en rajoutant un \n ou non à la fin selon que le -n est positionné ou non: https://gist.github.com/dchest/1091803
 
Certes, ce qui précède n'est pas le source d'une commande shell, mais d'une commande indépendante, en allant voir aussi le source du bash de gnu, on a à la fin du code:
  if (display_return)
    putchar ('\n');
ou display_return est un flag mis a 0 par l'option -n
 
A+,


Oui mais dans le cas ou il ne le fait pas, soit avec le flag mis à 1, le shell doit quand à lui afficher son prompt sur la prochaine ligne, tu es d'accord ? Dans ce cas-ci le shell n'a pas le choix, il doit \n pour passer à la ligne suivante, ce qui fausse le résultat de la commande echo -n, non ?

Reply

Marsh Posté le 15-10-2015 à 14:51:23    


root@debian:~# echo toto
toto
root@debian:~# echo -n toto
totoroot@debian:~#


 
Le prompt n'est pas affiché sur la prochaine ligne dans le cas d'un echo -n. Ceci est un comportement normal.

Reply

Marsh Posté le 15-10-2015 à 17:30:51    

Oui, effectivement, mais pas essaye avec zsh comme shell.

Reply

Marsh Posté le 16-10-2015 à 11:49:01    

http://stackoverflow.com/questions [...] e-like-zsh
 
IMHO, le code de zsh vérifie la position du curseur dans la ligne courante et si elle n'est pas a 0, il imprime d'abord "%%\n"
(à partir du moment ou tu as un prompt, tu es en mode direct et non en mode script, et donc tu peux interroger la console pour déterminer la position du curseur).
 
A+,


Message édité par gilou le 16-10-2015 à 11:52:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed