5 votos

comando man, y decoración de la salida (negrita/subrayado/...)

Cuando hago, digamos, un

man zsh

Me sale la página man de zsh, partes del texto están en negrita o subrayadas, lo que facilita la lectura. man lo hace, por ejemplo, insertando códigos de control 0x08 en su salida, que luego son interpretados por el Terminal para mostrar el texto subrayado.

Cuando hago un

man zsh | cat

Por supuesto, ya no veo tales decoraciones, sino sólo el texto sin formato. Esto tiene sentido, porque el programa que lee de la tubería, normalmente no está interesado en ver esos códigos de control.

Supongo que man comprueba si stdout es un tty o una tubería/archivo, y en este último caso no produce la salida.

Ahora viene lo desconcertante:

Cuando hago un

man zsh | less
man zsh | xxd
man zsh | awk ....

Sigo viendo las decoraciones (subrayado, etc.) en el extremo receptor del tubo. ¿Cómo es posible? man no sabe si el proceso al que canaliza la salida quiere ver el código de control, y cat y head ciertamente no tienen la capacidad de filtrar tales decoraciones.

9voto

staffan Puntos 3299

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

1voto

Por defecto, cat elimina los caracteres de control cuando la salida va a un terminal. En man cat :

-e  Display non-printing characters (see the -v option), and display a dollar
    sign (‘$’) at the end of each line.

-t  Display non-printing characters (see the -v option), and display tab
    characters as ‘^I’.

-v  Display non-printing characters so they are visible.  Control characters
    print as ‘^X’ for control-X; the delete character (octal 0177) prints
    as ‘^?’.  Non-ASCII characters (with the high bit set) are printed as ‘M-’
    (for meta) followed by the character for the low 7 bits.

Por lo tanto, correr

  • man man | cat eliminará los caracteres de control,
  • man man | cat -e les mostrará (al igual que cat -v y cat -t ),
  • man man | cat | less pasará caracteres de control a less (haciendo que el cat parte básicamente un no-op).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X