Принуждение «добавленного» псевдонима к каждой команде

Можно ли принудительно добавить псевдоним времени (из-за отсутствия лучшего способа его фразы) для каждой команды в bash ?

Например, я хотел бы иметь конкретного пользователя, который всякий раз, когда запускается какая-либо команда, всегда привязывается к date до и после или по time .

Возможно ли это, и если да, то как?

Вы можете записать время запуска командной строки и время отображения приглашения. Bash уже отслеживает дату начала каждой командной строки в своей истории, и вы можете отметить время отображения следующей подсказки.

 print_command_wall_clock_time () { echo Wall clock time: \ $(($(date +%s) - $(HISTTIMEFORMAT="%s "; set -o noglob; set $(history 1); echo $2))) } PROMPT_COMMAND=print_command_wall_clock_time$'\n'"$PROMPT_COMMAND" 

Это дает вам второе разрешение и только время настенных часов. Если вам требуется лучшее разрешение, вам нужно использовать команду внешних date которая поддерживает формат %N для наносекунд, а ловушку DEBUG для вызова date до запуска команды до времени.

 call_date_before_command () { date_before=$(date +%s.%N) } print_wall_clock_time () { echo Wall clock time: \ $((date +"$date_before - %s.%N" | bc)) } trap call_date_before_command DEBUG PROMPT_COMMAND=print_command_wall_clock_time 

Даже с ловушкой DEBUG я не думаю, что есть способ автоматически отображать время процессора для каждой команды или быть более дискриминационным, чем подсказка для подсказки.


Если вы хотите использовать другую оболочку, вот как получить отчет о времени для каждой команды в zsh (это не обобщает на другие задачи):

 REPORTTIME=0 

Вы можете установить REPORTTIME на любое целочисленное значение, информация о времени будет отображаться только для команд, которые использовали больше, чем это много секунд времени процессора.

Zsh использовал эту функцию из csh, где переменная называется time .

Ваши варианты здесь будут зависеть от вашей оболочки. В zsh существует функция conveneient hook, называемая preexec() которая запускается прямо перед любыми командами интерактивной оболочки. Создав функцию с этим именем, вы можете заставить вещи выполнять. Вы также можете следить за выполнением функции с именем precmd() которая будет запускаться непосредственно перед тем, как будет нарисовано следующее приглашение, которое будет сразу после завершения вашей команды.

Создавая эту пару функций, вы можете иметь любые произвольные команды, которые вы хотите запустить до и после любых команд, выданных в командной строке. Вы можете использовать это, чтобы регистрировать использование оболочки, создавать блокировки, тестировать среду или, как в вашем примере, вычислять время или ресурсы, потраченные во время выполнения команды.

В этом примере мы создадим себе контрольную метку времени перед запуском команды, используя preexec() затем вычислим время, затрачиваемое на выполнение команды с помощью precmd() и precmd() ее перед приглашением или 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() я использую его, preexec() , работает ли оболочка внутри tmux или screen и, если это так, отправить информацию о текущей запущенной команде вверх по течению, которая будет отображаться в названии вкладки.

К сожалению, в bash этот маленький механизм не существует. Вот попытка одного человека воспроизвести его . Также см . Ответ Жиля о подобном изящном маленьком хаке.

Самый простой способ, вероятно, установить PROMPT_COMMAND . См. Переменные Bash :

PROMPT_COMMAND
Если установлено, значение интерпретируется как команда для выполнения перед печатью каждого первичного приглашения ( $PS1 ).

Например, чтобы избежать перезаписи любой существующей команды приглашения, вы можете сделать следующее:

 PROMPT_COMMAND="date ; ${PROMPT_COMMAND}" 

csh / tcsh имеет лучшую поддержку для этой функции (и всегда ее использовал).

  The `time` shell variable can be set to execute the time builtin command after the completion of any process that takes more than a given number of CPU seconds. 

Другими словами, set time=1 будет распечатывать затраченное время (система, пользователь, истекшее) любой командой, для которой потребовалось более 1 секунды времени процессора. Простое set time позволит распечатать время для всех команд.