Her komut için çıkış durumunu yazdırmak üzere bash nasıl yapılandırılır?


12

Bash içinde çalıştırılan her komut bir çıkış koduyla döner.

Ne zaman bash komut istemine bir komut yazsam, çıkış durumunu göstermesini istiyorum, yani, echo $?

örneğin, echo "hello";bash isteminde çalıştırırsanız , çıktı şöyle olmalıdır:

linux@linux$ hello
linux@linux$ 0

Sorunuzu unix.stackexchange.com'a göndermeye ne dersiniz ?

Teşekkürler @Frank. Ama bu soruyu sormak için iyi bir yer değil mi?
ravidixit

PS1 değişkeninin bir parçası olarak yazdırma itas'ı denedim, ancak henüz anlamadığım nedenlerle çalışmıyor.
ravidixit

Yanıtlar:


13

Son yürütülen komutun çıkış kodu $?ortam değişkeninde saklanır . Böylece bu değişkeni varsayılan komut istemine ekleyebilir ve çıkış kodunu her zaman orada yazdırabilirsiniz. Bilgi istemi $PS1ortam değişkeninde saklanır . Başlangıçta /etc/bash.bashrckodda ve daha sonra $HOME/.bashrc.

Bu nedenle, içindeki satırı varsayılan değerden düzenleyin $HOME/.bashrc( /etc/bash.bashrcsistem çapında olacaktır):

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

buna (örneğin):

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

Böylece varsayılan istem:

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

Parantez içindeki 0 çıkış kodunuzdur, bkz:

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

Anlamlar için bkz. Http://www.tldp.org/LDP/abs/html/exitcodes.html


Yapmayı denedim ama eldeki bash için çalışmıyor. üzerinde çalıştığım makine için daima [0] gösterir.
ravidixit

Bir bash çalıştırdığınızdan emin misiniz? readlink /proc/$$/exeLütfen çıktısını kopyalayabilir misiniz ? 0 hata olmadığı anlamına gelir, hata veren bir şey denediniz mi : ^Cveya falseveya asdasdasd?
kaos

1
@chaos PS1'im var PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), ama 0her zaman gösteriyor . Neden olduğu hakkında bir fikrin var mı?
Max

1
Çıkış durumu yalnızca gösterilecekse, eşit değilse 0 iyi olur
rubo77

1
@max Bunun nedeni, ayarlarınızı yaptığınızda $?zaten genişletilmiş olmasıdır . Yapın ve göreceksiniz. Ya tek tırnak kullanmak ya da gibi kaçmak zorunda . 0PS1echo $PS1\$?
wisbucky

7

Arch Wiki'den seçtiğim başka bir yol da kullanmaktı trap:

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

Etki:

$ ( exit 1 )
code 1

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

$

2
Bu, OP'nin gereksinimlerini tam olarak karşılamıyor, çünkü sıfır olsa bile çıkış durumunu yazdırmak istiyor - ama tam olarak aradığım şey bu.
Keith Thompson

2

İşte basit bir örnek:

PS1='$? > '

Çift tırnak işareti kullanıyorsanız, kaçmak için bir ters eğik çizgi eklemeniz gerekir $:

PS1="\$? > "

Çıktı:

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

Daha da iyi bir yol, çıkış kodunu yalnızca sıfır olmadığında yazdırmaktır.

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

Örnek çıktı:

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

Explanation: ${var#pattern}bash parametresi genişletmesidir, yani en kısa eşleşen deseni $ var. Yani bu durumda, 0önünden $?çıkarıyoruz, bu da bir çıkış kodunu etkili bir şekilde kısaltıyor 0.

Çift tırnak kullanılıyorsa, her seferinde değerlendirilmek yerine, ayarlandığında $?değiştirilir PS1. echo $PS1Sabit kodlanmış bir değeriniz olmadığını doğrulamak için yapın PS1.


Ocak 2018'den itibaren teşekkür ederim. Sıfır değilse, çıkış koduyla birlikte normal istemi istiyorum - bu çok yardımcı olur.
SDsolar
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.