Я хотел бы использовать последнюю команду и ее время выполнения. Это будет использоваться в качестве части псевдонима для уведомления.
Последняя команда сохраняется в истории. 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
):
время запускает программу КОМАНДА с любым данным АРГУМЕНТОМ аргументов, Когда КОМАНДА заканчивается, информация об отображении времени о ресурсах, используемых КОМАНДОЙ (на выводе стандартной погрешности, по умолчанию). Если КОМАНДА выходит с ненулевым состоянием, отображение времени предупреждающее сообщение и статус выхода.
bash
как оболочка.Адаптация к другим оболочкам не должна быть трудной.
Получение последней используемой команды тривиально: это хранится в указателе события оболочки !!
, и может также быть получен с помощью оболочки builtins fc
(fc -s
) или history
(с некоторой строкой manuipluation: history 1 | awk '{$1=""}1'
).
Получение времени выполнения, или время выполнения, однако, не, если некоторые меры не приняты, прежде чем команда выполнилась. После того как команда выполняется, ничто не может быть сделано - лошади соединились болтом.
Для получения времени выполнения, также:
HISTTIMEFORMAT
переменная, которая сделала бы bash
сэкономьте время выполнения в истории, затем используйте обработку текста для извлечения времени из вывода history
. Для получения времени выполнения, снова, также:
HISTTIMEFORMAT
прежде, чем выполнить команду, Вы могли проанализировать вывод history
получить время выполнения и затем вычислить время выполнения.time
: time some-command
. Обработка вывода time
немного грязно, если Вы хотите оставить вывод команды нетронутым.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
Примечания:
$SECONDS
специальная переменная и date
команда. Вы могли обойтись только date
команда. notify-usd
, который должен быть доступным на стандартной Ubuntu. Вы могли посмотреть на другие способы произвести уведомления.$RET
и возвратил его, таким образом, необходимо смочь полагаться на коды выхода: do-something; a || echo "Couldn't do something."
или a do-something || echo "Couldn't do something."
будет echo
если do-something
имел ненулевой статус выхода.