En printf '%s\t%s\n' foo bar
, printf
hace salida foo<TAB>bar<LF>
.
f
, o
, b
, a
Y r
son caracteres gráficos de un solo ancho.
Al recibir esos caracteres, el terminal mostrará el glifo correspondiente y moverá el cursor una columna hacia la derecha, a menos que ya haya alcanzado el borde derecho de la pantalla (papel en máquinas de escribir originales), en cuyo caso puede alimentar una línea y regrese al borde izquierdo de la pantalla (ajuste) o simplemente descarte el carácter según el terminal y cómo se haya configurado.
<Tab>
y <LF>
son dos personajes de control . <LF>
(también conocido como nueva línea) es el delimitador de línea en texto Unix, pero para terminales, solo alimenta una línea (mueve el cursor una posición hacia abajo). Por lo tanto, el controlador de terminal en el kernel realmente lo traducirá a <CR>
(volver al borde izquierdo de la pantalla), <LF>
(cursor hacia abajo) ( stty onlcr
generalmente activado por defecto).
<Tab>
le dice al terminal que mueva el cursor a la siguiente parada de tabulación (que en la mayoría de los terminales están separados por 8 posiciones por defecto, pero también se puede configurar para que se configure en cualquier lugar) sin llenar el espacio con espacios en blanco.
Entonces, si esos caracteres se envían a una terminal con tabulaciones cada 8 columnas mientras el cursor está al comienzo de una línea vacía, eso dará como resultado:
foo bar
impreso en la pantalla en esa línea. Si se envían mientras el cursor está en la tercera posición en una línea que contiene xxxxyyyyzzzz
, eso dará como resultado:
xxfooyyybarz
En terminales que no admiten tabulación, el controlador de terminal se puede configurar para traducir esas pestañas a secuencias de espacios. ( stty tab3
)
El carácter SPC, en las máquinas de escribir telescópicas originales, movería el cursor hacia la derecha, mientras que la tecla de retroceso ( \b
) lo movería hacia la izquierda. Ahora en las terminales modernas, SPC se mueve hacia la derecha y también borra (escribe un carácter de espacio como es de esperar). Entonces el colgante de \b
tenía que ser algo más nuevo que ASCII. En la mayoría de los terminales modernos, en realidad es una secuencia de caracteres: <Esc>
, [
, C
.
Hay más secuencias de escape para mover n
personajes a la izquierda, derecha, arriba, abajo o en cualquier posición de la pantalla. Hay otras secuencias de escape para borrar (llenar con espacios en blanco) partes de líneas o regiones de la pantalla, etc.
Esas secuencias se utilizan normalmente por aplicaciones visuales como vi
, lynx
, mutt
, dialog
donde el texto está escrito en posiciones arbitrarias en la pantalla.
Ahora, todos los emuladores de terminal X11 y algunos otros no X11 como GNU le screen
permiten seleccionar áreas de la pantalla para copiar y pegar. Cuando selecciona una parte de lo que ve en el vi
editor, no desea copiar todas las secuencias de escape que se han utilizado para producir esa salida. Desea seleccionar el texto que ve allí.
Por ejemplo, si ejecutas:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
Que simula una sesión de editor en la que ingresa abC
, vuelve al principio, reemplaza ab
con AC
, C
con B
, mueve a la siguiente tabulación, luego una columna más a la derecha, luego dos columnas a la izquierda, luego ingresa D
.
Lo ves:
ABC D
Es decir, ABC
un espacio de 4 columnas y D
.
Si selecciona eso con el mouse en xterm
o putty
, se almacenarán en la selección ABC
, 4 caracteres de espacio y D
, no abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
.
Lo que termina en la selección es lo que ha sido enviado printf
pero procesado posteriormente tanto por el controlador de terminal como por el emulador de terminal.
Para otros tipos de transformación, vea el <U+0065><U+0301>
( e
seguido de un acento agudo combinado) cambiado a <U+00E9>
( é
la forma precompuesta) por xterm
.
O echo abc
eso termina siendo traducido ABC
por el controlador de terminal antes de enviarlo a la terminal después de a stty olcuc
.
Ahora, <Tab>
like <LF>
es uno de esos pocos caracteres de control que a veces se encuentran en los archivos de texto (también <CR>
en los archivos de texto MSDOS y, a veces, <FF>
en el salto de página).
Por lo tanto, algunos emuladores de terminal eligen copiarlos cuando sea posible en los búferes de copiar y pegar para preservarlos (generalmente ese no es el caso <CR>
ni tampoco <LF>
).
Por ejemplo, en terminales basados en VTE como gnome-terminal
, puede ver que, cuando selecciona la salida de printf 'a\tb\n'
en una línea vacía, en gnome-terminal
realidad se almacena a\tb
en la selección X11 en lugar de a
7 espacios y b
.
Sin embargo, para la producción de printf 'a\t\bb\n'
, almacena a
, 6 y espacios b
, y para printf 'a\r\tb\n'
, a
, 7 y espacios b
.
Hay otros casos en los que los terminales intentarán copiar la entrada real, como cuando selecciona dos líneas después de ejecutar printf 'a \nb\n'
donde se preservará ese espacio final invisible. O cuando se seleccionan dos líneas no incluye un carácter LF cuando las dos líneas resultan del ajuste en el margen derecho.
Ahora, si desea almacenar la salida de printf
en el CLIPBOARD X11
select, lo mejor es hacerlo directamente como:
printf 'foo\tbar\n' | xclip -sel c
Tenga en cuenta que cuando pega eso en la xterm
mayoría de los otros terminales, en xterm
realidad lo reemplaza \n
con \r
porque ese es el carácter que xterm
envía cuando presiona Enter(y el controlador del terminal puede volver a traducirlo \n
).