I am trying to understand how terminal works by doing different tricks, like writing from one tty to another, changing settings tty1
from tty2
, etc. Also, I am trying to change a color by sending escape sequence from keyboard, directly. That is, not by echo -e '\e[0;31m'
command, but by direct keyboard input. It doesn’t work.
I do this steps:
- Open
tty1
andtty2
- In the
tty2
putbash
into the sleep mode, bysleep 10m
. Type word 'one'.
- Go to
tty1
, doecho -n ^[[0;31m > /dev/tty2
. The first character^[
is typed by this way Ctrl + v Esc - Return to
tty2
, type word 'two'. Yes – the color has been changed to red by command from another tty.
- Repeat steps 3,4, but with green color and word 'three'
- And finally, I am trying to send the escape sequence not by another
tty
, but from keyboard directly – by typing^[[0;37m
intty2
. I do everything the same way – Esc (Ctrl + v doesn't needed, because readline is sleeping), then[0;37m
, but get this:
Question:
Why does it work this way? All characters the same, terminal state the same, but in one case terminal get escape sequence, and in another case don't.
Edit
The question was answered here: Echoed escape sequences doesn't interpreted in Linux tty.
Best Answer
When you run
echo
, you're sending output to the terminal. The terminal interprets escape sequences such as the one to change colors in the output that is sent to it. These escape sequences are meant to be sent by applications, this is why they are recognized in the output that comes from the application running in the terminal. Usually the application running in the terminal is the one started by the terminal emulator (your shell) and the ones started by this in turn, but if you runecho … >/dev/tty2
thenecho
is effectively “running in the terminal” (in the sense that its output is going to the terminal, which is what matters here).When you press Esc [ etc., you're sending input to the terminal. The terminal does not interpret escape sequences such as the one to change colors in the input that it receives. The terminal does interpret escape sequences in input, but for a completely different purpose: they're a way to encode function key presses.
How do keyboard input and text output work? has some relevant background.