Czytałem ten https://wiki.archlinux.org/index.php/Color_Bash_Prompt i skończyłem z następującymi:
# Stores the status of each command in $RET
PROMPT_COMMAND='RET=$?;'
# A colour.
RED_SHELL='\e[0;36m'
# Prints "Status 1" if RET is 1, for example.
RET_VISUALISE='$(if [[ $RET != 0 ]]; then echo -ne "Status \[$RED_SHELL\]$RET\n" && RET=0; fi;)'
# What to print for each prompt.
PS1="$RET_VISUALISE\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \t \[\e[33m\]\w\[\e[0m\]\n\$ "
To robi prawie to, co chcę, z wyjątkiem sytuacji, gdy naciskam Enter, Enter, Enter wiele razy po poleceniu, które zwróciło status! = 0. W tym przypadku wypisuje „Status 1” za każdym razem, gdy naciskam Enter.
Właśnie tego && RET=0;
część miała się pozbyć.
Nie rozumiem też, dlaczego env | grep RET
wyświetla tylko PS1
zawartość. Jaki jest zakres $RET
?
set -x
co umożliwia śledzenie. Gdy po prostu naciśniesz klawisz Enter (bez polecenia), ponownieRET=$?
przypisuje kod powrotu ostatnio wykonanej funkcji , więc ustawienie zostanie po0
prostu zastąpione. W rzeczywistości, ponieważ ustawiono go w podpowłoce , przypisanie i tak nie jest propagowane z powrotem do zakresu zewnętrznego. Przykład:FOO=bar ; echo $FOO ; BAZ=$( FOO=baz ; echo $FOO ) ; echo $FOO ; echo $BAZ
. Jak pisałem wcześniej, nie ma to znaczenia, ponieważRET=$?
po prostu ponownie przypisze ten sam (błąd) kod powrotu. Po prostu wypróbuj moje rozwiązanie i przejdź dalej.PROMPT_COMMAND
- tylko po to, aby zostać ugryzionymRET=$?
bez wykonywania innego polecenia podczas tworzenia następnego monitu. Więc nie, to nie tylko podpowłoka, ale przyczynia się.