Здесь используются не регулярные выражения, а шаблоны подстановки имен файлов.
[...]
всегда будет соответствовать только одному символу (это происходит одинаково между шаблонами подстановки имен файлов и регулярными выражениями ), поэтому он не соответствует трем символамcho
([cho]
означает «один из c
, h
и o
").
Чтобы сопоставить все имена, начинающиеся с a.
, используйте a.*
.
Чтобы сопоставить все имена, начинающиеся с a.
, а затем сразу заканчивающиеся на c
, h
, o
или cho
, сначала установите параметр оболочки extglob
с shopt -s extglob
и используйте a.@([cho]|cho)
.
Раскрытие фигурных скобок, например a.{c,h,o,cho}
, будет генерировать имена файлов в командной строке, но не дает гарантии, что эти файлы действительно существуют.
Любые программы, запускаемые из задания cron, не являются частью сеанса вашего рабочего стола, поэтому они могут работать вне зависимости от того, вошли вы в систему или нет.
Это означает, что они не получат DBUS_SESSION_BUS_ADDRESS
переменную окружения,который необходим notify-send
для доступа к сеансу D -Bus, чтобы он мог отправить уведомление.
Значением по умолчанию для этой переменной для KDE, по-видимому, является unix:path=/run/user/<your_UID>/bus
в Debian 10, и /run/user/<your_UID>/
доступно только для вашей учетной записи пользователя. Для Gnome это кажется другим :что-то вроде unix:abstract=/tmp/dbus-0VDJayoNDs,guid=9897d6d93070adc85634b1fb5f631033
, и я предполагаю, что оно меняется при каждом входе в систему.
Итак, если задание cron запущено для вашей учетной записи, вы можете сделать что-то вроде этого:
Сначала создайте сценарий, который будет запускаться при входе в систему через графический интерфейс. Поместите его где угодно, например. ~/bin/record-session-bus-address.sh
например. Пометить его как исполняемый(chmod a+x ~/bin/record-session-bus-address.sh
). Содержимое скрипта должно быть таким:
#!/bin/sh
echo "$DBUS_SESSION_BUS_ADDRESS" > $HOME/.local/session_bus_address
chmod 600 $HOME/.local/session_bus_address
Добавить файл ~/.config/autostart/record-session-bus-address.desktop
со следующим содержимым:
[Desktop Entry]
Name=record-session-bus-address
GenericName=Record session bus address
Comment=Record session bus address for a cron job
Exec=~/bin/record-session-bus-address.sh
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
Затем сделайте задание cron следующим образом:
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if [ $battery_level -le 4 ]
then
myUID=$(id -u)
if [ -f $HOME/.local/session_bus_address ]
then
# Faramarz may be logged in
export DBUS_SESSION_BUS_ADDRESS=$(cat $HOME/.local/session_bus_address)
# strip prefix and suffix to get the plain dbus socket name
DBUS_SOCKET_PREFIXED=${DBUS_SESSION_BUS_ADDRESS%%,guid=*}
DBUS_SOCKET_PLAIN=${DBUS_SOCKET_PREFIXED##unix:abstract=}
else
# Not logged in, make sure the next test fails
DBUS_SOCKET_PLAIN=/dev/definitely_does_not_exist
fi
if [ -w "$DBUS_SOCKET_PLAIN" ]
then
# Faramarz is definitely logged in, send a notification
notify-send "Battery low" "Battery level is ${battery_level}%!"
else
# Faramarz is not logged in, do something else.
# This example requires /etc/sudoers entry like this:
# Faramarz ALL=(root) NOPASSWD: /usr/bin/beep
sudo beep -l 1000 -f 2700 -n -l 1000 -f 2000 -n -l 1000 -f 1000
fi
fi