Como obter terminais verdes / vermelhos no OpenBSD?

2

Para máquinas Linux eu posso usar:

# vi ~/.bashrc # red/green terminal colors regarding exit code

export PROMPT_COMMAND='PS1="'
if [[ \$? = "0" ]];
then echo "\[\033[0;32m\]";
else echo "\[\033[0;31m\]";
fi'[\u@\h \w]\[\e[m\] "'
export PS1

para obter o terminal verde quando o código de saída for 0 e receber um aviso vermelho quando o código de saída não for 0.

Como posso fazer isso no OpenBSD? (o ksh padrão)

(Eu estava tentando fazer isso, mas sem sorte - usando o ssh para conectar a máquina do OpenBSD do meu notebook - ubuntu / gnome-terminal.)

    
por LanceBaynes 07.05.2012 / 01:55

2 respostas

3

O problema é apenas bash tem PROMPT_COMMAND . Tente isso:

PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'

¹ Advertência: Eu não testei isso em ksh , mas evita PROMPT_COMMAND e funciona em bash .

² tput usa os bancos de dados terminfo do seu sistema. Isso geralmente é mais portátil e fácil de manter do que as sequências de escape codificadas, desde que o terminfo seja instalado corretamente.

    
por 07.05.2012 / 03:03
2

Cada shell tem seu próprio jeito de expandir o prompt. O ksh do OpenBSD é pdksh. Veja suas configurações de prompt no manual , sob o parâmetro PS1 .

A maneira como o ksh funciona é que ele realiza substituição de parâmetros, substituição de comandos e substituição aritmética (todas as expansões $ ) sobre o valor de PS1 antes de imprimir o prompt. Então você define PS1 de uma vez por todas, mas o valor é regenerado a cada vez. (Você pode fazer isso no bash também, se você colocar shopt -s promptvars no seu .bashrc .)

O ksh do OpenBSD suporta escapes de backslash similares ao bash. Com outras versões do ksh, você precisaria traduzir as seqüências de escape do prompt bash para $ também.

PS1='$(if (($? == 0)); then print -n "\033[32m"; else print -n "\033[31m"; fi)'
PS1="$PS1"'[\u@\h \w]'$(print '3')'[0m '

A tradução simples acima tem alguns defeitos:

  • Ele cria um processo a cada vez para analisar $? . Existe uma maneira de evitar isso, mas é hackish em ksh88.
  • Isso causa erros de redesenho, devido às sequências de controle de largura zero. Isso pode ser evitado com o corte bruto documentado no manual.

Aqui está um código mais complexo que usa aritmética para evitar gerar um subshell e cuida da delimitação de sequências não imprimíveis.

escape=$(print '3')
ctrla=$(print '
PS1='$(if (($? == 0)); then print -n "\033[32m"; else print -n "\033[31m"; fi)'
PS1="$PS1"'[\u@\h \w]'$(print '3')'[0m '
1') PS1=$(print '
escape=$(print '3')
ctrla=$(print '%pre%1')
PS1=$(print '%pre%15')
PS1=$PS1$ctrla$escape'[$(($? ? 31 : 32))m'$ctrla
PS1=$PS1'[\u@\h \w]'
PS1=$PS1$ctrla$escape'[0m'$ctrla' '
15') PS1=$PS1$ctrla$escape'[$(($? ? 31 : 32))m'$ctrla PS1=$PS1'[\u@\h \w]' PS1=$PS1$ctrla$escape'[0m'$ctrla' '
    
por 07.05.2012 / 03:43