Configure o bash para imprimir o status de saída de todos os comandos digitados

8

Todos os comandos que eu digito no bash retornam com um código de saída.

Eu quero:
Sempre que eu digitar um comando no prompt do bash, quero que ele saia e imprima o status de saída, ou seja, echo $? .

por exemplo. se eu executar echo "hello"; no prompt do bash, a saída deve ser:

linux@linux$ hello
linux@linux$ 0
    
por ravidixit 23.10.2013 / 07:38

3 respostas

11

O código de saída do último comando executado é armazenado na variável de ambiente $? . Assim, você pode adicionar essa variável ao prompt de comando padrão e sempre terá o código de saída impresso. O prompt é armazenado na variável de ambiente $PS1 . Ele é inicialmente definido no script /etc/bash.bashrc e, posteriormente, no $HOME/.bashrc .

Portanto, edite a linha em $HOME/.bashrc ( /etc/bash.bashrc seria de todo o sistema) do valor padrão:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$ '

para isso (por exemplo):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] $ '

Assim, o prompt padrão é alterado para:

user@host:/path/to/dir[0] $

O 0 entre parênteses é o seu código de saída, consulte:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

Para os significados, consulte o link

    
por chaos 23.10.2013 / 07:52
4

Outra maneira que escolhi de o Wiki do Arch foi usar trap :

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

Efeito:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$
    
por muru 21.09.2014 / 22:46
2

Aqui está um exemplo simples:

PS1='$? > '

Se estiver usando aspas duplas, será necessário adicionar uma barra invertida para escapar do $ :

PS1="$? > "

Saída:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

Uma maneira ainda melhor é imprimir apenas o código de saída quando este for diferente de zero.

PS1='${?#0}> '    # single quote example
PS1="${?#0}> "   # double quote example (requires extra backslash)

Exemplo de saída:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

Explicação: ${var#pattern} é uma expansão de parâmetro bash que significa remover o padrão de correspondência mais curto da frente de $ var. Portanto, neste caso, estamos removendo 0 da frente de $? , o que efetivamente truncaria um código de saída de 0 .

Se estiver usando aspas duplas, $? será substituído quando PS1 for definido, em vez de ser avaliado a cada vez. Do echo $PS1 para confirmar que você não tem um valor codificado em PS1 .

    
por wisbucky 10.03.2017 / 21:47

Tags