Pilihan Anda di sini akan tergantung pada shell Anda. Di zsh
sana disebut fungsi hook yang nyaman preexec()
yang dijalankan tepat sebelum perintah shell interaktif. Dengan membuat fungsi dengan nama ini, Anda dapat menyebabkan sesuatu dieksekusi. Anda juga dapat menindaklanjuti dengan fungsi yang disebut precmd()
yang akan berjalan tepat sebelum prompt berikutnya dibuat, yang akan segera setelah perintah Anda selesai.
Dengan membuat pasangan fungsi ini, Anda dapat memiliki perintah sewenang-wenang apa pun yang ingin Anda jalankan sebelum dan sesudah perintah apa pun yang dikeluarkan saat diminta. Anda bisa menggunakan ini untuk mencatat penggunaan shell, membuat kunci, menguji lingkungan, atau seperti dalam contoh Anda menghitung waktu atau sumber daya yang dihabiskan saat perintah dijalankan.
Dalam contoh ini, kita akan membuat timestamp tolok ukur sendiri sebelum menjalankan perintah menggunakan preexec()
lalu menghitung waktu yang dihabiskan untuk mengeksekusi perintah menggunakan precmd()
dan menampilkannya sebelum prompt atau menghapusnya. Contoh:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Catatan: Untuk contoh khusus ini, ada fungsi builtin yang bahkan lebih mudah. Yang harus Anda lakukan adalah mengaktifkan pelaporan runtime di ZSH dan itu akan melakukan ini secara otomatis.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
Dalam implementasi yang lebih praktis preexec()
, saya menggunakannya melihat apakah shell berjalan di dalam tmux
atau screen
dan, jika demikian, untuk mengirim informasi tentang perintah yang sedang berjalan di hulu untuk ditampilkan dalam nama tab.
Sayangnya di bash, mekanisme kecil ini tidak ada. Ini adalah upaya seorang pria untuk meniru itu . Lihat juga jawaban Gilles untuk hack kecil yang serupa.
preexec
, tetapi Anda tidak ingin menjalankannya di dalampreexec
(misalnyapreexec() { time $1; }
), karena shell masih menjalankannya setelahpreexec
kembali. Jadi yang terbaik yang bisa kita lakukan adalah sesuatu yang serupa.