Condição dentro da string no Bashscript

1

Eu quero imprimir o código de saída do comando anterior no shell se ele falhou. Então eu mudei PS1 variable em /etc/bash.bashrc assim:

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

mas sempre imprime o código de saída do comando anterior. Existe alguma maneira de adicionar condição no modelo, portanto, se $? for igual a 0 , ele não imprimirá $?

    
por Hossein Nasr 20.07.2016 / 17:30

2 respostas

4

Você pode criar condições e expressões dentro de $() da seguinte forma:

echo "$( var=2; echo $var)"

no seu exemplo, você pode alterar a variável PS1 da seguinte forma:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $(
    status=$?; (( status != 0 )) && echo "[$status] "
)\$ '

se parece com:

jackman@b7q9bw1:~ $ echo hello
hello
jackman@b7q9bw1:~ $ sh -c 'exit 42'
jackman@b7q9bw1:~ [42] $ 
    
por 20.07.2016 / 17:37
0

O Bash executa o código na variável PROMPT_COMMAND antes imprimindo o prompt. Uma das coisas que você pode fazer é calcular os componentes do prompt que são montados por meio da configuração PS1 .

PROMPT_COMMAND_set_status () {
  if ((last_status == 0)); then
    PS1_status=
  else
    PS1_status="[$last_status] "
  fi
}
PS1=PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $PS1_status\$ '
PROMPT_COMMAND='last_status=$?; PROMPT_COMMAND_set_status'
    
por 21.07.2016 / 01:04