AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 446532
Accepted
x-yuri
x-yuri
Asked: 2018-05-29 10:33:42 +0800 CST2018-05-29 10:33:42 +0800 CST 2018-05-29 10:33:42 +0800 CST

Por que não preciso redefinir os atributos de texto com menos?

  • 772

Este script gera 5 linhas com a terceira sendo sublinhada:

#!/usr/bin/env bash
set -eu
bold=$(tput bold)
reset=$(tput sgr0)
underline=$(tput smul)
echo 'line 1
line 2
line 3
line 4
line 5' | awk -v bold="$bold" -v reset="$reset" -v underline="$underline" '
    NR == 3 {print underline $0 reset}
    NR != 3 {print $0}
'

Se eu não redefinir (no script) no final da terceira linha, todas as linhas a seguir serão sublinhadas, incluindo os comandos que digito a seguir (no shell). Até eu correr reset. Com less( ./my-script.sh | less -R) não apenas reset(no script) não é necessário (a terceira linha fica sublinhada), mas também produz um símbolo extra em tmux( ^O, TERM=screen-256color):

line 1
line 2
line 3^O
line 4
line 5

Mas nenhum símbolo no console simples ( TERM=xterm-256color).

O que exatamente e por que isso acontece? Existe uma maneira de fazer o script funcionar em todos esses casos?

$ ./my-script.sh
$ ./my-script.sh | grep line --color=never
$ ./my-script.sh | less -R

Por exemplo, para fazer o seguinte script funcionar melhor.

terminal escape-characters
  • 1 1 respostas
  • 348 Views

1 respostas

  • Voted
  1. Best Answer
    Thomas Dickey
    2018-05-29T11:27:00+08:002018-05-29T11:27:00+08:00

    lessenvia seu próprio "reset" no final da linha, que passa a ser derivado do terminfo sgr0por (ncurses) eliminando o ^O(redefinir conjunto de caracteres alternativo) porque lessestá usando a interface termcap. A capacidade termcap me que corresponde a terminfo sgr0 convencionalmente não modifica o estado alternativo do conjunto de caracteres, conforme observado na página de manual curs_termcap(3x) :

    sgrObserve que termcap não tem nada análogo à string de terminfo . Uma consequência disso é que os aplicativos termcap assumem que me(terminfo sgr0) não redefine o conjunto de caracteres alternativo. Essa implementação verifica e modifica os dados mostrados na interface do termcap para acomodar a limitação do termcap a esse respeito.

    Talvez lessesteja fazendo essa redefinição para se recuperar de sequências de escape inesperadas: a -Ropção foi projetada apenas para lidar com cores ANSI (e escapes formatados de forma semelhante, como negrito, sublinhado, piscar, destaque). O código-fonte não menciona isso, mas a A_NORMALatribuição informa lesspara posteriormente emitir o reset:

        /* 
         * Add a newline if necessary, 
         * and append a '\0' to the end of the line. 
         * We output a newline if we're not at the right edge of the screen, 
         * or if the terminal doesn't auto wrap, 
         * or if this is really the end of the line AND the terminal ignores 
         * a newline at the right edge. 
         * (In the last case we don't want to output a newline if the terminal  
         * doesn't ignore it since that would produce an extra blank line. 
         * But we do want to output a newline if the terminal ignores it in case
         * the next line is blank.  In that case the single newline output for 
         * that blank line would be ignored!) 
         */
        if (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON) 
        {
                linebuf[curr] = '\n';
                attr[curr] = AT_NORMAL;
                curr++;
        }
    

    Como alternativa para sgr0(que redefine todos os atributos de vídeo e é apenas parcialmente compreendido por menos), você pode fazer

    reset=$(tput rmul)
    

    e (para muitos terminais/muitos sistemas, incluindo TERM=screen-256color) redefinir apenas o sublinhado. No entanto, isso não afeta o negrito , nem há um recurso terminfo/termcap convencional para redefinir o negrito. Mas a tela implementa a sequência ECMA-48 correspondente que faz isso (SGR 22 versus o 24 usado em rmul), então você pode codificar esse caso.

    • 3

relate perguntas

  • Procurando por um gerenciador de download de terminal

  • Erro de sintaxe: número fd inválido?

  • traceroute, imprima apenas as informações do gateway

  • Como posso dar uma olhada no ssh?

  • Área de memória Flash Nand de backup

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve