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

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

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

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

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

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 

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

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

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

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

  • кратчайший способ замены символов в переменной
  • Как сохранить вывод сообщения об ошибке psql в переменной bash?
  • равное сравнение по переменной jq
  • Повторное использование похожих флагов для нескольких команд
  • Экспортировать командную строку без оценки вывода?
  • Как установить bash-псевдонимы и переменные из vim?
  • Характер позиционных параметров
  • Выход прерывается при добавлении вывода sql-запроса в ksh
  • Добавить переменную строку к себе
  • копировать массив с именем массива внутри строки в bash
  • Как печатать переменные и значения оболочки для их копирования и вставки?
  • Локальная переменная как часть глобальной
  • Linux и Unix - лучшая ОС в мире.