Вот что я придумал примерно через 5-10 минут, просто играя с AWK.
$ select entry in $(awk '{printf "%s-%s ",$1,$2}' ips.txt) ; do
> ip_address=$(awk -F '-' '{print $1}' <<< "$entry" )
> echo "You selected " "$ip_address"
> done
1) 127.0.0.1-us
2) 127.0.0.2-uk
3) 127.0.0.3-cn
4) 127.0.0.4-fr
5) 127.0.0.5-ru
6) 127.0.0.6-bd
7) 127.0.0.7-hk
#? 2
You selected 127.0.0.2
Трудная часть вашего вопроса - это просто обработка строк текстового файла, который может быть соответствующим образом использован структурой select, потому что у вас есть две записи в строке. Ну, почему бы не превратить их в один элемент и просто отправить процесс для извлечения ip-адреса? Это именно то, что я делаю в коде выше.
Обратите внимание, что первая подстановка параметров не задана без кавычек - мы хотим, чтобы первая команда расширялась до каждого отдельного элемента, разделенного пробелами, мы не хотим, чтобы он рассматривался как одна строка.
Что хорошего в этом подходе, так это то, что он невосприимчив к отсутствующему местоположению, например, если в выборе # 2 uk отсутствует, мы все равно будем читать 127.0.0.2
Здесь много магии, но на Ubuntu 18.04 ответ обычно кажется zfs.target, который указан как WantedBy для всех различных zfs-*.service s ( mount, modprobe и т. д.). Вы увидите это, если будете читать через
more /lib/systemd/system/zfs* | less
. Вы можете заметить, что есть и zfs-import.target, который выполняется после того, как zpool import запущен, но до того, как монтируются файловые системы.
В моем случае, однако, есть и другие шаги, которые должны произойти сначала (например, шифрование блочного устройства), поэтому они не будут работать из коробки для меня.
Для конкретных точек монтирования я бы рекомендовал не полагаться на общий zfs.target, а скорее добавить свой собственный сервис (возможно, с Wants=zfs.target), который проверяет состояние конкретных монтировок, на которые опирается ваша система. Например, если вы полагаетесь на установленный /blah/my/zfs/mount, просто создайте службу для того, что может проверить статус монтирования zfs перед возвратом, возможно, с помощью
zfs get mounted blah/my/zfs/mount | grep yes
/etc/systemd/system/my-zfs-mount.service
[Unit]
Description=ZFS mount blah/my/zfs/mount
Wants=zfs.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/zfs get mounted blah/my/zfs/mount | grep yes
[Install]
WantedBy=multi-user.target
И тогда ваши другие сервисы могут зависеть от этого.
Здесь много магии, но на Ubuntu 18.04 ответ обычно кажется zfs.target, который указан как WantedBy для всех различных zfs-*.service s ( mount, modprobe и т. д.). Вы увидите это, если будете читать через
more /lib/systemd/system/zfs* | less
. Вы можете заметить, что есть и zfs-import.target, который выполняется после того, как zpool import запущен, но до того, как монтируются файловые системы.
В моем случае, однако, есть и другие шаги, которые должны произойти сначала (например, шифрование блочного устройства), поэтому они не будут работать из коробки для меня.
Для конкретных точек монтирования я бы рекомендовал не полагаться на общий zfs.target, а скорее добавить свой собственный сервис (возможно, с Wants=zfs.target), который проверяет состояние конкретных монтировок, на которые опирается ваша система. Например, если вы полагаетесь на установленный /blah/my/zfs/mount, просто создайте службу для того, что может проверить статус монтирования zfs перед возвратом, возможно, с помощью
zfs get mounted blah/my/zfs/mount | grep yes
/etc/systemd/system/my-zfs-mount.service
[Unit]
Description=ZFS mount blah/my/zfs/mount
Wants=zfs.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/zfs get mounted blah/my/zfs/mount | grep yes
[Install]
WantedBy=multi-user.target
И тогда ваши другие сервисы могут зависеть от этого.