Определить пользовательские переменные

В оболочке bash GNU / Linux я использую команду для определения и сохранения всех моих определяемых пользователем переменных в определенный момент времени для целей отладки (я позже отправлю файл):

declare | grep '^[[:lower:]]' | grep -v '^colors' | sort > ${output_dir}/env_variables.tmp 

Я знаю, что это плохая практика, так как я «программирую по совпадению», полагая, что все системные переменные (кроме colors ) начнутся с буквы в верхнем регистре – я бы хотел придумать лучший способ.

Я также рассмотрел возможность сохранения версии моих текущих переменных env перед запуском скрипта, а затем просто различие между переменными env в дочерней оболочке с ним. Это кажется хакером как моя текущая попытка, поэтому мне было интересно, есть ли способ фильтровать переменные по дате или пользователю или какие-либо другие критерии для идентификации тех, которые недавно созданы определенной дочерней оболочкой?

  • Echo не печатает правильное значение для переменной
  • Что еще может сломаться, если я удалю экспорт из переменной?
  • Как использовать переменные внутри одинарных кавычек
  • Основной вопрос Баша
  • Пожалуйста, помогите мне понять синтаксис для $
  • Почему «экспорт» не перезаписывает существующие значения?
  • Возможно ли сделать переменную внутри вложенной для петлевого локального
  • Как вставить переменную в выражение даты?
  • 2 Solutions collect form web for “Определить пользовательские переменные”

    Нет, нет способа фильтровать переменные по дате или кому это принадлежит. Вы МОЖЕТЕ установить все существующие переменные только для чтения, а затем вы будете использовать declare -p чтобы отфильтровать их. Но более распространенным способом решения этой проблемы является префикс всех ваших vairables с помощью __project_ (где проект какой-либо). Переменные становятся длинными, но это кажется самым безопасным способом.

    Ваша идея сохранить переменные при запуске совсем не плохая. Вы можете сохранить только имена с помощью

      declare |awk -F= '/=/ { print $1 }' >tmpfile.$$.shvars 

    Или вернуться к идее только для чтения:

      while read var ; do declare -r var; done < tmpfile.$$.shvars 

    Теперь вы объявляете свое, а позже, когда вы закончите:

      declare -p |awk '$2 !~ /^.r$/ { print $3 }' |cut -d= -f1 

    получает список ваших переменных. Недостатком является то, что все эти переменные теперь доступны только для чтения, которых не должно быть.

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

    • Используйте соглашение об именах, чтобы описать, какие из них вам интересны (в верхнем и нижнем регистре)
    • Сделайте снимок до и после

    примерно так же, как вы можете это сделать.

    Linux и Unix - лучшая ОС в мире.