Bagaimana cara mengkonfigurasi bash untuk mencetak status keluar untuk setiap perintah?

12

Setiap perintah yang dijalankan di bash kembali dengan kode keluar.

Setiap kali saya mengetik perintah pada bash prompt, saya ingin itu menunjukkan status keluar, yaitu, echo $?

mis., jika saya menjalankan echo "hello";bash prompt, hasilnya harus:

linux@linux$ hello
linux@linux$ 0
ravidixit
sumber
Bagaimana dengan memposting pertanyaan Anda di unix.stackexchange.com ?
Terima kasih @ jujur Tapi bukankah ini juga tempat yang bagus untuk mengajukan pertanyaan ini?
ravidixit
Saya mencoba mencetaknya sebagai bagian dari variabel PS1, tetapi tidak berfungsi karena alasan yang belum saya mengerti.
ravidixit

Jawaban:

13

Kode keluar dari perintah yang dieksekusi terakhir disimpan dalam $?variabel lingkungan. Jadi Anda hanya dapat menambahkan variabel ini ke prompt perintah default dan Anda akan selalu memiliki kode keluar yang dicetak di sana. Prompt disimpan dalam $PS1variabel lingkungan. Awalnya diatur dalam /etc/bash.bashrcskrip dan kemudian di $HOME/.bashrc.

Jadi edit baris dalam $HOME/.bashrc( /etc/bash.bashrcakan menjadi sistem lebar) dari nilai defaultnya:

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

untuk ini (misalnya):

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

Jadi prompt default di diubah menjadi:

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

Angka 0 di dalam tanda kurung adalah kode keluar Anda, lihat:

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

Untuk artinya lihat http://www.tldp.org/LDP/abs/html/exitcodes.html

kekacauan
sumber
Saya mencoba melakukannya tetapi untuk bash di tangan, itu tidak berfungsi. selalu menunjukkan [0] untuk mesin yang sedang saya kerjakan.
ravidixit
Apakah Anda yakin menjalankan bash? Bisakah Anda menyalin output readlink /proc/$$/exetolong? 0 berarti tidak ada kesalahan, sudahkah Anda mencoba sesuatu yang memberikan kesalahan: ^Catau falseatau asdasdasd?
kekacauan
1
@chaos Saya memiliki PS1 saya sebagai PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), tetapi hanya menunjukkan 0sepanjang waktu. Ada yang tahu kenapa?
Maks
1
Alangkah baiknya, jika status keluar hanya akan ditampilkan, jika tidak sama 0
rubo77
1
@ Max Ini karena Anda $?sudah diperluas ke 0saat mengatur Anda PS1. Lakukan echo $PS1dan Anda akan melihat. Anda harus menggunakan tanda kutip tunggal, atau menghindarinya seperti \$?.
wisbucky
7

Cara lain yang saya pilih dari Arch Wiki adalah menggunakan trap:

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

Efek:

$ ( exit 1 )
code 1

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

$
muru
sumber
2
Itu tidak cukup memenuhi persyaratan OP, karena dia ingin mencetak status keluar bahkan jika itu nol - tapi itulah yang saya cari.
Keith Thompson
2

Ini adalah contoh sederhana:

PS1='$? > '

Jika menggunakan tanda kutip ganda, maka Anda harus menambahkan garis miring terbalik untuk menghindari $:

PS1="\$? > "

Keluaran:

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

Cara yang lebih baik lagi adalah dengan hanya mencetak kode keluar ketika bukan nol.

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

Output sampel:

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

Penjelasan: ${var#pattern}adalah perluasan parameter bash yang berarti menghapus pola pencocokan terpendek dari depan $ var. Jadi dalam hal ini, kami menghapus 0dari depan $?, yang akan secara efektif memotong kode keluar 0.

Jika menggunakan tanda kutip ganda, $?akan diganti ketika PS1diatur, bukannya dievaluasi setiap kali. Lakukan echo $PS1untuk mengonfirmasi bahwa Anda tidak memiliki nilai hardcode PS1.

wisbucky
sumber
Terima kasih dari Januari 2018. Saya ingin prompt normal dengan kode keluar di awal jika bukan nol - ini sangat membantu.
SDsolar