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

Другая опция была бы mmv, если установлено.

mmv \*\ \* \#1_#2
11
26.04.2011, 20:20
6 ответов

Можно записать время, командная строка запускается и время, подсказка отображена. 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.

10
27.01.2020, 19:58

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

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

3
27.01.2020, 19:58
  • 1
  • 2
  • 3
    это было доступно в ударе! –  warren 27.04.2011, 22:46
  • 4
    Посмотрите Gilles и ссылки других, это реализуемо в ударе с небольшой дополнительной игрой. Снова, почему Вы просто не выполняете zsh? Это - качающаяся оболочка с большим количеством серьезных оснований переключиться, чем просто это! –  Caleb 27.04.2011, 22:48
  • 5
    При использовании zsh существует еще лучший способ сделать это. Переменная среды REPORTTIME, когда установленный произведет информацию о времени выполнения (как будто Вы выполнили команду со 'временем' перед нею) для любой команды, занимающей больше времени, чем секунды $REPORTTIME. Просто установите его на 0, и это должно определить Вам время для каждой команды с user/sys разбивкой для начальной загрузки. –  Joseph Garvin 28.04.2011, 02:54

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

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

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

PROMPT_COMMAND="date ; ${PROMPT_COMMAND}"
1
27.01.2020, 19:58
  • 1
    , не знал, о котором - похож на хорошее начало, @cjm –  warren 26.04.2011, 21:12
  • 2
    Это - запуск, но не решает проблему знания, когда команда была выполнена. Сама подсказка могла бы быть оттянутыми минутами или часами или за дни до того, как команда была введена и выполнена. –  Caleb 27.04.2011, 02:17

Я знаю, что вы нашли свой собственный ответ, но есть ли причина, по которой вы не можете сделать что-то подобное:

(set -x; for f in 1 2 3 4 ; do  echo "$f"; sleep $f; done)

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

Кроме того, FWIW, если вы предпочитаете многообразие, Set -o xtrace .

-121--15064-

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

  «Переменная оболочки» может быть установлена ​​на выполнение команды времени встроенного времени
  После завершения любого процесса, который занимает больше, чем данный номер
  процессовых секунд.
 

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

0
27.01.2020, 19:58

Как указал wjandrea , ответ Жиля не работает,

  • отчасти из-за косметических причин, которые исправила wjandrea, и
  • отчасти потому, что запускается команда ловушки DEBUG непосредственно перед выполнением команды PROMPT _COMMAND, поэтому вы теряете время начала введенной пользователем команды -прошедшее время которого вы пытаетесь измерить.

К счастью, команда ловушки DEBUG может сказать, когда это происходит и может защититься от него. Итак, опираясь на ответ Жиля (объединив его с фрагментами ДНК моего очень похожего ответа здесь ), мы можем построить

call_date_before_command () {
  if [ "$BASH_COMMAND" != "print_wall_clock_time" ]
  then
        command_flag=1
        date_before=$(date +%s.%N)
  fi
}
print_wall_clock_time () {
  if [ "$command_flag" ]
  then
        echo "Wall clock time: $(date +"%s.%N - $date_before" | bc)"
  fi
  command_flag=
}
trap call_date_before_command DEBUG
PROMPT_COMMAND=print_wall_clock_time

где call_date_before_commandничего не делает если он вызывается непосредственно перед запуском print_wall_clock_time, и print_wall_clock_timeсообщает информацию только если пользователь действительно выполнил команду (, а не просто нажал Enter ).

Вы можете переименовать call_date_before_command, command_flagи print_wall_clock_timeк чему-то вроде Twas_brillig_and_the_slithy_toves, Did_gyre_and_gimble_in_the_wabeи All_mimsy_were_the_borogoves, чтобы уменьшить вероятность что вы непреднамеренно переопределите один из интерактивных.

1
29.08.2020, 21:24

Это основано на print_command_wall_clock_timeиз ответа Gilles , но изменено, чтобы учесть повторяющиеся команды и случаи, когда вы на самом деле не запускаете новую команду, просто нажмите введите в командной строке. Он также сохраняет тайминги в массиве. А еще я подчистил метод получения инфы из history.

# don't put lines starting with space in the history.
HISTCONTROL=ignorespace

_last_command_time () {
    # Get the real time the last command took to run, in seconds.
    #
    # Must be set up in PROMPT_COMMAND to get the correct end time.
    #
    # Uses "history" to get the start time, so won't work properly for
    # duplicate commands if you have "HISTCONTROL=ignoredups" enabled.
    #
    # Records times by history number in global array "COMMAND_TIMES".

    local n prev

    # Get command number and start time in seconds
    read -r n prev _ <<< "$(HISTTIMEFORMAT="%s "; history 1)"

    if ! [[ ${COMMAND_TIMES[$n]} ]]; then  # If it's not already recorded
        COMMAND_TIMES+=( [$n]=$(( $(date +%s) - prev )) )
    fi

    printf 'Last command time: %s\n' "${COMMAND_TIMES[$n]}"
}

PROMPT_COMMAND=_last_command_time
1
29.08.2020, 22:04

Теги

Похожие вопросы