Cetak nilai pengembalian setelah eksekusi program

9

Saya bertanya-tanya bagaimana mengatur opsi untuk mencetak kembali nilai otomatis setelah setiap eksekusi program di terminal tanpa mengetik echo $?.

Apakah ini sesuatu yang bisa diatur? Codeblocks memiliki fitur itu.

mr .backy
sumber

Jawaban:

10

Ya, ada dua cara. Salah satunya adalah untuk set PROMPT_COMMANDdi .bashrc, yang lain - untuk perintah substitusi set di PS1untuk 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 PS1prompt 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 PS2perintah multiline). Atau, Anda bisa melakukan sesuatu seperti ini (perhatikan $'...'strukturnya):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
Sergiy Kolodyazhnyy
sumber
+1 Itu benar-benar berfungsi. Saya tidak meragukan siapa pun dengan reputasi 27rb, tetapi tampaknya prompt bukanlah "perintah", jadi menggunakan $? di dalamnya tidak mendapatkan $? reset ke nol seperti yang saya pikir mungkin - bahkan menggunakan metode pertama yang mengeksekusi gema tanpa kesalahan.
Joe
PS1hanyalah 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
Sergiy Kolodyazhnyy
@ mchid apa maksudmu?
Sergiy Kolodyazhnyy
1
@mchid "Sebelum mengeluarkan setiap prompt utama", maka setelah perintah terakhir selesai dijalankan.
kos
1
@mchid dijalankan sebelum prompt dicetak - jadi sebelum Anda mengetikkan perintah berikutnya.
muru
4

Metode yang saya pilih dari Arch Wiki adalah untuk trap ERR. trapdigunakan di Bash untuk menjalankan perintah ketika sinyal diterima, atau untuk acara tertentu lainnya. Sebuah ERRperangkap 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 echoperintah 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:

masukkan deskripsi gambar di sini

Akibatnya, yang perlu saya lakukan adalah mengawasi kuning codedi output untuk mengetahui perintah gagal.

muru
sumber