Я бы порекомендовал протестировать что-то вроде этого:
# /etc/systemd/system/foo.service
[Unit]
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/logger -t foo "testing online target"
[Install]
WantedBy=multi-user.target
Затем следует:
# systemctl daemon-reload && systemctl enable foo.service
Две части:
echo
или printf
. Для ключевых привязок для readline требуется одно имя функции или строка литерала. В данном примере readline считывает то, что считает возможным именем функции, и игнорирует остальную часть строки.
Так что: нет, bash/readline не обеспечивают никаких полезных функций для эхирования escape-последовательности непосредственно в качестве привязки ключа. Как уже отмечалось, необходимо перейти на другой уровень с помощью эхо
.
При появлении запроса % N
дает это (текущий сценарий/исходный файл/функция).
Таким образом, вы можете сделать:
print -P %N
или получить его от $ {(%): -% N}
.
См. также $ funcsourcetrace
для файлов стека вызовов.
Поскольку вы не можете зависеть от системной службы, единственным решением является предоставление пользовательской службы, которая определяет, находится ли сеть в сети. (Или сделать свои услуги системными службами.) Сведения о пользовательском сервисе "detect-online" будут зависеть от вашего определения "online". Это может ждать, когда пинг до 8.8.8.8 будет успешным, например. Или для успешного разрешения DNS-имен. Например, в подобной ситуации с vpnc я жду успешного выполнения команды ping для vpn IP.
Затем вы можете сделать свои пользовательские услуги зависимыми от (After =) вашей службы обнаружения пользователей в Интернете.
#!/bin/sh
host="${1:-8.8.8.8}"
pingcheck() {
ping -n -c 1 -w 5 $1 >/dev/null 2>&1
}
# Do you want a timeout ?
while :; do
pingcheck ${host} && exit 0
sleep 10
done
Поскольку эта тема занимает первое место в результатах поиска Google, я предлагаю альтернативное решение для всех, кто столкнется с такой же проблемой.
В моей системе я добавил упрощенный эквивалент/lib/systemd/system/systemd-networkd-wait-online.service
(WantedBy=network-online.target
)и сохранил его в каталоге пользовательских сервисов:
[Unit]
Description=User Wait for Network to be Configured
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes
[Install]
WantedBy=default.target
Затем я сделал свои пользовательские сервисы зависимыми от этого нового:
Wants=networkd-wait-online.service
After=networkd-wait-online.service
Однако Wants=
не кажется необходимым из-за WantedBy=default.target
. Вы можете удалить WantedBy=default.target
, чтобы сделать network-wait-online.service
необязательным, но тогда вам определенно понадобится Wants=network-wait-online.service
.
Исходная служба systemd-networkd-wait-online.service
содержит больше зависимостей, но, похоже, они не работают в контексте пользователя. Кто-то может предоставить пользовательские эквиваленты для всех этих зависимостей, например. используя systemctl --user link
вместо network.target
и network-online.target
, как и в других предложениях здесь, но я решил не усложнять;)
Обратите внимание, что, несмотря на создание символической ссылки на системную службу, вы НЕ говорите своему systemd --user
менеджеру использовать некоторые события от systemd --system
менеджера для наблюдения за состоянием системной службы, но заставить ее работать. другой экземпляр этой службы из пользовательского контекста.