Я пишу сценарий bash, который зацикливается на выводе подстановки команды, а затем пытается выполнить другую подстановку команды в теле цикла. Вот код:
#!/usr/bin/bash
IFS=$'\n'
for i in $( xmllint --xpath "string(/*[local-name()='Project'])" gsGDAL/gsGDAL.vcxproj.user )
do
IFS=' ' #attempted with and without this line
"$( awk -F= '{printf("export %s=\"%s\"", $1, $2)}' <(echo $i) )"
IFS=$'\n' #attempted with and without this line
done
Я устанавливаю IFS на новую строку, чтобы цикл перебирал каждую СТРОКУ вывода команды xmllint, а не перебирал каждое слово, разделенное пробелами. Однако это приводит к сбою подстановки команд в цикле. Некоторая отладка привела к выводу, что суть проблемы такова:
#!/usr/bin/bash
IFS=$'\n'
$(echo export TEST="test")
что дает ошибку:
./x.sh: line 6: export TEST=test: command not found
Вы можете видеть, что я попытался исправить ошибку в первом примере кода, сбросив IFS в цикле. Это не сработало.
Я понимаю, что могу решить проблему, используя другую идиому для скрипта.
например. процесс, заменяющий команду xmllint на awk вместо выполнения awk в каждой отдельной строке, чтобы назвать одну возможность. Комментарии по этому поводу приветствуются, однако, пожалуйста, присылайте ответы, относящиеся к следующему:
- Почему установка IFS на новую строку портит сгенерированный подстановкой команды экспорт?
- Почему сброс IFS в цикле не решает проблему?
ОБНОВЛЕНИЕ: Согласно обсуждению с Бармаром, IFS используется для разделения слов после расширения команды/переменной.