Я хотел создать в bash функцию, похожую на псевдоним по умолчанию, который я получил в Ubuntu, и выглядящий так:
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$//'\'')"'
Это создает простое уведомление после того, как с ним была выдана команда. Например, используя
history | grep vim; sleep 5; alert
дает уведомление после завершения сна, просто говоря
history | grep vim; sleep 5;
Вместо этого я хотел бы записать предупреждение в функцию bash, что вызвало некоторые проблемы с регулярным выражением. Я пытался:
function alert2 () {
ICON=$([ $? = 0 ] && echo terminal || echo error)
MSG=$(history | tail -n1 | sed -e s/^\s*[0-9]\+\s*//\;s/[\;\&\|]\s*alert$//)
notify-send --urgency=low -i $ICON $MSG
}
который будет выводить как номер строки в history
при вызове самого себя, так и давать Invalid number of options
при вызове, например, в первом примере.
Возможно ли это, и если да, то как? Это просто мое регулярное выражение неисправно?
Этот тег был добавлен OP, и мы все знаем, о чем идет речь /^\s*[0-9]\+\s*//\;s/[\;\&\|]\s*alert$/
. Теги используются для облегчения поиска вопроса позже другими пользователями. Совершенно не связанные теги не должны использоваться, но некоторые связанные теги имеют свои варианты использования.
Я работаю на WSL, поэтому notify-send
не установлен:
function alert2 () {
ICON=$([ $? = 0 ] && echo terminal || echo error);
MSG=$(history | tail -n1| sed -e 's/^\s*[0-9]\+\s*//;s/[;&|]\s*alert2$//');
echo $ICON $MSG;
}
jadams@Temp046317:~/code/data-extract$ cat /etc/apt/sources.list > /dev/null ; alert2
terminal cat /etc/apt/sources.list > /dev/null
Я надеюсь, что это сработает для вас (вместо echo
):
notify-send --urgency=low -i "$ICON $MSG"
Что ж, теперь он создает правильную строку. К сожалению, он по-прежнему сообщает об ошибке «Недопустимое количество параметров» при вызове sleep 1; alert2
(я думаю, мне нужно лучше познакомиться с функциями Bash..)
как ни странно, у меня это сработало (с echo
): jadams@Temp046317:~/code/data-extract$ sleep 1 ; alert2 terminal sleep 1
... вы добавили кавычки о $ICON $MSG
, как в моем примере?
Блин, я забыл об этом .. Спасибо за ответ, теперь он работает отлично!
Вам нужны одинарные кавычки вокруг этого сценария sed, как и в вашем псевдониме.