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 / ubuntu / Perguntas / 1504038
Accepted
reneas
reneas
Asked: 2024-02-19 19:01:54 +0800 CST2024-02-19 19:01:54 +0800 CST 2024-02-19 19:01:54 +0800 CST

alterar o formato de saída do bash resulta em comportamento estranho

  • 772

Já mudei meu formato de saída do bash para algo assim:

insira a descrição da imagem aqui

com o qual estou muito feliz. Consegui isso adicionando este código ao .bashrc:

set_PS1()
{
    local RESET=$(tput sgr0 )
    local BOLD=$(tput bold )
    local RED=$(tput setaf 1 )
    local GREEN=$(tput setaf 2 )
    local YELLOW=$(tput setaf 3 )
    local BLUE=$(tput setaf 4 )
    local CYAN=$(tput setaf 6 )

    local WHOAMI='\u'
    local WHERE='\w'
    local HOSTNAME='\h'
    local TIME='\D{%H:%M:%S}'


     exit_code_prompt() {
        local EXIT_CODE=$?
        local RED=$(tput setaf 1 )
        local GREEN=$(tput setaf 2 )
        if [ $EXIT_CODE -ne 0 ]; then
            echo -e "$RED$BOLD\xE2\x9C\x98 $EXIT_CODE \xE2\x86\x92"  # Red cross mark symbol
        else
            echo -e "$GREEN$BOLD\xE2\x9C\x93 \xE2\x86\x92"  # Green checkmark symbol
        fi
    }

    local LINE_1="$BOLD$YELLOW$TIME $CYAN$WHOAMI$BLUE@$CYAN$HOSTNAME$RESET$BOLD":" $BLUE$WHERE$RESET"
    local LINE_2="$BOLD\$(exit_code_prompt) "$RESET$BOLD' \$: '$RESET


    PS1="$LINE_1\n$LINE_2"

    unset -f set_PS1
}

set_PS1

Meu problema era que se eu tivesse um comando com mais de uma linha, ele não fazia uma quebra de linha, mas sobrescrevia o conteúdo da mesma linha (apenas na representação visual ofc):

insira a descrição da imagem aqui

Agora, quando eu excluo o comando completo, ele também exclui uma parte do prompt do bash:

insira a descrição da imagem aqui

Isso poderia ser resolvido adicionando \[e \]:

    local LINE_1="\[$BOLD$YELLOW$TIME $CYAN$WHOAMI$BLUE@$CYAN$HOSTNAME$RESET$BOLD":" $BLUE$WHERE$RESET\]"
    local LINE_2="\[$BOLD\$(exit_code_prompt) "$RESET$BOLD' \$: \]'$RESET

Outro problema persiste. Quando percorro os últimos comandos usados, ele exclui o sinal de prompt $:

insira a descrição da imagem aqui

como faço para resolver esse problema?

Já pensei em usar zshmas não queria perder bashfuncionalidades como atalhos de teclado com os quais já me acostumei...

ATUALIZAÇÃO: abaixo está meu código atualizado, que ainda não funciona:

set_PS1()
{
    local Reset="\\[$(tput sgr0 )\\]"
    local Bold="\\[$(tput bold )\\]"
    local Red="\\[$(tput setaf 1 )\\]"
    local Green="\\[$(tput setaf 2 )\\]"
    local Yellow="\\[$(tput setaf 3 )\\]"
    local Blue="\\[$(tput setaf 4 )\\]"
    local MagentaBG="\\[$(tput setab 5 )\\]"
    local Cyan="\\[$(tput setaf 6 )\\]"

    local Whoami='\u'
    local Where='\w'
    local Hostname='\h'
    local Time='\D{%H:%M:%S}'
    local Exit_Code="$?"

    exit_code_prompt() {
        local Exit_Code="$?"
        local Red="$(tput setaf 1 )"
        local Green="$(tput setaf 2 )"
        if [ $Exit_Code -ne 0 ]; then
            printf "$Red\xE2\x9C\x98 $Exit_Code \xE2\x86\x92 " # Red cross mark symbol
        else
            printf "$Green\xE2\x9C\x93 \xE2\x86\x92 " # Green checkmark symbol
        fi
    }

    local Line_1="$Bold$Yellow$Time $Cyan$Whoami$Blue@$Cyan$Hostname$Reset$Bold":" $Blue$Where$Reset"
    local Line_2="$Bold\$(exit_code_prompt)$Reset$Bold \$: $Reset"

    PS1="$Line_1\n$Line_2"

    unset -f set_PS1
}

set_PS1

Terei o mesmo problema de antes. O texto com mais de uma linha aparecerá no início da mesma linha e será substituído. Percorrer os comandos resulta na exclusão de uma parte do prompt ou em um bug visual que mostra parte de um comando anterior que não está acessível.

ATUALIZAÇÃO 2 : O problema definitivamente está na exit_code_promptfunção. quando eu o excluo de $Line_2tudo, funciona conforme o esperado.

bash
  • 1 1 respostas
  • 120 Views

1 respostas

  • Voted
  1. Best Answer
    glenn jackman
    2024-02-20T02:16:26+08:002024-02-20T02:16:26+08:00

    Seguindo o conselho de @Daniel, use

        local RESET="\\[$(tput sgr0 )\\]"
    

    E semelhante com todos os outros códigos de cores.

    De 6.9 Controlando o prompt no manual:

    \[
        Begin a sequence of non-printing characters. This could be used to
        embed a terminal control sequence into the prompt.
    
    \]
        End a sequence of non-printing characters.
    

    Voltando à sua pergunta:

    Quando eu percorro os últimos comandos usados, ele exclui o sinal de prompt

    Isso ocorre porque sem o \[e \]para agrupar as sequências de controle, o bash não pode calcular corretamente o comprimento do seu prompt.

    • 4

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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