Bash 4.3 и более поздние версииподдерживают «ссылки на имена» или namerefs (аналогичная концепция существует в ksh93
, но область видимости раздражает different):
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in "${array_names[@]}"; do
declare -n arr="$a"
for b in "${arr[@]}"; do
echo "$b"
done
done
Переменная arr
является ссылкой на имя, которая действует как псевдоним для именованной переменной (в данном примере это переменная с именем $a
).
Без ссылок namerefs в более ранних версиях Bash одним из решений было бы создание нового массива, содержащего все элементы из других массивов:
all=( "${array1[@]}" "${array2[@]}" )
... немного похоже на массив array_names
в вопрос, но с содержимым всех массивов, а затем перебрать "${all[@]}"
.
Также можно использовать eval
, но полученный код выглядит поразительно ужасно.
См. ответ glenn jackman для варианта с переменной косвенностью (представленный в его текущей форме с Bash версии 2).
Ответ таков: ничего особенного не происходит. Вы заменяете свой процесс, exec
ing -разветвленный процесс знает только, что его родительский pid равен 1, ему все равно, был ли этот процесс systemd или каким-то initramfs /init
. Единственный сомнительный момент заключается в том, что это будет демон без службы systemd, поэтому ведение журнала, перезапуск и т. д. не будут работать должным образом --, если вы специально не создадите свою собственную службу, которая «прикрепляется» к разветвленному процессу (, вероятно. не очень сложно, учитывая, что он должен иметь детерминированный pid и т. д. ).
Обычно не рекомендуется оставлять -код initramfs работающим после обычной загрузки именно по этим причинам, но это не приведет к краху вашей системы. В полях комментариев кhttps://lwn.net/Articles/657345/есть интересные обсуждения, где это кратко обсуждается.