Jawaban:
Ya, ada dua cara. Salah satunya adalah untuk set PROMPT_COMMAND
di .bashrc
, yang lain - untuk perintah substitusi set di PS1
untuk echo $?
perintah.
Metode 1:
Dari halaman manual bash:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
Apa pun yang Anda atur variabel ini, akan dijalankan sebelum menggambar prompt setiap kali. Demo:
$> 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
$>
Perhatikan penggunaan \$?
. Untuk perubahan permanen, simpan di.bashrc
Metode 2
Misalkan PS1
prompt saya disetel seperti ini:
PS1='
user@ubuntu:$> '
Jika saya ingin menjalankan beberapa program setiap kali prompt ini digambar ulang di layar (yang setelah setiap perintah sebelumnya berjalan), saya perlu menggunakan command substitution $(. . .)
dan mengaturnya di prompt seperti:
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 ]
$>_
Perhatikan bahwa saya membagi PS1 saya menjadi dua baris, akan atas [ exitcode ]
dan bawah $> <blank space>'
. Itulah sebabnya ada >
sebelumnya $> '
di baris kedua (Perintah memimpin >
adalah PS2
perintah multiline). Atau, Anda bisa melakukan sesuatu seperti ini (perhatikan $'...'
strukturnya):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
hanyalah teks yang sedang dicetak sebelum mendapatkan input pengguna - tidak lebih dari itu. Ini tidak kebal terhadap ekspansi parameter dan penggantian perintah, jadi Anda bisa memasukkan apa pun ke dalamnya $(...)
, misalnya $( pwd )
dan itu akan ditampilkan di sana. Saya telah menggunakannya dengan skrip khusus untuk menunjukkan daya baterai laptop, misalnya
Metode yang saya pilih dari Arch Wiki adalah untuk trap
ERR
. trap
digunakan di Bash untuk menjalankan perintah ketika sinyal diterima, atau untuk acara tertentu lainnya. Sebuah ERR
perangkap berlari setiap kali baris perintah saat ini berakhir dengan kesalahan - nilai kembali tidak 0. (Jika itu mengakhiri normal, nilai kembali jelas akan menjadi 0.)
Jadi, misalnya:
trap 'printf "\ncode %d\n\n" $?' ERR
Kemudian:
$ echo foo
foo
$ false
code 1
$
(Catatan: tidak ada pesan setelah echo
perintah yang berjalan dengan sukses - Apa artinya ketika saya mengetik perintah dan terminal tidak melakukan apa-apa? )
Tip Arch Wiki melanjutkan dan mewarnai pesan, sehingga Anda mendapatkan pesan kuning yang terlihat:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Efek:
Akibatnya, yang perlu saya lakukan adalah mengawasi kuning code
di output untuk mengetahui perintah gagal.