Imprime o valor de retorno após a execução do programa

8

Eu estou querendo saber como definir a opção para imprimir automaticamente o valor de retorno após cada execução do programa no terminal sem digitar echo $? .

É algo que pode ser configurado? Codeblocks tem esse recurso.

    
por mr.backy 27.02.2016 / 20:57

2 respostas

9

Sim, existem duas maneiras. Uma é definir PROMPT_COMMAND em .bashrc , a outra - para definir a substituição de comando em PS1 para o comando echo $? .

Método 1:

Na página de manual do bash:

  

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.

O que quer que você defina essa variável, será executado antes de desenhar o prompt a cada vez. Demonstração:

$> PROMPT_COMMAND=" echo 'Last command exited with'  $? 'code'  "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$> 

Observe o uso de $? . Para alterações permanentes, salve-o em .bashrc

Método 2

Suponha que o prompt PS1 esteja definido assim:

PS1='
user@ubuntu:$> '

Se eu quiser executar algum programa toda vez que esse prompt for redesenhado na tela (que é depois de cada comando anterior), eu precisaria usar command substitution $(. . .) e configurá-lo no prompt da seguinte forma:

PS1=' [ $? ] 
user@ubuntu: $> '

Demo:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 

Repare que divido meu PS1 em duas linhas, a parte superior terá [ exitcode ] e inferior $> <blank space>' . É por isso que há > antes de $> ' na segunda linha (O prompt > é PS2 inicial para comandos de múltiplas linhas). Como alternativa, você poderia fazer algo assim (observe a estrutura $'...' ):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
    
por Sergiy Kolodyazhnyy 27.02.2016 / 21:11
4

Um método que escolhi de o Wiki do Arch é para trap ERR . trap é usado no Bash para executar comandos quando um sinal é recebido ou para certos outros eventos. Um ERR trap é executado sempre que a linha de comando atual termina com um erro - o valor de retorno não é 0. (Se ele terminasse normalmente, o valor de retorno seria obviamente 0.)

Então, por exemplo:

trap 'printf "\ncode %d\n\n" $?' ERR

Então:

$ echo foo
foo
$ false

code 1

$

(Nota: nenhuma mensagem após o comando echo que foi executado com sucesso - O que significa quando eu digito um comando e o terminal não faz nada? )

A dica do Arch Wiki seguiu em frente e coloriu a mensagem, para que você recebesse uma mensagem amarela perceptível:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

Efeito:

Na verdade, tudo o que preciso fazer é ficar de olho em um% code amarelo na saída para saber que um comando falhou.

    
por muru 08.03.2016 / 03:10