Print something in console in the same place of the previous echo, with a sort of negative echo

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















In bash you can cast a command named clear to clear all the screen commands.



And with echo you can print whatever you want onscreen..



In my simple scripts I often have the need of print a percentage of what's being done with my commands..



So I could do something like..



echo "89%"
echo "90%"
echo "91%"


and so on..



what I hate is getting the screen full of percent updates...



89%
90%
91%
...


what I would like is to learn if there's a special character combination (eg. "33[01;31m") that could be echoed with bash or php echo and tells the console "remove the last previous printed character.."



doing so by using something like: (php example)



echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;


I would get the new string printed at the exact position of the previous one without have the screen full of lines



Otherwise I look for an approach to do the same in other ways always using bash and php scripts (please include actual working examples at least with a debian9 console and php7)










share|improve this question






























    6















    In bash you can cast a command named clear to clear all the screen commands.



    And with echo you can print whatever you want onscreen..



    In my simple scripts I often have the need of print a percentage of what's being done with my commands..



    So I could do something like..



    echo "89%"
    echo "90%"
    echo "91%"


    and so on..



    what I hate is getting the screen full of percent updates...



    89%
    90%
    91%
    ...


    what I would like is to learn if there's a special character combination (eg. "33[01;31m") that could be echoed with bash or php echo and tells the console "remove the last previous printed character.."



    doing so by using something like: (php example)



    echo str_repeat($neg_character, strlen($last_percentage_update_string));
    echo $new_percentage_update_string;


    I would get the new string printed at the exact position of the previous one without have the screen full of lines



    Otherwise I look for an approach to do the same in other ways always using bash and php scripts (please include actual working examples at least with a debian9 console and php7)










    share|improve this question


























      6












      6








      6


      5






      In bash you can cast a command named clear to clear all the screen commands.



      And with echo you can print whatever you want onscreen..



      In my simple scripts I often have the need of print a percentage of what's being done with my commands..



      So I could do something like..



      echo "89%"
      echo "90%"
      echo "91%"


      and so on..



      what I hate is getting the screen full of percent updates...



      89%
      90%
      91%
      ...


      what I would like is to learn if there's a special character combination (eg. "33[01;31m") that could be echoed with bash or php echo and tells the console "remove the last previous printed character.."



      doing so by using something like: (php example)



      echo str_repeat($neg_character, strlen($last_percentage_update_string));
      echo $new_percentage_update_string;


      I would get the new string printed at the exact position of the previous one without have the screen full of lines



      Otherwise I look for an approach to do the same in other ways always using bash and php scripts (please include actual working examples at least with a debian9 console and php7)










      share|improve this question
















      In bash you can cast a command named clear to clear all the screen commands.



      And with echo you can print whatever you want onscreen..



      In my simple scripts I often have the need of print a percentage of what's being done with my commands..



      So I could do something like..



      echo "89%"
      echo "90%"
      echo "91%"


      and so on..



      what I hate is getting the screen full of percent updates...



      89%
      90%
      91%
      ...


      what I would like is to learn if there's a special character combination (eg. "33[01;31m") that could be echoed with bash or php echo and tells the console "remove the last previous printed character.."



      doing so by using something like: (php example)



      echo str_repeat($neg_character, strlen($last_percentage_update_string));
      echo $new_percentage_update_string;


      I would get the new string printed at the exact position of the previous one without have the screen full of lines



      Otherwise I look for an approach to do the same in other ways always using bash and php scripts (please include actual working examples at least with a debian9 console and php7)







      linux bash php console






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 24 '18 at 9:17







      user3450548

















      asked Aug 23 '18 at 10:14









      user3450548user3450548

      1,03941431




      1,03941431




















          1 Answer
          1






          active

          oldest

          votes


















          18














          The typical way of doing this is not to erase a single character, but to go back to the start of the line using a carriage return (r):



          printf "89%%"; sleep 1; printf "r90%%n"


          Note that this doesn’t clear the line, so you need to take care of that if necessary. Simple options are adding spaces to the end, or making the output fixed-width (e.g. printf "%2d%%n" 1 gives a leading space).



          There are terminal escapes which will allow you to move around and clear parts of the screen, the CSI sequences, but they are terminal-dependent (although in practice VT100 escapes are supported everywhere now). For example



          printf "89%%"; sleep 1; printf "e[3D90%%n"


          uses ␛[3D to move three characters to the left, and writes over them (assuming your printf supports e);



          printf "89%% hello"; sleep 1; printf "e[0Ee[K90%%n"


          uses ␛[0E to move to the beginning of the current line, and ␛[K to clear to the end of the line (assuming your terminal supports those sequences).



          tput provides a terminal- and printf-agnostic way of accessing these sequences:



          printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%n"


          will move the cursor to the left three times (cub 3) and clear to the end of the line (el), using whatever character sequence is appropriate for the current terminal;



          printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%n"


          will move the cursor to the left-most column (hpa 0) and clear to the end of the line.



          man terminfo will tell you what “capability name” to use with tput.



          (Note that a lot of the specifics of the examples above assume that all your output is on the same line. They’re not supposed to be fool-proof, only to illustrate various approaches.)



          For similar screen control in PHP scripts, you could look at the PECL ncurses extension.






          share|improve this answer




















          • 5





            One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

            – Stéphane Chazelas
            Aug 23 '18 at 10:29












          • 1. e isnt portable 2. neither is e[0E

            – Steven Penny
            Aug 23 '18 at 11:37











          • Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

            – Stephen Kitt
            Aug 23 '18 at 11:40











          • One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

            – JdeBP
            Aug 23 '18 at 16:53











          • Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

            – Stephen Kitt
            Aug 23 '18 at 16:55











          Your Answer








          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "106"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f464357%2fprint-something-in-console-in-the-same-place-of-the-previous-echo-with-a-sort-o%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          18














          The typical way of doing this is not to erase a single character, but to go back to the start of the line using a carriage return (r):



          printf "89%%"; sleep 1; printf "r90%%n"


          Note that this doesn’t clear the line, so you need to take care of that if necessary. Simple options are adding spaces to the end, or making the output fixed-width (e.g. printf "%2d%%n" 1 gives a leading space).



          There are terminal escapes which will allow you to move around and clear parts of the screen, the CSI sequences, but they are terminal-dependent (although in practice VT100 escapes are supported everywhere now). For example



          printf "89%%"; sleep 1; printf "e[3D90%%n"


          uses ␛[3D to move three characters to the left, and writes over them (assuming your printf supports e);



          printf "89%% hello"; sleep 1; printf "e[0Ee[K90%%n"


          uses ␛[0E to move to the beginning of the current line, and ␛[K to clear to the end of the line (assuming your terminal supports those sequences).



          tput provides a terminal- and printf-agnostic way of accessing these sequences:



          printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%n"


          will move the cursor to the left three times (cub 3) and clear to the end of the line (el), using whatever character sequence is appropriate for the current terminal;



          printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%n"


          will move the cursor to the left-most column (hpa 0) and clear to the end of the line.



          man terminfo will tell you what “capability name” to use with tput.



          (Note that a lot of the specifics of the examples above assume that all your output is on the same line. They’re not supposed to be fool-proof, only to illustrate various approaches.)



          For similar screen control in PHP scripts, you could look at the PECL ncurses extension.






          share|improve this answer




















          • 5





            One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

            – Stéphane Chazelas
            Aug 23 '18 at 10:29












          • 1. e isnt portable 2. neither is e[0E

            – Steven Penny
            Aug 23 '18 at 11:37











          • Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

            – Stephen Kitt
            Aug 23 '18 at 11:40











          • One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

            – JdeBP
            Aug 23 '18 at 16:53











          • Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

            – Stephen Kitt
            Aug 23 '18 at 16:55















          18














          The typical way of doing this is not to erase a single character, but to go back to the start of the line using a carriage return (r):



          printf "89%%"; sleep 1; printf "r90%%n"


          Note that this doesn’t clear the line, so you need to take care of that if necessary. Simple options are adding spaces to the end, or making the output fixed-width (e.g. printf "%2d%%n" 1 gives a leading space).



          There are terminal escapes which will allow you to move around and clear parts of the screen, the CSI sequences, but they are terminal-dependent (although in practice VT100 escapes are supported everywhere now). For example



          printf "89%%"; sleep 1; printf "e[3D90%%n"


          uses ␛[3D to move three characters to the left, and writes over them (assuming your printf supports e);



          printf "89%% hello"; sleep 1; printf "e[0Ee[K90%%n"


          uses ␛[0E to move to the beginning of the current line, and ␛[K to clear to the end of the line (assuming your terminal supports those sequences).



          tput provides a terminal- and printf-agnostic way of accessing these sequences:



          printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%n"


          will move the cursor to the left three times (cub 3) and clear to the end of the line (el), using whatever character sequence is appropriate for the current terminal;



          printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%n"


          will move the cursor to the left-most column (hpa 0) and clear to the end of the line.



          man terminfo will tell you what “capability name” to use with tput.



          (Note that a lot of the specifics of the examples above assume that all your output is on the same line. They’re not supposed to be fool-proof, only to illustrate various approaches.)



          For similar screen control in PHP scripts, you could look at the PECL ncurses extension.






          share|improve this answer




















          • 5





            One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

            – Stéphane Chazelas
            Aug 23 '18 at 10:29












          • 1. e isnt portable 2. neither is e[0E

            – Steven Penny
            Aug 23 '18 at 11:37











          • Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

            – Stephen Kitt
            Aug 23 '18 at 11:40











          • One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

            – JdeBP
            Aug 23 '18 at 16:53











          • Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

            – Stephen Kitt
            Aug 23 '18 at 16:55













          18












          18








          18







          The typical way of doing this is not to erase a single character, but to go back to the start of the line using a carriage return (r):



          printf "89%%"; sleep 1; printf "r90%%n"


          Note that this doesn’t clear the line, so you need to take care of that if necessary. Simple options are adding spaces to the end, or making the output fixed-width (e.g. printf "%2d%%n" 1 gives a leading space).



          There are terminal escapes which will allow you to move around and clear parts of the screen, the CSI sequences, but they are terminal-dependent (although in practice VT100 escapes are supported everywhere now). For example



          printf "89%%"; sleep 1; printf "e[3D90%%n"


          uses ␛[3D to move three characters to the left, and writes over them (assuming your printf supports e);



          printf "89%% hello"; sleep 1; printf "e[0Ee[K90%%n"


          uses ␛[0E to move to the beginning of the current line, and ␛[K to clear to the end of the line (assuming your terminal supports those sequences).



          tput provides a terminal- and printf-agnostic way of accessing these sequences:



          printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%n"


          will move the cursor to the left three times (cub 3) and clear to the end of the line (el), using whatever character sequence is appropriate for the current terminal;



          printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%n"


          will move the cursor to the left-most column (hpa 0) and clear to the end of the line.



          man terminfo will tell you what “capability name” to use with tput.



          (Note that a lot of the specifics of the examples above assume that all your output is on the same line. They’re not supposed to be fool-proof, only to illustrate various approaches.)



          For similar screen control in PHP scripts, you could look at the PECL ncurses extension.






          share|improve this answer















          The typical way of doing this is not to erase a single character, but to go back to the start of the line using a carriage return (r):



          printf "89%%"; sleep 1; printf "r90%%n"


          Note that this doesn’t clear the line, so you need to take care of that if necessary. Simple options are adding spaces to the end, or making the output fixed-width (e.g. printf "%2d%%n" 1 gives a leading space).



          There are terminal escapes which will allow you to move around and clear parts of the screen, the CSI sequences, but they are terminal-dependent (although in practice VT100 escapes are supported everywhere now). For example



          printf "89%%"; sleep 1; printf "e[3D90%%n"


          uses ␛[3D to move three characters to the left, and writes over them (assuming your printf supports e);



          printf "89%% hello"; sleep 1; printf "e[0Ee[K90%%n"


          uses ␛[0E to move to the beginning of the current line, and ␛[K to clear to the end of the line (assuming your terminal supports those sequences).



          tput provides a terminal- and printf-agnostic way of accessing these sequences:



          printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%n"


          will move the cursor to the left three times (cub 3) and clear to the end of the line (el), using whatever character sequence is appropriate for the current terminal;



          printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%n"


          will move the cursor to the left-most column (hpa 0) and clear to the end of the line.



          man terminfo will tell you what “capability name” to use with tput.



          (Note that a lot of the specifics of the examples above assume that all your output is on the same line. They’re not supposed to be fool-proof, only to illustrate various approaches.)



          For similar screen control in PHP scripts, you could look at the PECL ncurses extension.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Aug 23 '18 at 19:07

























          answered Aug 23 '18 at 10:16









          Stephen KittStephen Kitt

          181k25414493




          181k25414493







          • 5





            One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

            – Stéphane Chazelas
            Aug 23 '18 at 10:29












          • 1. e isnt portable 2. neither is e[0E

            – Steven Penny
            Aug 23 '18 at 11:37











          • Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

            – Stephen Kitt
            Aug 23 '18 at 11:40











          • One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

            – JdeBP
            Aug 23 '18 at 16:53











          • Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

            – Stephen Kitt
            Aug 23 '18 at 16:55












          • 5





            One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

            – Stéphane Chazelas
            Aug 23 '18 at 10:29












          • 1. e isnt portable 2. neither is e[0E

            – Steven Penny
            Aug 23 '18 at 11:37











          • Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

            – Stephen Kitt
            Aug 23 '18 at 11:40











          • One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

            – JdeBP
            Aug 23 '18 at 16:53











          • Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

            – Stephen Kitt
            Aug 23 '18 at 16:55







          5




          5





          One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

          – Stéphane Chazelas
          Aug 23 '18 at 10:29






          One can usually use tput cub 3 to move the cursor back by 3 columns without having to hardcode the sequence (and tput el to erase the line).

          – Stéphane Chazelas
          Aug 23 '18 at 10:29














          1. e isnt portable 2. neither is e[0E

          – Steven Penny
          Aug 23 '18 at 11:37





          1. e isnt portable 2. neither is e[0E

          – Steven Penny
          Aug 23 '18 at 11:37













          Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

          – Stephen Kitt
          Aug 23 '18 at 11:40





          Thanks @Steven, I’d mentioned that the sequences were terminal-dependent but I’ve added some more qualifiers.

          – Stephen Kitt
          Aug 23 '18 at 11:40













          One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

          – JdeBP
          Aug 23 '18 at 16:53





          One could use ech for erasure. And moving backwards by 3 positions has a gotcha, and two possible optimizations that full-screen programs tend to use. But both optimizations and erasure are overkill for simple current-line-only terminal stuff, when one follows that advice to use a fixed-width format specifier. Don't forget that 100 is 3 digits long, by the way. (-:

          – JdeBP
          Aug 23 '18 at 16:53













          Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

          – Stephen Kitt
          Aug 23 '18 at 16:55





          Good points @JdeBP, thanks. Once you hit 100%, I sure hope you no longer need progress updates ;-).

          – Stephen Kitt
          Aug 23 '18 at 16:55

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Unix & Linux Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f464357%2fprint-something-in-console-in-the-same-place-of-the-previous-echo-with-a-sort-o%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown






          Popular posts from this blog

          Peggy Mitchell

          Palaiologos

          The Forum (Inglewood, California)