Измените “аварийный” псевдоним в ~/.bashrc

Система: Lubuntu 14.04 LTS

Я хочу знать, возможно ли изменить alert псевдоним, обеспеченный в ~/.bashrc конкретным способом. Это - оригинал alert:

# 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$//'\'')"'

Использование псевдонима по умолчанию “предупреждение” объясняет, что это делает.

И вот пример уведомления по умолчанию в моей системе (использование xfce4-notify) когда я работаю ls; alert который, конечно, завершается успешно:

01Default-alert

Если я выполняю бессмысленную команду, asdfgh; alert, Я вижу это:

02Nonsense-command

terminal значок был заменен error значок из-за

-i "$([ $? = 0 ] && echo terminal || echo error)"

На данный момент уведомление имеет всего два объекта:
- значок, который является terminal или error в зависимости от успеха "предыдущей" команды
- сама команда (ls в первом случае и asdfgh во втором)

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

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "Task finished" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Затем если я работаю ls; alert и asdfgh; alert Я показал уведомления ниже.

Task finished successfully

Something went wrong

Мой вопрос - это: Обе выставочных задачи "Уведомлений, законченные", но, могут та же логика, которая используется, чтобы решить ли terminal значок или error значок показан быть примененным снова для определения, какую текстовую строку показывают выше команды? Так, если terminal дисплеи значка, текст был бы "Задачей, законченной", но если error дисплеи значка, текст мог, что-то как "Что-то пошло не так, как надо!"

5
задан 13 April 2017 в 15:24

1 ответ

Tl; доктор

Использование это:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p")"'
<час>

Просто оценка $? снова не будет работать, потому что к этому времени $? был бы оценен во второй раз, когда она будет содержать первый subsitution's команды ($([ $? = 0 ] && echo terminal || echo error) 's) статус выхода (всегда 0 начиная с два echo, с всегда успешно выполнялась бы). Прием для обхождения этого заставил бы первую замену команды выйти с эквивалентным статусом выхода снова:

$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))

Этот путь $? мог быть оценен во второй раз для решения который строка распечатать:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]+\s*//;s/[;&|]\s*alert$//'\'')"'

На другой ноте Ваш history|tail -n1|sed -e '\''s/^\s*[0-9]+\s*//;s/[;&|]\s*alert$//'\'' является немного сверхзамысловатым. Это было бы более читаемым путем:

history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p"

Так, заключительная команда:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p")"'

можно протестировать путем выполнения (exit 0); alert и (exit 1); alert.

3
ответ дан 14 April 2017 в 01:24

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

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