Każde polecenie uruchomione w bash zwraca kod wyjścia.
Ilekroć wpisuję polecenie w wierszu polecenia bash, chcę, aby wyświetlał status wyjścia, tj. echo $?
np. jeśli uruchomię echo "hello";
po znaku zachęty bash, wynikiem powinno być:
linux@linux$ hello
linux@linux$ 0
Odpowiedzi:
Kod wyjścia z ostatniego wykonanego polecenia jest przechowywany w
$?
zmiennej środowiskowej. Możesz więc po prostu dodać tę zmienną do domyślnego wiersza polecenia i zawsze będzie tam wydrukowany kod wyjścia. Pytanie jest przechowywane w$PS1
zmiennej środowiskowej. Początkowo jest ustawiony w/etc/bash.bashrc
skrypcie, a później w$HOME/.bashrc
.Tak więc edytuj wiersz
$HOME/.bashrc
(/etc/bash.bashrc
byłby obejmujący cały system) na podstawie jego wartości domyślnej:do tego (na przykład):
Domyślny monit został zmieniony na:
0 w nawiasach to kod wyjścia, patrz:
Znaczenie znajduje się na stronie http://www.tldp.org/LDP/abs/html/exitcodes.html
źródło
readlink /proc/$$/exe
proszę? 0 oznacza brak błędów, czy próbowałeś coś, co daje błąd:^C
albofalse
alboasdasdasd
?PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")
, ale to pokazuje0
cały czas. Masz pomysł, dlaczego?$?
jest już rozwinięty do0
ustawieńPS1
. Zrób,echo $PS1
a zobaczysz. Musisz albo użyć pojedynczych cudzysłowów, albo uciec od tego\$?
.Innym sposobem, który wybrałem z Arch Wiki, było użycie
trap
:Efekt:
źródło
Oto prosty przykład:
Jeśli używasz podwójnych cudzysłowów, musisz dodać ukośnik odwrotny, aby uniknąć
$
:Wynik:
Jeszcze lepszym sposobem jest wydrukowanie kodu wyjścia tylko wtedy, gdy jest on niezerowy.
Przykładowe dane wyjściowe:
Objaśnienie:
${var#pattern}
to rozszerzenie parametru bash, które oznacza usunięcie najkrótszego pasującego wzorca z przodu $ var. W tym przypadku usuwamy0
z przodu$?
, co skutecznie skraca kod wyjścia0
.Jeśli użyjesz podwójnego cudzysłowu,
$?
zostanie zastąpiony, gdyPS1
jest ustawiony, zamiast za każdym razem oceniany. Zrobićecho $PS1
, aby potwierdzić, że nie ma sztywno wartośćPS1
.źródło