Последняя команда и время выполнения

Я хотел бы использовать последнюю команду и ее время выполнения. Это будет использоваться в качестве части псевдонима для уведомления.

2
задан 11 November 2014 в 00:49

2 ответа

Последняя команда сохраняется в истории. Bash имеет fc команда, которая предоставляет Вам доступ к той информации (от man bash):

fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [cmd]

первая форма выбирает диапазон команд от начала до конца из списка предыстории и отображает или редактирует и повторно выполняет их. В общем и целом может быть определен как строка (для определения местоположения последней команды, начинающейся с той строки) или как число (индекс в список предыстории, где отрицательное число используется в качестве смещения от текущего числа команды). Если в последний раз не определяется, это установлено на текущую команду для списка (так, чтобы ''ФК-l-10'' печати последние 10 команд) и к первому иначе. Если сначала не определяется, это установлено на предыдущую команду для редактирования и-16 для списка.

-n опция подавляет числа команды при списке.-r опция инвертирует порядок команд. Если-l опция дана, команды перечислены на стандартном выводе. Иначе редактор, данный ename, вызывается на файл, содержащий те команды. Если ename не дан, значение переменной FCEDIT используется, и значение РЕДАКТОРА, если FCEDIT не установлен. Если никакая переменная не установлена, vi используется. Когда редактирование завершено, отредактированные команды отражены и выполнены.

Во второй форме, команда повторно выполняется после того, как каждый экземпляр кусочка заменяется командой представителя, intepreted то же как сначала выше. Полезный псевдоним для использования с этим r="fc -s"'', so that typing, r cc'' выполняет последнюю команду, начинающуюся cc'' and typing, r'' повторно выполняет последнюю команду.

, Если первая форма используется, возвращаемое значение 0, если с недопустимой опцией не встречаются или сначала или в последний раз определите строки истории из диапазона. Если-e опция предоставляется, возвращаемое значение является значением последней выполняемой команды или отказ, если ошибка происходит с временным файлом команд. Если вторая форма используется, статус возврата является статусом возврата повторно выполняемой команды, если cmd не определяет допустимую строку истории, в этом случае отказ возвратов ФК.

существует также команда, названная history. Руководство объясняет это в деталях. Я не слишком уверен, какой лучше соответствовал бы Вашим потребностям.

Далее, для получения времени можно хотеть изучить установку HISTTIMEFORMAT. Однако я не слишком уверен, как Вы могли получить доступ к количеству времени, проведенному процессом. Возможно, TIMEFORMAT должен использоваться вместо этого. Иначе Unix путь должен выполнить команду с эти time команда. Это генерирует вывод различного времени и ресурсов, используемых процессом при выполнении.

Из руководства (man time):

время запускает программу КОМАНДА с любым данным АРГУМЕНТОМ аргументов, Когда КОМАНДА заканчивается, информация об отображении времени о ресурсах, используемых КОМАНДОЙ (на выводе стандартной погрешности, по умолчанию). Если КОМАНДА выходит с ненулевым состоянием, отображение времени предупреждающее сообщение и статус выхода.

0
ответ дан 20 November 2019 в 00:18

Примечание: Я принимаю bash как оболочка.

Адаптация к другим оболочкам не должна быть трудной.

Получение последней используемой команды тривиально: это хранится в указателе события оболочки !!, и может также быть получен с помощью оболочки builtins fc (fc -s) или history (с некоторой строкой manuipluation: history 1 | awk '{$1=""}1').

Получение времени выполнения, или время выполнения, однако, не, если некоторые меры не приняты, прежде чем команда выполнилась. После того как команда выполняется, ничто не может быть сделано - лошади соединились болтом.

Для получения времени выполнения, также:

  1. Установите HISTTIMEFORMAT переменная, которая сделала бы bash сэкономьте время выполнения в истории, затем используйте обработку текста для извлечения времени из вывода history.
  2. Используйте обертку для сохранения времени выполнения вручную.

Для получения времени выполнения, снова, также:

  1. Если Вы установили HISTTIMEFORMAT прежде, чем выполнить команду, Вы могли проанализировать вывод history получить время выполнения и затем вычислить время выполнения.
  2. Используйте обертку для выполнения команды с time: time some-command. Обработка вывода time немного грязно, если Вы хотите оставить вывод команды нетронутым.
  3. Используйте обертку для вычисления времени выполнения на основе вручную сохраненного времени выполнения.

С HISTTIMEFORMAT набор

Если Вы устанавливаете HISTTIMEFORMAT переменная, затем Вы не должны использовать обертку. Во-первых, в Вашем .bashrc, набор HISTTIMEFORMAT. Можно установить его на что-либо, пока это не пусто. Если Вы не хотите Ваш history управляйте для показа времени, Вы могли установить его на пространство (HISTTIMEFORMAT=" ").

Теперь, существует псевдоним, существующий в значении по умолчанию .bashrc из Ubuntu:

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Мы можем адаптировать его к нашим целям:

alert_post () 
{ 
    RET=$?;
    END=$(date '+%s');
    LAST_COMM="$(HISTTIMEFORMAT='%s '; history 1)";
    START=$(awk '{print $2}' <<<"$LAST_COMM");
    START_TIME=$(date -d"@$START" '+%T %D');
    COMM=$(awk '{print $3}' <<<"$LAST_COMM");
    notify-send --urgency=low -i "$([ $RET = 0 ] && echo terminal || echo error)" "$COMM started at $START_TIME finished in $((END - START)) seconds.";
    return $RET
}
alias a=alert_post

Можно использовать его таким образом:

$ sleep 10; a

Функция обертки

Используя функцию или сценарий для переноса команды:

alert_wrapper () 
{ 
    START=$SECONDS;
    START_TIME=$(date '+%T %D');
    COMM="$1";
    "$@";
    RET=$?;
    END=$SECONDS;
    notify-send --urgency=low -i "$([ $RET = 0 ] && echo terminal || echo error)" "$COMM started at $START_TIME finished in $((END - START)) seconds."
    return $RET
}
alias a=alertwrapper

Затем выполните свою команду, снабженную префиксом a:

$ a sleep 10

Примечания:

  1. Существует много способов получить время, и выполнение и время выполнения. Я использовал обоих $SECONDS специальная переменная и date команда. Вы могли обойтись только date команда.
  2. Я использовал notify-usd, который должен быть доступным на стандартной Ubuntu. Вы могли посмотреть на другие способы произвести уведомления.
  3. Я сохранил статус выхода команды в $RET и возвратил его, таким образом, необходимо смочь полагаться на коды выхода: do-something; a || echo "Couldn't do something." или a do-something || echo "Couldn't do something." будет echo если do-something имел ненулевой статус выхода.
2
ответ дан 2 December 2019 в 03:58

Другие вопросы по тегам:

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