Tùy chọn của bạn ở đây sẽ phụ thuộc vào vỏ của bạn. Trong zsh
đó, một hàm hook tiện lợi được gọi preexec()
là chạy ngay trước bất kỳ lệnh shell tương tác nào. Bằng cách tạo một hàm với tên này, bạn có thể khiến mọi thứ được thực thi. Bạn cũng có thể theo dõi với một hàm được gọi precmd()
sẽ chạy ngay trước khi lời nhắc tiếp theo được rút ra, nó sẽ ở ngay sau khi lệnh của bạn kết thúc.
Bằng cách tạo cặp hàm này, bạn có thể có bất kỳ lệnh tùy ý nào bạn muốn chạy trước và sau bất kỳ lệnh nào được đưa ra tại dấu nhắc. Bạn có thể sử dụng điều này để ghi nhật ký sử dụng shell, tạo khóa, kiểm tra môi trường hoặc như trong ví dụ của bạn tính thời gian hoặc tài nguyên đã sử dụng trong khi lệnh chạy.
Trong ví dụ này, chúng tôi sẽ tạo cho mình một dấu thời gian chuẩn trước khi chạy lệnh bằng cách sử dụng preexec()
sau đó tính toán thời gian thực hiện lệnh bằng cách sử dụng precmd()
và xuất nó trước dấu nhắc hoặc đăng xuất nó đi. Thí dụ:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Lưu ý: Đối với ví dụ cụ thể này, có một hàm dựng sẵn dễ dàng hơn. Tất cả bạn phải làm là bật báo cáo thời gian chạy trong ZSH và nó sẽ tự động làm điều này.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
Trong một triển khai thực tế hơn preexec()
, tôi sử dụng nó để xem shell đang chạy bên trong tmux
hay screen
, và nếu vậy, để gửi thông tin về lệnh đang chạy ngược dòng sẽ được hiển thị trong tên tab.
Thật không may trong bash cơ chế nhỏ này không tồn tại. Đây là nỗ lực của một người để nhân rộng nó . Cũng xem câu trả lời của Gilles cho hack nhỏ tiện lợi tương tự.
preexec
, nhưng bạn không muốn chạy nó bên trongpreexec
(ví dụpreexec() { time $1; }
), vì shell vẫn chạy nó sau khipreexec
trả về. Vì vậy, điều tốt nhất chúng ta có thể làm là một cái gì đó tương tự.