Çalışırlarsa veya çalışmazlarsa tüm komutların geri bildirimde bulunmasını sağlayabilir miyim?


11

Bazen komutları çalıştırdığımda çıktı göstermiyor, bu yüzden çalışıp çalışmadığından emin değilim. Düzgün çalıştırılıp çalıştırılmadılarsa tüm komutların geri bildirimde bulunulması mümkün müdür? Veya çalıştırdıkları geri bildirim kimliğini görüntülemek için minimum düzeyde (doğru ya da değil)


6
Genel fikir şudur: geri bildirim olmaması işe yaradığı anlamına gelir.
Rinzwind

1
Bu tam olarak doğru değil. Örneğin, cryptsetupvarsayılan olarak bazı hata mesajlarını atlayabilir. $?Senin içinde olması iyi bir şey PS1. Bir sonraki adım, komutların zamanlamalarını her zaman bilmek için geçerli saati de eklemektir;)
d33tah

Yanıtlar:


11

(Sanırım Ask Ubuntu'ya gönderdiğinizde varsayılan kabuk, yani Bash hakkında konuştuğunuzu varsayabiliriz .)

Yığın Taşması sorusunda çok iyi bir yanıt var Bir kabuk betiğinde: echo shell komutları yürütüldükçe (bu yalnızca Ubuntu'ya özgü bir çözüm değildir).

Yapmanız gereken ayrıntılı veya xtrace özelliğini açmak için set komutunu kullanmaktır .

set -o

aktüel parametreler geçiş hangi bir listesini verecektir üzerinde veya kapalı .

set -v

veya uzun biçimli sürüm:

set -o verbose

ayrıntılı AÇILIR .

Bence istediğin aslında xtrace. Bu sadece çalıştırdığınız her komutu tekrarlamakla kalmayacak, aynı zamanda parametreleri genişletecek ve size daha fazla geri bildirim verecektir. Terminalde 'hi' yazmak kadar aptalca bir şey yaparsam, yazdıklarımın yankısını ve kabuğun 'hi' komutunu yürütmek için ne yaptığını rapor / izini alırım (aşağıdaki ekran görüntüsüne bakın) ):

Resim açıklamasını buraya girin

Xtrace özelliğini etkinleştirmek için:

set -x

veya:

set -o xtrace

Bu parametreleri devre dışı bırakmak için, (komutları sezgisel olarak) tire veya eksi sembolü yerine artı sembolü + dışında aynı komutları çağırırsınız, örneğin:

set +v

benzer şekilde ayrıntılı KAPALI konuma getirecektir :

set +x

xtrace'i KAPALI konuma getirir .


Kabuk seçenekleri hakkında ayrıntılı bir kılavuz Bölüm 33'te verilmiştir. Seçenekler, Gelişmiş Bash-Scripting Kılavuzu .


1
Ancak komut doğru olduğunda nasıl çalışır? herhangi bir çıktı veriyor mu? komut için söyle whoami >/dev/null.
Kayıtlı Kullanıcı

Evet, elbette, yazdıklarınızı ve komutla ilgili komut çağırılırken sessizce çağrılan ek parametreleri içeren ek parametreleri yansıtır. Eğer demek istiyorsan, "BAŞARI" yazıyor mu, o zaman ne yazık ki hayır, Avinash Raj'ın cevabı bunu yapacak.
Benjamin R

@PeterMortensen cevabımdaki güzel ince düzenlemeler için teşekkürler.
Benjamin R

13

Bazı komutların başarılı bir şekilde çalışıp çalışmadığını kontrol etmek için önceki komutun verdiği dönüş durumunu aşağıdakilerle kontrol edebilirsiniz $?:

echo $?

Geri dönüş durumu 0, komutun başarıyla tamamlandığı anlamına gelirken, sıfırdan farklı bir çıktı ( hata kodu ) bazı sorunlarla karşılaşıldığı veya bir hata olduğu ve kategori hata kodundan bilinebileceği anlamına gelir. Linux / C hata kodları /usr/include/asm-generic/errno-base.hve /usr/include/asm-generic/errno.h.

Ayrıca bash'ta, tamamlanma durumu ile bildirmek için kullanılabilecek .bashrcbir takma ad tanımlar alert. Diğer adı şu komut veya komut combo'suna şu şekilde eklemeniz gerekir:

some_command --some-switch; alert

En son yürütülen komutun dönüş durumunu~/.bashrc görüntülemek için dosyanıza aşağıdaki kod satırını ekleyebilirsiniz .

# show the return code of last command executed
PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '

(dosyayı istediğiniz ~/.bashrcmetin düzenleyicisiyle açın ve yukarıdaki satırı kopyalayın, dosyaya yapıştırın ve kaydedin. Terminalin yeni bir örneğini başlatın ve eylemde olmalısınız. Veya bunun yerine bazı işlevleri tanımlayabilir ve kullanabilirsiniz Bu ile PS1benzer gibi aşağıda gösterilen).

küçük bir demo:

hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$ 
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$ 
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash: 
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile 
chown: changing ownership of `/tmp/someTestFile': Operation not permitted

Sadece ile oynamak PS1:) .. biraz daha,

function showRetStat {
## line1: initiliazing retStat with the return status of the previous command
retStat=$?
## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace
# $retStatFtd in the lines initializing noErrStr and errStr among other possible ways.
retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat)
## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command
# which we are going to display with the prompt string. Change the strings to display text of your
# choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now.
noErrStr="retStat "$retStatFtd" :: PASS ^_^"
errStr="retStat "$retStatFtd" :: FAIL x_x"
## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here,
# worked in the logic, originally I intended to use this for the display while retStat in the conditional
# check; you could make the function one statement less if you want to.
echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")"
}

## Combining the function showRetStat into the prompt string.
PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '

(@gronostaj gibi bir şey daha süslü hale getirmek için işlevi değiştirebilirsiniz.)


2
Genişletilmiş cevabınızı örneklerle gerçekten seviyorum. OP xtrace istiyor eminim ama şahsen ben kendi komut satırı programları hata ayıklama yanı sıra başkalarını daha iyi anlamak için yararlı bulurdum.
Benjamin R

1
Ben her zaman aynı uzunlukta, böylece dönüş değeri sol dolgu öneriyoruz.
o0 '.

Değiştirmek için +1 PS1. Bu, hata durumunda kırmızı sayı ile kullandığım, son komut başarılı olursa ekstra bir şey yok:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
Carlos Campderrós

1
@rusty kaynak ~/.bashrcdosyasına gerek yok mu?
Avinash Raj

2
Evet, PS1'i değiştirmek yararlı ve çok esnektir. ^_^Başarıda mutlu , x_xbaşka her şeyde kırmızı gösteriyorum .
Izkata

5

Önceki komut 0 ve kırmızı X ile çıktığında yeşil onay işareti görüntülemek için komut isteminizi değiştirebilirsiniz. Arch Linux Wiki , ekleyebileceğiniz güzel bir kod parçasına sahiptir bash.rc:

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'

    # Add a bright white exit status for the last command
    #PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'

(Ben sevmiyorum çünkü kesin kodları yalnızca kaldırmak görmek istiyorum ben, gerçek hata kodunu devre dışı bırakmış #bu hattan: #PS1="$White\$? ")

İşte böyle görünüyor:

GUI Terminal ekran görüntüsü

tty ekran görüntüsü


2

Evet , terminalde yürüttüğünüz her komut için geri bildirim almak mümkündür. Komutun echo $?başarılı bir şekilde tamamlanması için 0 ve başarısızlık için 0 dışında bir değer döndüren temelinde çalışır .

Başarılı veya başarısız geri bildirim almak için aşağıdaki satırı ~/.bashrcdosyaya ekleyin .

bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"' 

Ve sonra ~/.bashrcçalışmasını sağlamak için kaynak dosya.

source ~/.bashrc

Açıklama:

Terminalde yürüttüğünüz her komut için bu ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;kod otomatik olarak ona bağlanır.

Misal:

$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
  Installed: 24.0+build1-0ubuntu1
  Candidate: 24.0+build1-0ubuntu1
  Version table:
 *** 24.0+build1-0ubuntu1 0
        500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
SUCCESS

$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
 Command 'sudo' from package 'sudo-ldap' (universe)
 Command 'sudo' from package 'sudo' (main)
 suda: command not found
FAILURE

resim açıklamasını buraya girin


1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'aynı şeyi yapacağız, [[ $? == 0 ]]açıkça kontrol etmenize gerek yok .
souravc

Ancak, C / Linux standardı ve 'Başarı' için İngilizce dilbilgisi standardı karşılığı FAILURE olacaktır.
Benjamin R
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.