Ваші варіанти тут залежатимуть від вашої оболонки. В zsh
є зручна функція гачка називається , preexec()
який запускається прямо перед будь-інтерактивними командами оболонки. Створивши функцію з цим іменем, ви можете спричинити виконання. Ви також можете виконувати функцію, precmd()
яка називається, яка запуститься перед тим, як буде зроблено наступний рядок, який буде одразу після завершення вашої команди.
Створюючи цю пару функцій, ви можете мати будь-які довільні команди, які ви хочете виконувати до і після того, як будь-які команди будуть видані під час запиту. Ви можете використовувати це для реєстрації використання оболонки, створення замків, тестування середовища або, як у вашому прикладі, обчислення часу або ресурсів, витрачених під час виконання команди.
У цьому прикладі ми створимо собі часову позначку орієнтиру перед запуском команди, використовуючи preexec()
потім обчислимо час, витрачений на виконання команди з використанням precmd()
та виведемо її перед запитом, або відімкніть її. Приклад:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Примітка. Для цього конкретного прикладу є ще простіша вбудована функція. Все, що вам потрібно зробити, це увімкнути звітність про виконання у ZSH, і це зробиться автоматично.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
У більш практичній реалізації preexec()
, я використовую його, щоб побачити, чи працює оболонка всередині tmux
або screen
, якщо це так, щоб надіслати інформацію про поточно запущеній команді вище за течією, яка відображатиметься в імені вкладки.
На жаль, в баші цього маленького механізму не існує. Ось одна спроба людини її повторити . Також дивіться відповідь Гілла на подібний чудовий маленький хак.
preexec
, але ви не хочете запускати його всерединіpreexec
(наприкладpreexec() { time $1; }
), тому що оболонка все ще працює післяpreexec
повернення. Тож найкраще, що ми можемо зробити, - це щось подібне.