Этот подход с использованием белого списка не позволяет выполнять произвольный код, как eval
. Если безопасность не является проблемой, вам следует придерживаться eval
, поскольку внешние элементы, используемые в этом примере, имеют много угловых случаев, для которых замена не будет работать должным образом.
Программа заменяет некоторые внешние объекты, на которые есть ссылки в каждой команде вашего командного файла, на их вывод перед печатью команды:
#!/bin/bash
while read command
do
while read -a external ; do
output=$( "${external[@]}" )
command=$( sed "s/\$(${external})/${output}/g" <<< "$command" )
done <<END
date -R
hostname
END
echo "$command"
done < command_file.txt
Чтобы использовать больше внешних объектов, вам нужно добавить их в heredoc в диапазоне от <<END
до END
. Я добавил -R
к date
, чтобы продемонстрировать внешнее с аргументами.
Как уже указывалось, никакая обработка (например, кавычки, подстановки), за исключением разделения слов, не будет выполняться для внешних команд (пробелы могут быть экранированы (one\ two
) вместо кавычек).