Можно ли принудительно добавить псевдоним синхронизации (из-за отсутствия лучшего способа выразить его) для каждой команды в bash
?
Например, я хотел бы иметь конкретного пользователя, который всякий раз, когда команда запускается, она всегда переносится либо с date
до и после, либо time
.
Возможно ли это, и если да, то как?
preexec
, но вы не хотите запускать его внутриpreexec
(напримерpreexec() { time $1; }
), потому что оболочка все еще запускает его послеpreexec
возврата. Поэтому лучшее, что мы можем сделать, это нечто подобное.preexec()
функцию, чтобы фактически обернуть то, что выполнялось, извлекая команду, запуская ее изнутри функции, а затем возвращая какую-то ошибку, чтобы оболочка не выполняла саму команду.Ответы:
Вы можете записать время запуска командной строки и время отображения подсказки. Bash уже отслеживает дату начала каждой командной строки в своей истории, и вы можете отметить время, когда вы отображаете следующее приглашение.
Это дает вам только второе разрешение и только время настенных часов. Если вам нужно лучшее разрешение, вам нужно использовать внешнюю
date
команду, которая поддерживает%N
формат наносекунд, иDEBUG
ловушку для вызоваdate
перед выполнением этой команды.Даже с
DEBUG
ловушкой я не думаю, что есть способ автоматически отображать время процессора для каждой команды или быть более разборчивым, чем подсказка для подсказки.Если вы хотите использовать другую оболочку, вот как получить отчет о времени для каждой команды в zsh (это не распространяется на другие задачи):
Вы можете установить
REPORTTIME
любое целочисленное значение, информация о синхронизации будет отображаться только для команд, которые использовали больше, чем это много секунд процессорного времени.Zsh взял эту функцию из csh, где вызывается переменная
time
.источник
Ваши варианты здесь будут зависеть от вашей оболочки. Там
zsh
есть удобная функция ловушки,preexec()
которая вызывается прямо перед любой интерактивной командой оболочки. Создав функцию с этим именем, вы можете заставить вещи выполняться. Вы также можете воспользоваться функцией,precmd()
которая будет запущена непосредственно перед отображением следующего приглашения, которое будет выполнено сразу после завершения вашей команды.Создав эту пару функций, вы можете иметь любые произвольные команды, которые вы хотите выполнить до и после любых команд, введенных в командной строке. Вы можете использовать это для регистрации использования оболочки, создания блокировок, тестирования среды или для расчета времени или ресурсов, потраченных во время выполнения команды.
В этом примере мы создадим метку времени для эталонного теста перед запуском команды с помощью,
preexec()
затем рассчитаем время, потраченное на выполнение команды с помощью,precmd()
и выведем ее перед запросом или выйдем из системы. Пример:Примечание: для этого конкретного примера есть еще более простая встроенная функция. Все, что вам нужно сделать, это включить отчеты о времени выполнения в ZSH, и это будет сделано автоматически.
В более практической реализации
preexec()
я использую его, чтобы увидеть, работает ли оболочка внутриtmux
или,screen
и, если да, для отправки информации о выполняющейся в данный момент команде в восходящем направлении для отображения в имени вкладки.К сожалению, в bash этот маленький механизм не существует. Вот попытка одного человека повторить это . Также см . Ответ Жиля для подобного изящного маленького взлома.
источник
Самый простой способ, вероятно, установить
PROMPT_COMMAND
. Смотрите переменные Bash :Например, чтобы избежать перезаписи любой существующей команды приглашения, вы можете сделать:
источник
csh
/tcsh
имеет лучшую поддержку для этой функции (и всегда имел ее).Другими словами,
set time=1
будет распечатано время, затраченное (система, пользователь, истекшее) любой командой, которая заняла более 1 секунды времени процессора. Обычныйset time
позволит распечатать время для всех команд.источник