Есть такая конструкция:
eval `sed '/^prestart:/!d;s/^prestart://' "$SCRIPT"`
В файле «$SCRIPT» лежат строки. Некоторые из них имеют вид «prestart:команда». Надо достать команды из каждой такой строки и выполнить по очереди. Если $IFS будет равен переводу строки (по умолчанию в нём пробел, LF и tab), то команды выполнятся по очереди. Иначе все команды объединяются в одну строку, что неправильно.
Необходимо записать в переменную $IFS один символ перевода строки, чтобы конструкция выше правильно выполнялась.
- Пробовал так:
IFS='\n'
Это записывает в $IFS текст '\n', не работает.
- Пробовал так:
IFS=' '
Это записывает в $IFS перевод строки, echo -n «$IFS» печатает пустую строку, но конструкция неправильно работает (всё-таки сливает все команды в одну).
- Ещё я пробовал так:
IFS=`echo`
Так всё работает правильно.
Собственно, вопросы:
- Чем отличаются способы 2 и 3? Почему 3 работает, а 2 - нет?
- Как можно это сделать по-человечески, не вызывая echo? Это часть init-скриптов, которые я потихоньку пилю для своей системы, надо, чтобы всё работало как можно быстрее. [Код из парсера файлов, в которых прописано, как запускать демон; аналог юнитов в systemd. prestart - это те команды, которые выполнятся до запуска демона.]
PS Если есть ещё идеи по оптимизации выражения в sed, просьба написать, т.к. тут важна скорость работы.