
Fiz uma variável PS1 personalizada, o que é tremendamente confuso. Aqui está o que está mais próximo de estar totalmente funcionando:
PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD: \w [\e[1;34m]Esta pasta tem \$( /bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') arquivos [\e[1;33m]Um total de \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n`se [ \$ = 0 ]; ] Funcionou - [\e[0m]; else echo [\e[31m]O_O[\e[0m]Não funcionou - ;
Este é o mesmo código do exemplo de código anterior, mas foi separado em blocos e comentado para melhor legibilidade:
#User@Host [Red]
\n\[\e[1;31m\]\u@\H
#Hour [Purple]
\[\e[35m\] \@
#PWD [Green]
\[\e[32m\] PWD: \w
#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files
#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n
#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`
Tentando explicar o problema:
if
procura uma condição que não pode mais ser falsa após a execução de for (por exemplo)"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"
, pois é verdadeira se a última instrução tiver um final limpo.
Como posso fazer funcionar e ao mesmo tempo manter a saída na mesma posição? Se o if for movido antes do primeiro comando executado, ele funcionará bem.
Pensei em atribuir uma variável com essa if
condição no início do PS1. Então outro if
nesta posição julgaria a variável alternativa que não mudaria. Mas infelizmente não tenho nenhuma habilidade com Bash. Já tentei, sem sucesso, fazer isso umas mil vezes.
Algo assim (mas bem escrito):
PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\`
...[Some more code in between]...
`if [ \$prev_err = 0 ]
then echo "No error"
else echo "There was an error in the statement."
fi\`"
Alguns ` (caracteres de crase) estão em lugares errados ou omitidos no bloco de código anterior.
Responder1
Provavelmente é melhor fazer a maior parte disso em PROMPT_COMMAND que, para citar o manual do Bash "Se definido, o valor é executado como um comando antes de emitir cada prompt primário"
Veja tambémeste grande exemplo.
O meu é :-
PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'
que mantém meu histórico sincronizado nas janelas do terminal.
Então você provavelmente deveria colocar o máximo possível dentro das funções bash apenas para simplificar o problema.
BTW - você pode achar que du -sh .
é um pouco mais útil e fácil do que /bin/ls -lah | /bin/grep -m 1 total
apenas obter o uso do arquivo`
Responder2
Meu promptcontém diversas funções, como
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'
Isso funciona para você?