La teoría
En man
no habla directamente con el terminal. Produce una salida que es texto con una pequeña cantidad de formato. Otro programa, un _localizador En general [less
](https://en.wikipedia.org/wiki/Less(Unix)) El sitio web se encarga de la interacción con el usuario (desplazamiento, búsqueda, etc.) y aplica algunos formatos básicos.
Además de la paginación básica (romper líneas, sangrar, etc.), el hombre puede utilizar tres formas de hacer que el texto destaque: mayúsculas, negrita y subrayado. Las mayúsculas son caracteres distintos de las minúsculas. Para la negrita y el subrayado, el usuario utiliza la función retroceso (BS) carácter de control :
- La secuencia de tres caracteres c BS c indica que el carácter c debe aparecer en negrita.
- La secuencia de tres caracteres
_
BS c (donde _
es el carácter de subrayado) indica que el carácter c debe aparecer subrayado.
(No hay ninguna disposición para el subrayado en negrita, y no sé de antemano de qué manera _
BS _
se interpretaría).
Estas secuencias están inspiradas en lo que se podría hacer con un máquina de escribir y, en particular, con un teletipo que era una interfaz común para los ordenadores cuando el man
fue escrito originalmente: si imprime un carácter, luego utiliza el control BS para retroceder a la izquierda e imprimir ese carácter de nuevo, obtendrá un carácter más grueso. Si utiliza BS para sobreescribir un _
con otro carácter, ese otro carácter se subraya.
Terminales de vídeo con caracteres no sobrescriben los caracteres de esta forma, y los programas modernos de emulador de terminal presentan una interfaz similar. Los terminales interpretan el carácter BS como una instrucción para desplazarse una posición hacia la izquierda. Al mostrar un carácter en una posición, el terminal sobrescribe completamente lo que había antes.
Así que es el trabajo del localizador interpretar convertir c BS c y _
BS c a las instrucciones para que el terminal muestre c en negrita o subrayado. La forma de hacerlo depende del capacidades del terminal aunque en la práctica todos los terminales modernos utilizan las mismas secuencias de escape para funciones básicas como la negrita y el subrayado.
La práctica
Cuando ejecute man zsh
El man
invoca less
. less
convierte la negrita/subrayado basados en BS en secuencias de escape de formato que el terminal entiende. De este modo, el texto tiene el formato deseado.
Cuando ejecute man zsh | cat
El man
programa detecta que su salida no es un terminal para que no se ejecute less
: sólo imprime la salida que habría pasado a less
. cat
simplemente pasa su entrada sin cambios. El terminal ve secuencias como c BS c y _
BS c y, en ambos casos, BS borra el carácter anterior, por lo que el efecto visual es el mismo que el de un simple c .
Cuando ejecute man zsh | less
o man zsh | cat | less
El less
recibe la misma entrada que recibiría si man
había invocado less
directamente. Sin embargo, el comportamiento puede ser diferente porque man
puede invocar less
con algunas opciones de comando no predeterminadas. (Tras una rápida comprobación, esto no parece ocurrir en MacOS).
Puede desactivar el manejo de retroceso de less pasando el parámetro -u
opción de línea de comandos . Ejecute LESS=-u man man
o man man | less -u
para ver qué ocurre si less
simplemente pasa el carácter BS sin cambios a la terminal: el efecto visual es el mismo que cuando no se ejecuta less (pero less sigue haciendo la paginación). Ejecute LESS=-U man man
o man man | less -U
para ver una representación visual del personaje BS como ^H
en vídeo inverso.
Otras formas de ver a los personajes de BS
man man | cat -v
que traduce cada carácter BS en la secuencia de dos caracteres ^H
.
man man | hd
que muestra un volcado hexadecimal del texto. Verá secuencias como 4e 08 4e 41 08 41 4d 08 4d 45 08
- 08
= retroceso, 4e
=N, 41
=A, 4d
=M, 45
=E así que esto es NOMBRE en negrita.
man man >out.txt
y abrir out.txt
en un editor. La forma en que el editor muestra los caracteres de control depende del editor y posiblemente de su configuración.
Si desea imprimir el suyo propio, puede pasar \b
o \010
en el primer argumento del printf
para imprimir un carácter de retroceso. Prueba con estos:
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n'
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | cat
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | cat -v
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | hd
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | less
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | less -u
printf 'Normal\nB\bBo\bol\bld\bd\n_\bU_\bn_\bd_\be_\br_\bl_\bi_\bn_\be\n' | less -U