Why doesn't `echo abc^H` just print `ab`?

backspace is only moving the cursor backward.

backspace (or delete or whatever character depending on the configuration) deletes the last printed character only when these conditions are met:

  • it is typed on the keyboard, not a command output like echo in your example
  • the terminal device is in cooked mode (the usual case)

If you want to erase the c in your example, you need to overwrite it by another character, for example:

echo "abc^H "