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

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

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

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

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

  • команда не найдена в сценарии оболочки
  • Как экспортировать переменную из Perl-скрипта в сценарий оболочки?
  • повторное использование последнего вывода команды с заданным индексом / строкой-номером
  • Переменная Shell в теге <a href>
  • Как я могу постоянно изменять переменные среды через терминал? (Ubuntu 16.04)
  • Как сохранить файл изображения в переменной bash?
  • Выполнение команды в переменной с eval
  • вызовите сценарий оболочки с помощью переменной
  • 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 

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

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

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

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

    Interesting Posts

    Dwm-pertag patch – сохранение состояния между перезапусками

    awk или sed или perl: удалять только символы в определенном месте

    Присоединяйте каждый столбец с помощью sed или awk

    Apache 2.4 SSL Config – сервер отклоняет запросы с HTTP 400

    Есть ли простой способ проверить, какая программа написана в / var / log / messages?

    Нужна ли мне отправка Nullmailer?

    Как не отображать вывод stdout запущенного процесса?

    Поиск и управление файлами на внешнем жестком диске через FileZilla через SSH

    Восстановление дискового пространства в Ubuntu

    Идентификатор поставщика и идентификатор продукта определяют драйвер, используемый для устройства USB?

    Cron: у клиента нет разрешений на отправку в качестве этого отправителя.

    как отключить $ character escaping в командной строке

    Где основная группа определена на основе ядра?

    Клавиатура USB игнорирует нажатия клавиш в некотором очень расстраивающемся шаблоне

    Что означает индикатор noeol внизу сеанса редактирования vim?

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