Иногда, Ваше приложение и слой данных не сильно связанный. Например, у Вас может быть телефонное приложение биллинга. Вы позже создаете отдельное приложение, которое контролирует, использование телефона к a) лучше рекламируют Вам, b) оптимизируют Ваш телефонный план.
Эти приложения имеют различные проблемы и требования к данным (даже данные выходят из той же базы данных), они управляли бы различными проектами. Ваша кодовая база может закончиться абсолютная путаница (в любом приложении) и кошмар, чтобы поддержать, если Вы позволяете базе данных управлять кодом.
set
будет выводить переменные, к сожалению, он также выводит и определения функций.
К счастью, режим POSIX выводит только переменные:
( set -o posix ; set ) | less
Piping to less
или перенаправить туда, где вам нужны параметры.
Итак, чтобы получить переменные, объявленные только в сценарии:
( set -o posix ; set ) >/tmp/variables.before
source script
( set -o posix ; set ) >/tmp/variables.after
diff /tmp/variables.before /tmp/variables.after
rm /tmp/variables.before /tmp/variables.after
(Или, по крайней мере, что-то на этом основании :-))
Если вы можете выполнить постобработку (как уже упоминалось), вы можете просто разместить вызов set
в начале и в конце вашего скрипта (каждый в отдельный файл) и сделайте разницу в двух файлах. Поймите, что это все еще будет содержать некоторый шум.
Вы также можете сделать это программно. Чтобы ограничить вывод только вашей текущей областью, вам нужно будет реализовать оболочку для создания переменной. Например,
store() {
export ${1}="${*:2}"
[[ ${STORED} =~ "(^| )${1}($| )" ]] || STORED="${STORED} ${1}"
}
store VAR1 abc
store VAR2 bcd
store VAR3 cde
for i in ${STORED}; do
echo "${i}=${!i}"
done
Что дает
VAR1=abc
VAR2=bcd
VAR3=cde
Попробуйте использовать сценарий (назовем его "ls_vars"):
#!/bin/bash
set -a
env > /tmp/a
source $1
env > /tmp/b
diff /tmp/{a,b} | sed -ne 's/^> //p'
chmod + x it, и:
ls_vars your-script.sh > vars.files.save