Introduction to the Problem
$ cat print_status.sh
!/bin/bash
echo "[INFO] Processing file: readme.txt"
sleep 2  To simulate the file processing

echo "[INFO] Processing file: veryPowerfulService.service"
sleep 2

echo "[INFO] Processing file: log.txt"
echo "DONE"


$ ./print_status.sh
[INFO] Processing file: readme.txt
[INFO] Processing file: veryPowerfulService.service
[INFO] Processing file: log.txt
DONE
The “Magic Code”: \033[0K\r
  • -n option asks the echo command to stop outputting the trailing newline character
  • -e option allows the echo command to interpret backslash escapes such as \n (newline) and \r (carriage return)
  • \033 - It’s the escape sequence. In other words, it’s ESC.
  • \033[ - Then this becomes “ESC [”, which is the control sequence introducer (CSI).
  • \033[0k - So it’s “CSI 0 K”. Further, “CSI 0 K” erases the text from the cursor to the end of the line.
  • \r - This is the carriage return. It brings the cursor to the beginning of the line.
$ cat print_status.sh
#!/bin/bash
echo -ne "[INFO] Processing file: readme.txt\033[0K\r"
sleep 2

echo -ne "[INFO] Processing file: veryPowerfulService.service\033[0K\r"
sleep 2

echo -e "[INFO] Processing file: log.txt\033[0K\r"
echo "DONE"
!/bin/bash
printf "[INFO] Processing file: readme.txt\033[0K\r"
sleep 2

printf "[INFO] Processing file: veryPowerfulService.service\033[0K\r"
sleep 2

printf "[INFO] Processing file: log.txt\033[0K\r\n"
echo "DONE"