Apakah mungkin untuk menambahkan alias waktu secara paksa (karena tidak ada cara yang lebih baik untuk mengungkapkannya) ke setiap perintah di bash
?
Sebagai contoh, saya ingin memiliki pengguna tertentu yang setiap kali perintah dijalankan, selalu dibungkus dengan date
sebelum dan sesudah, atau time
.
Apakah ini mungkin dan jika iya, bagaimana?
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.preexec()
fungsi untuk benar-benar membungkus apa pun yang sedang dieksekusi dengan mengambil perintah, menjalankannya sendiri dari dalam fungsi, lalu mengembalikan beberapa jenis kesalahan sehingga shell tidak melanjutkan untuk mengeksekusi perintah itu sendiri.Jawaban:
Anda dapat merekam waktu baris perintah dimulai dan waktu prompt ditampilkan. Bash sudah melacak tanggal mulai setiap baris perintah dalam riwayatnya, dan Anda dapat mencatat waktu ketika Anda menampilkan prompt berikutnya.
Ini hanya memberi Anda resolusi kedua, dan hanya waktu jam dinding. Jika Anda menginginkan resolusi yang lebih baik, Anda perlu menggunakan
date
perintah eksternal yang mendukung%N
format untuk nanodetik, danDEBUG
perangkap untuk memanggildate
sebelum menjalankan perintah ke waktu.Bahkan dengan
DEBUG
jebakan, saya tidak berpikir ada cara untuk secara otomatis menampilkan waktu prosesor untuk setiap perintah, atau menjadi lebih diskriminatif daripada cepat ke cepat.Jika Anda ingin menggunakan shell yang berbeda, inilah cara mendapatkan laporan waktu untuk setiap perintah di zsh (ini tidak menggeneralisasi ke tugas lain):
Anda dapat mengatur
REPORTTIME
ke nilai integer apa pun, informasi pewaktuan hanya akan ditampilkan untuk perintah yang menggunakan lebih dari beberapa detik waktu prosesor ini.Zsh mengambil fitur ini dari csh tempat variabel dipanggil
time
.sumber
Pilihan Anda di sini akan tergantung pada shell Anda. Di
zsh
sana disebut fungsi hook yang nyamanpreexec()
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 disebutprecmd()
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 menggunakanprecmd()
dan menampilkannya sebelum prompt atau menghapusnya. Contoh: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.
Dalam implementasi yang lebih praktis
preexec()
, saya menggunakannya melihat apakah shell berjalan di dalamtmux
atauscreen
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.
sumber
Cara termudah mungkin akan ditetapkan
PROMPT_COMMAND
. Lihat Variabel Bash :Misalnya, untuk menghindari menimpa perintah prompt yang ada, Anda dapat melakukan:
sumber
csh
Sayatcsh
memiliki dukungan terbaik untuk fitur ini (dan selalu memilikinya).Dengan kata lain,
set time=1
akan mencetak waktu yang digunakan (sistem, pengguna, berlalu) dengan perintah apa pun yang membutuhkan lebih dari 1 detik waktu cpu. Plainset time
akan memungkinkan pencetakan waktu untuk semua perintah.sumber