Как перечислить переменные, объявленные в сценарии в ударе?

Иногда, Ваше приложение и слой данных не сильно связанный. Например, у Вас может быть телефонное приложение биллинга. Вы позже создаете отдельное приложение, которое контролирует, использование телефона к a) лучше рекламируют Вам, b) оптимизируют Ваш телефонный план.

Эти приложения имеют различные проблемы и требования к данным (даже данные выходят из той же базы данных), они управляли бы различными проектами. Ваша кодовая база может закончиться абсолютная путаница (в любом приложении) и кошмар, чтобы поддержать, если Вы позволяете базе данных управлять кодом.

89
задан codeforester 30 March 2019 в 21:41
поделиться

3 ответа

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

(Или, по крайней мере, что-то на этом основании :-))

141
ответ дан 24 November 2019 в 07:15
поделиться

Если вы можете выполнить постобработку (как уже упоминалось), вы можете просто разместить вызов 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
3
ответ дан 24 November 2019 в 07:15
поделиться

Попробуйте использовать сценарий (назовем его "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
0
ответ дан 24 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: