Система: 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
который, конечно, завершается успешно:
Если я выполняю бессмысленную команду, asdfgh; alert
, Я вижу это:
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
Я показал уведомления ниже.
Мой вопрос - это: Обе выставочных задачи "Уведомлений, законченные", но, могут та же логика, которая используется, чтобы решить ли terminal
значок или error
значок показан быть примененным снова для определения, какую текстовую строку показывают выше команды? Так, если terminal
дисплеи значка, текст был бы "Задачей, законченной", но если error
дисплеи значка, текст мог, что-то как "Что-то пошло не так, как надо!"
Использование это:
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
.