Home > Enterprise >  bash prinf \r multiple line show only one line
bash prinf \r multiple line show only one line

Time:09-20

I have code :

printf '\r%s' 'first line here' 'second line here' 'thrid line heere'
sleep 1
printf '\r%s' 'iam new' 'new again' 'and new'

but the script show only one line

i want show three line, each line will update after one second, without new line again

only three line and update all three line

thanks

CodePudding user response:

Carriage returns (\r) ONLY reset to the beginning of the line.
Newline characters (\n) "roll the paper" a line vertically.
Imagine controlling a physical print head.

The result is that you can use \r for dynamic output effects like a countdown.

printf "\n" # get a clean line to start so you don't print over something
for c in {10..1}; do printf "\rNew lines in: %2.2s" $c; sleep 1; done # countdown in place
printf "\r .20s\r" ""         # blank the line and reset to overwrite cleanly
printf "New line %2.2s!\n" {1..10}; # include \n's to move to next line, NOT overwrite

This counts down in place, doesn't leave the hanging 0 from the 10 (that's what the %2.2s if for), and writes the first of the lines that stay over where the countdown was without leaving hanging characters there (that's the .20s).

CodePudding user response:

tl;dr :

printf "One Line\nSecond line\nThird line"
printf "\033[1F\033[1Fnew 1\nnew 2\nnew 3"

Not sure what you are trying to do exactly. But I am under the impression that you want to update three different lines.

Eg, you want your output to go from

first line here
second line here
third line heere (sic)

to

iam new
new again
and new

If so, you can't do that with \n, \r... As Paul 's explained, those are inherited from the days when there was no screen but printers. And not modern printers: some electronically controlled good old typing machines. So sending 'A' to the machine, types 'A'. Etc. That the ascii code. And some special codes meant special behaviour. Such as '\r' which return to the beginning of the line (as it is possible with a typing machine, as you know if you've ever seen one). Or '\n', going to next line (using the right handle). Or '\07' ringing the bell. Etc. But you cannot go back 1 line. Well, not with basic control char.

Now, depending on what terminal (the application emulating a physical terminal such as VT100, which itself is a device emulating a paperless printer. The "size of train is derived from size of roman horse ass" joke, is not entirely a myth) you are using, you may use special control sequences.

The most likely to work is ESC [ 1 F one.

So, in bash

printf "One Line\nSecond line\nThird line"
printf "\033[1F\033[1Fnew 1\nnew 2\nnew 3"

(\033 is ESCape character. So each \033[1F sequence take you to the beginning of the previous line)

It is important tho to understand that you are assuming, doing so, that the terminal you are using understand those sequence. \n and \r are supposed to work with any device that understands ascii control char. VT100 Escape sequence are only working with devices that were designed to be compatible with those sequences. Which is the case of most terminal, but not all. A notable exception is jupyter notebook for example (And probably windows command terminal, but I don't have one to check).

So, if you need a clean solution for such things, you need to find a library such as bashsimplecurses. That will adapt to any terminal.

  •  Tags:  
  • bash
  • Related