Program yürütüldükten sonra dönüş değerini yazdır


9

Yazmadan terminalde her program yürütüldükten sonra dönüş değerini otomatik yazdırma seçeneğini nasıl ayarlayacağımı merak ediyorum echo $?.

Kurulum yapılabilecek bir şey mi? Codeblocks bu özelliğe sahiptir.

Yanıtlar:


10

Evet, iki yolu var. Bir sette etmektir PROMPT_COMMANDiçinde .bashrcdiğer, - set komutu ikamesi için PS1için echo $?komuta.

Yöntem 1:

Bash manuel sayfasından:

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.

Bu değişkeni ne yaparsanız ayarlayın, her seferinde bilgi istemi çizilmeden önce çalıştırılır. 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
$> 

Kullanımına dikkat edin \$?. Kalıcı değişiklik için, kaydedin.bashrc

Yöntem 2

İstemimin PS1şu şekilde ayarlandığını varsayalım :

PS1='
user@ubuntu:$> '

Bu istem ekranda (her önceki komut çalıştırıldıktan sonra olan) her yeniden çizildiğinde bir program çalıştırmak isterseniz, kullanmanız command substitution $(. . .) ve istemde bu şekilde ayarlamanız gerekir:

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 ]
$>_ 

PS1'imi üst [ exitcode ]ve alt olmak üzere iki satıra böldüğüme dikkat edin $> <blank space>'. Orada nedeni budur >önce $> '(lider ikinci satırda >ise PS2satırlı komutlar için istemi). Alternatif olarak, böyle bir şey yapabilirsiniz ( $'...'yapıyı fark edin ):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 

+1 Bu gerçekten işe yarıyor. Ben 27k bir üne sahip kimse şüphe değil, ama görünüşe göre istemi bir "komut" değil, bu yüzden $ kullanarak? içinde $ almaz? düşündüğüm gibi sıfıra sıfırlayın - hatta yankısız hatasız çalışan ilk yöntemi kullanarak.
Joe

PS1kullanıcı girişi almadan önce yazdırılan metindir - bundan başka bir şey değildir. Parametre genişletme ve komut ikamelerine karşı bağışık değildir, bu nedenle $(...)örneğin içine bir şey koyabilirsiniz $( pwd )ve orada gösterecektir. Bunu dizüstü pil gücünü göstermek için özel bir komut dosyası ile kullandım, örneğin
Sergiy Kolodyazhnyy

@mchid ne demek istiyorsun?
Sergiy Kolodyazhnyy

1
@mchid "Her bir birincil istemi vermeden önce", dolayısıyla son komutun yürütülmesi tamamlandıktan sonra.
kos

1
mchid, bilgi istemi yazdırılmadan önce çalıştırılır - böylece bir sonraki komutu yazmadan önce.
muru

4

I toplanan bir yöntem Arch Wiki etmektir trap ERR. trapBash'te bir sinyal alındığında veya diğer bazı olaylar için komut çalıştırmak için kullanılır. ERRGeçerli komut satırı bir hatayla sonlandığında bir tuzak çalıştırılır - dönüş değeri 0 değildir. (Normal olarak sonlandırılırsa, dönüş değeri açıkça 0 olur).

Yani mesela:

trap 'printf "\ncode %d\n\n" $?' ERR

Sonra:

$ echo foo
foo
$ false

code 1

$

(Not: echobaşarıyla çalıştırılan komuttan sonra mesaj yok - Bir komut yazdığımda ve terminal hiçbir şey yapmadığında ne anlama gelir? )

Arch Wiki ipucu devam etti ve mesajı renklendirdi, böylece fark edilir bir sarı mesaj elde ettiniz:

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

Etki:

resim açıklamasını buraya girin

Aslında, tek yapmam gereken codeçıktıdaki bir komutun başarısız olduğunu bilmesi için sarıya dikkat etmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.