Проблема заключается в том, что подстановка вашей команды расширяется до строки с разделителями -из пробелов, и цикл повторяется по всем словам в этой строке. «Слово» — это что-либо, разделенное пробелом, табуляцией или символом новой строки.
Также обратите внимание, что в Bourne -, как и в оболочках, отличных от zsh
, эти слова в дальнейшем подлежат генерации имени файла (, также известному как подстановка ), поэтому символы подстановки (и {
в некоторых оболочках )также будет проблемой в дополнение к пробелу и табуляции.
lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort |
while IFS= read -r lpar; do
echo "$lpar"
done
Здесь используется цикл while
вместо статического цикла for
. Тело цикла while
выполняется в подоболочке (в bash
), поэтому переменная lpar
не будет существовать после окончания тела цикла. Это не проблема, если вы используете переменную только в теле цикла.
Связанные:Понимание «IFS= чтение -r строки»
Другим решением было бы установить IFS
на новую строку перед циклом (и сбросить его после этого):
oldIFS=$IFS
IFS=$'\n' # assumes bash
set -o noglob
for lpar in $( lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort )
do
echo "$lpar"
done
set +o noglob
IFS=$oldIFS
Значение по умолчанию $IFS
включает пробелы, поэтому исходный цикл выполняет итерации по неправильным вещам. Я также отключил подстановку имен файлов для цикла, так как в противном случае мы могли бы получить неожиданные результаты, если текст, возвращаемый из lssyscfg
, включает шаблоны подстановок имен файлов, как обсуждалось выше.
Этот последний вариант, ИМХО, довольно неэлегантен и совершенно не подходит для команд, которые выводят более нескольких строк вывода.
Насколько я понимаю, вы хотите запустить службу до того, как сработает какая-то цель. В этом случае вы можете поместить свою службу в цель, которая находится перед default.target. См.https://www.freedesktop.org/software/systemd/man/bootup.html
Обратите внимание, что все цели на этой странице, находящиеся на одном уровне, выполняются одновременно.
PS :Не могу комментировать вопрос. Это не может быть правильным ответом.