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' '