Existe uma maneira de executar código no prompt da linha de comando (PS1) sem usar backticks?

2

Estou usando este pedaço de código diretamente no prompt de comando (PS1), e ele me diz se o comando anterior foi executado corretamente.

PS1="\'if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[                    
por luis.madrigal 13.06.2017 / 04:26

3 respostas

6

PS1="\'if [ \$? = 0 ]; then ... fi\'

Update: So I tried the plain "$()" but it didn't work. And, now I am more puzzled because if add a forward slash to it works - "\$()".

O \ é uma barra invertida, não uma barra invertida.

Você precisa escapar do $ aqui pelo mesmo motivo que escapou dos backticks no primeiro snippet: porque senão a substituição do comando é expandida imediatamente , ao definir PS1 , e não quando PS1 é usado para produzir um prompt.

É melhor usar aspas simples ao redor da tarefa, elas evitam a expansão de variáveis e substituições de comando para toda a string.

PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '

Note que você precisa colocar os códigos de escape dentro de \[ ... \] para dizer ao bash que eles não são impressos, e que eles não devem levá-los em consideração ao calcular a largura do prompt (mencionado de passagem no manual ). (Eu não sei se o Bash pode lidar corretamente com os personagens gráficos que você usou, e eu não posso testar.)

    
por 13.06.2017 / 07:41
1

Observação : estou usando esta resposta apenas para chamar sua atenção, pois não tenho reputação de comentar sua pergunta.

Editei minha resposta anterior para ajudá-lo com sua última atualização.
Você já tentou usar o $ PROMPT_COMMAND para lidar com a lógica do seu prompt? Por lógica quero dizer suas declarações condicionais e supostas chamadas de função.

Também adicionei um comentário sobre o motivo pelo qual você está sempre recebendo 0 como status de saída. Precisamos salvá-lo para evitar esse problema.

Espero que isso possa ser útil.

    
por 15.06.2017 / 03:56
-1

I don't like the backticks notation, is there a way to execute it without using ''?

The function is called and the results are displayed, but the conditional does not seem to be executing, or rather the status code returned seems to always be 0. So it always shows the first part of the conditional.

Any ideas about that? I suspect that it has something to do with the order in which the command substitutions are executed.

  • Minha sugestão é transferir toda a lógica para o PROMPT_COMMAND variável para esclarecer as coisas.
    Como declarado no Bash Prompt Howto O conteúdo desta variável é executado como um comando regular de Bash pouco antes O Bash exibe um prompt , o que significa, antes da chamada para a variável $PS1

Por exemplo:

    # Notice that we need to save the exit status to preserve it
    # and avoid what you are reporting(always returning 0)
    choose_icon() {
        RET=$?; # Save the exit status
        # Using short circuit evaluation to make statement shorter
        [[ $RET != 0 ]] && ISTATUS=                                    
por 13.06.2017 / 06:35