Итак, у меня возникла эта безумная идея встроить документацию в мои скрипты (что не является чем-то новым, просто новым для меня) и проанализировать их с помощью sed. Я добиваюсь этого, просто закомментировав блок текста с разделителями строк, а затем вытолкнув хеш комментария (в каждой строке), когда я печатаю строку в стандартный вывод.
В качестве примера представьте сценарий оболочки myscript.sh
, подобный следующему:
#!/usr/bin/env bash
#---- doc:start ----#
# Hello $User\n
# This is myscript.sh
# ${red}This will be red!${eol}
#---- doc:end ----#
printf "Hello, World!"
У меня есть сценарий sed, который захватывает весь контент между линейными дилометрами и помещает его в многострочную переменную $doc
С помощью этой переменной я хочу интерполировать любые локальные переменные (необязательно экспортируемые переменные), escape-коды, цвета терминов и т. Д., И, глядя на то, как это сделать, - единственный ответ, который мне удалосьfind использует eval;Вот рабочий пример (здесь используются строки):
while IFS= read -r line; do
line=$(eval "echo -e \"$line\"");
echo "$line"
done <<< "$doc"; # doc is a multiline variable
Однако, если кто-то добавит $(rm -rf ..)
к этому блоку текста, он будет выполнен;похоже, что эти шаблоны допускают другие небезопасные сценарии.
Другой подход, на который я смотрел, - это динамическое назначение переменных с использованием printf -v line ...
, но не удается заставить работать подстановку переменных.
Я бы хотел добиться этого в контексте Bash 3.2 без необходимости установки каких-либо дополнительных инструментов или утилит;POSIX, если это вообще возможно, но Bashisms и обычные утилиты тоже в порядке. Хотите, чтобы это работало как на Mac, так и на Ubuntu .
Возможно, сработает регулярное выражение для исключения всего, что выглядит как исполняемые команды (или иным образом супер-экранирование подозрительных строк)тоже.
Обновление: Ссылка на "рабочий" код