Buradaki seçenekleriniz kabuğunuza bağlı olacaktır. Gelen zsh
diye bir uygun kanca fonksiyonu preexec()
herhangi interaktif kabuk komutları önce sağ çalıştırılır. Bu adda bir işlev oluşturarak işlerin yürütülmesine neden olabilirsiniz. Ayrıca adında bir işlevle takip edebilirsiniz precmd()
hemen sonra olacak bir sonraki istemi çizilir önce sadece çalışır, sizin komuta bittikten.
Bu işlev çiftini oluşturarak, komut isteminde verilen komutlardan önce ve sonra çalıştırılmasını istediğiniz rasgele komutlara sahip olabilirsiniz. Kabuk kullanımını günlüğe kaydetmek, kilitler oluşturmak, ortamı test etmek veya örneğinizde olduğu gibi bir komut çalışırken harcanan zamanı veya kaynakları hesaplamak için bunu kullanabilirsiniz.
Bu örnekte, bir komutu çalıştırmadan önce kendimize bir kıyaslama zaman damgası oluşturacağız, preexec()
ardından komutu kullanarak yürütmek için harcanan zamanı hesaplayacağız ve komut precmd()
isteminden önce çıktısını vereceğiz veya oturumdan çıkaracağız . Misal:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Not: Bu özel örnek için, daha da kolay bir yerleşik işlev vardır. Yapmanız gereken tek şey ZSH'de çalışma zamanı raporlamasını açmaktır ve bunu otomatik olarak yapar.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
Daha pratik uygulamasında preexec()
, ben kabuk içinde çalışıyorsa görmek kullanabilir tmux
veya screen
sekme adının görüntülenmesini anda çalışan komut memba hakkında bilgi göndermek için, eğer öyleyse, ve.
Ne yazık ki bash'da bu küçük mekanizma mevcut değil. İşte bir erkeğin onu çoğaltma girişimi . Ayrıca benzer zarif küçük kesmek için Gilles'in cevabına bakınız .
preexec
, ancak onupreexec
(örneğinpreexec() { time $1; }
) içinde çalıştırmak istemezsiniz , çünkü kabukpreexec
geri döndükten sonra hala çalıştırır . Yani yapabileceğimiz en iyi şey benzer bir şey.