Como inserir scripts bash dentro da variável PS1

2

Eu fiz uma variável PS1 personalizada, o que é tremendamente confuso. Aqui está o que está mais próximo de estar totalmente trabalhando:

PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD: \w [\e[1;34m]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files [\e[1;33m]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n'if [ \$? = 0 ]; then echo [\e[32m]^_^ [\e[0m] Worked - [\e[0m]; else echo [\e[31m]O_O[\e[0m]Didn't worked - ; fi'"

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 (por exemplo,) "This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files" , como é verdadeiro se a instrução mais recente tiver um final limpo.

Como posso fazê-lo funcionar enquanto, ao mesmo tempo, mantenho a saída nessa mesma posição? Se o if é movido para antes do primeiro comando executado, funciona bem.

Eu pensei em atribuir uma variável com a condição if no início do PS1. Então, outros if na posição desta pessoa julgariam a variável alternativa que não mudaria. Mas infelizmente não tenho nenhuma habilidade com Bash. Eu já tentei, sem sucesso, fazer mil ou mais vezes.

Algo parecido com isto (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 backtick) estão nos lugares errados ou foram omitidos no bloco de código anterior.

    
por SOMN 18.01.2014 / 09:48

2 respostas

3

Provavelmente, é melhor fazer a maior parte do que em PROMPT_COMMAND, que, para citar o manual de Bash "Se definido, o valor é executado como um comando antes de emitir cada prompt principal"

Veja também este imenso exemplo .

A minha é: -

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 deve colocar o máximo possível dentro das funções do bash apenas para simplificar o problema.

BTW - você pode achar que du -sh . é um pouco mais útil e mais fácil que /bin/ls -lah | /bin/grep -m 1 total apenas para obter o uso do arquivo '

    
por 18.01.2014 / 10:24
2

Meu prompt contém várias funções, como

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'

Isso funciona para você?

    
por 18.01.2014 / 10:43