Команда Env в Linux

Обновлено: 21.11.2024

env запускает команду с измененной средой. Синопсис:

env обычно используется в первой строке скриптов (строка shebang):

Операнды вида «переменная = значение» задают переменной переменной среды значение value . значение может быть пустым («переменная =»). Установка переменной в пустое значение отличается от ее отмены. Эти операнды оцениваются слева направо, поэтому, если два операнда ссылаются на одну и ту же переменную, более ранний игнорируется.

Имена переменных среды могут быть пустыми и содержать любые символы, кроме ‘=’ и ASCII NUL. Однако разумно ограничиться именами, состоящими исключительно из знаков подчеркивания, цифр и букв ASCII и начинающихся с нецифры, поскольку такие приложения, как оболочка, плохо работают с другими именами.

Первый операнд, не содержащий символа ‘=’, указывает вызываемую программу; он ищется в соответствии с переменной окружения PATH. Любые оставшиеся аргументы передаются в качестве аргументов этой программе. Программа не должна быть специальной встроенной утилитой (см. Специальные встроенные утилиты).

Изменения в PATH вступают в силу до поиска команды. Будьте осторожны при сокращении PATH ; поведение не переносимо, если PATH не определен или не включает ключевые каталоги, такие как /bin .

В редких случаях, когда утилита содержит в имени символ «=», единственный способ отличить ее от присваивания переменной — это использовать промежуточную команду для command и передать проблемное имя программы через args. Например, если ./prog= является исполняемым файлом в текущем PATH:

Если имя команды не указано после спецификаций среды, результирующая среда печатается. Это похоже на указание программы printenv.

Для некоторых примеров предположим, что среда, переданная в env, содержит ‘ LOGNAME=rms ’, ‘ EDITOR=emacs ’ и ‘ PATH=.:/gnubin:/hacks ’:

    Вывод текущей среды.

23.2.1 Общие параметры

Программа поддерживает следующие параметры. Также см. Общие параметры. Опции должны предшествовать операндам.

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

' -u имя ' ' --unset= имя '

Удалить имя переменной из среды, если она была в среде.

Начните с пустой среды, игнорируя унаследованную среду.

' -C каталог ' ' --chdir= каталог '

Измените рабочий каталог на dir перед вызовом команды . Это отличается от встроенного в оболочку cd тем, что он запускает команду как подпроцесс, а не изменяет собственный рабочий каталог оболочки; это позволяет связать его с другими командами, которые запускают команды в другом контексте. Например:

Разблокировать и сбросить сигнальный сигнал до его обработчика сигнала по умолчанию. Без подписи все известные сигналы разблокируются и сбрасываются до значений по умолчанию. Несколько сигналов могут быть разделены запятыми. Следующая команда запускает seq с SIGINT и SIGPIPE, установленными по умолчанию (что означает завершение программы):

В следующем примере мы видим, что это невозможно сделать с помощью традиционных оболочек. Здесь первая команда trap устанавливает SIGPIPE в игнорирование. Вторая команда trap якобы возвращает значение по умолчанию, но POSIX предписывает, что оболочка не должна изменять унаследованное состояние сигнала, поэтому это недопустимо.

Используя --default-signal=PIPE, мы можем убедиться, что для обработки сигнала задано поведение по умолчанию:

Игнорировать знак сигнала при запуске программы. Без sig все известные сигналы игнорируются. Несколько сигналов могут быть разделены запятыми. Следующая команда запускает seq с игнорированием SIGINT — нажатие Ctrl-C не прервет ее:

' SIGCHLD ' особенный, поскольку --ignore-signal=CHLD может не иметь никакого эффекта (POSIX говорит, что это не указано).

Большинство операционных систем не позволяют игнорировать ‘ SIGKILL ’, ‘ SIGSTOP ’ (и, возможно, другие сигналы). Попытка игнорировать эти сигналы потерпит неудачу.

Множественные (и противоречивые) параметры --default-signal=SIG и --ignore-signal=SIG обрабатываются слева направо, причем последний имеет приоритет. В следующем примере « SIGPIPE » устанавливается по умолчанию, а « SIGINT » игнорируется:

Заблокировать сигнал(ы) от доставки.

Список заблокированных или проигнорированных сигналов стандартной ошибки перед выполнением команды.

Показать подробную информацию для каждого шага обработки.

В сочетании с -S рекомендуется указывать -v первым, например. env -vS'string' .

‘-S строка’ ‘—split-string= строка’

обработать и разделить строку на отдельные аргументы, используемые для передачи нескольких аргументов в строках shebang. env поддерживает синтаксис FreeBSD, состоящий из нескольких escape-последовательностей и расширений переменных среды. Подробности и примеры см. ниже.

23.2.2 Использование -S / --split-string в скриптах

Когда интерпретатор скрипта находится в известном месте, скрипты обычно содержат абсолютное имя файла в первой строке:

Когда интерпретатор скрипта находится в нестандартном месте переменной окружения PATH, рекомендуется использовать env в первой строке скрипта, чтобы найти исполняемый файл и запустить его:

Большинство операционных систем (например, GNU/Linux, BSD) рассматривают весь текст после первого пробела как один аргумент. Таким образом, при использовании env в скрипте невозможно указать несколько аргументов.

В следующем примере:

Операционная система обрабатывает ‘ perl -T -w ’ как один аргумент (имя программы), и выполнение скрипта завершается ошибкой:

Опция -S указывает env разделить одну строку на несколько аргументов. Следующий пример работает так, как ожидалось:

Это эквивалентно запуску perl -T -w hello.pl в командной строке.

Тестирование и устранение неполадок

Чтобы протестировать env -S в командной строке, используйте одинарные кавычки для строки -S, чтобы эмулировать один параметр. Одинарные кавычки не нужны при использовании env -S в строке шебанга в первой строке скрипта (операционная система уже рассматривает это как один аргумент).

Следующая команда эквивалентна приведенному выше сценарию hello.pl:

Для устранения неполадок с использованием -S добавьте -v в качестве первого аргумента (перед -S ).

Использование -vS в строке шебанга в скрипте:

Использование -vS в командной строке (добавление одинарных кавычек):

23.2.3 -S / --синтаксис разделенной строки

Разделение аргументов пробелами

Запуск env -Sstring разбивает строку на аргументы на основе пробелов без кавычек или символов табуляции. (Новые строки, возврат каретки, вертикальные табуляции и переводы форм обрабатываются как пробелы и табуляции.)

В следующем надуманном примере переменная awk ‘ OFS ’ будет xyz, так как эти пробелы заключены в двойные кавычки. Остальные символы пробела используются в качестве разделителей аргументов:

При использовании -S в командной строке не забудьте заключить всю строку в одинарные кавычки:

Escape-последовательности

env поддерживает несколько escape-последовательностей. Эти последовательности обрабатываются, если они не заключены в кавычки или заключены в двойные кавычки (если не указано иное). Одинарные кавычки отключают escape-последовательности, кроме «\» и «\\».

Следующий awk-скрипт будет использовать символ табуляции в качестве разделителя полей ввода и вывода (вместо пробелов и табуляции):

Комментарии

Управляющая последовательность ‘ \c ’ (используется вне одинарных/двойных кавычек) заставляет env игнорировать остальную часть строки.

ПРИМЕЧАНИЕ. В приведенных выше примерах используются одинарные кавычки, так как они выполняются в командной строке.

Расширение переменной среды

Шаблон ‘ $ ’ используется для замены значения из переменной среды. Шаблон должен включать фигурные скобки («<», «>»). Без них env отклонит строку. Специальные переменные оболочки (такие как ‘$@’, ‘$*’, ‘$$’) не поддерживаются.

Если переменная среды пуста или не задана, шаблон будет заменен пустой строкой. Значение ‘ $ ’ будет значением исполняемой среды до любых изменений с использованием -i / --ignore-environment / -u / --unset или установки новых значений с помощью ‘ VAR=VALUE ’.

Следующий скрипт Python добавляет /opt/custom/modules к переменной среды пути поиска модуля Python (‘ PYTHONPATH ’):

Расширение ‘ $ ’ выполняется env , а не оболочкой. Если фигурные скобки опущены, env завершится ошибкой:

Расширение переменной среды происходит перед очисткой среды (с помощью -i ) или сбросом определенных переменных (с помощью -u ):

env — это команда оболочки, используемая в Linux и обозначающая переменные среды. Переменная среды — это значение, именуемое динамически, и оно может влиять на поведение текущих процессов на компьютере.

Поэтому команда env используется для печати списка этих переменных среды. Точно так же команда используется для запуска утилиты в измененной среде без изменения существующих условий. Кроме того, он используется сценариями оболочки для запуска правильного интерпретатора. Однако обстановка здесь не изменилась.

В этой статье мы узнаем, как использовать команду env в Linux, ее параметры, общие переменные среды, а также различные статусы выхода команды env.

Давайте приступим!

Использование.

Во-первых, обратите внимание, что общий синтаксис команды env показан ниже. Он устанавливает для каждого ИМЯ значение ЗНАЧЕНИЕ и запускает КОМАНДУ в этой среде.

Эта команда может выполняться без каких-либо других аргументов, как показано в приведенном ниже синтаксисе:

В результате он отобразит список всех текущих переменных среды, как показано на снимке экрана ниже.

Во-вторых, переменные среды чувствительны к регистру. То есть они должны иметь имена в ВЕРХНЕМ РЕГИСТРЕ. Взгляните на примеры ниже.

Кроме того, двоеточие ":" используется для разделения нескольких значений, присвоенных переменной. Точно так же нет пробела перед или после знака равенства «=». См. приведенные выше примеры, чтобы проиллюстрировать это.

Параметры команды env.

Как упоминалось выше, команду env можно запустить без других параметров. С другой стороны, здесь мы рассмотрим примеры, в которых у команды env есть аргументы.

-i или --ignore-environment .

Этот параметр позволяет нам начать с пустой среды. Другими словами, он очищает среду, но по-прежнему позволяет устанавливать новые переменные.

Вот синтаксис этой опции:

Это команда, которую мы использовали в командном терминале.

Ниже показан вывод. Как видим, окружение очищено. То есть, когда мы запускаем команду env, единственной доступной переменной среды является PWD.

-0 или --null .

Эта опция завершает выходные данные значением NULL вместо новой строки. По умолчанию результаты команды env обычно печатаются с новой строки.

Здесь синтаксис показан ниже:

Вот как выглядит вывод для этого случая:

-u или --unset=NAME .

Этот параметр удаляет переменную из среды. Другими словами, он удаляет переменную NAME, поэтому она не отображается в выходных данных.

Это синтаксис параметра, за которым следует пример с фактической переменной:

--версия .

Эта опция обычно отображает информацию о версии, а затем закрывается.

Вот синтаксис команды:

Посмотрите на результат ниже:

--help .

При выборе этого параметра отображается справочная информация, а затем закрывается.

Вот синтаксис команды:

Вывод показан ниже:

env и hash-pling.

env также можно использовать в строке хеширования скрипта. Это позволяет искать интерпретатор через переменную PATH.

Вот результат выполнения команды:

Общие переменные среды.

Переменные среды выводятся при запуске команды env. Как было продемонстрировано выше, переменные указаны в ВЕРХНЕМ РЕГИСТРЕ. Вот некоторые из распространенных переменных среды и их описания.

HOME — эта переменная отображает домашний каталог текущего пользователя.

EDITOR — эта переменная отображает используемый по умолчанию файловый редактор. Другими словами, это редактор, используемый в командном терминале для запуска команд.

ПОЛЬЗОВАТЕЛЬ – эта переменная показывает пользователя, вошедшего в систему в данный момент.

SHELL — показывает расположение программы-оболочки текущего пользователя. Например, bash — командный процессор, в котором пользователь выполняет свои команды.

ЯЗЫК – отображает текущие настройки локали.

LOGNAME — это имя текущего пользователя, вошедшего в систему.

ПУТЬ — показывает список каталогов, в которых нужно искать при выполнении команд. То есть при запуске команды система будет искать эти каталоги и использовать для выполнения первый найденный.

TERM — обычно показывает текущую эмуляцию терминала.

MANPATH – показывает расположение ваших руководств.

MAIL — печатает местоположение, где хранится почта текущего пользователя.

TZ – показывает часовой пояс, используемый системой.


Выйти из статуса.

При запуске команды env создается код выхода. Это помогает нам узнать статус указанной команды на основе созданного кода.

Ниже приведены коды выхода, создаваемые командой env в Linux, и их описания:

< tr>
Код выходаОписание
0Это означает, что команда env выполнена успешно.
1-125Это означает, что произошла ошибка или команда env завершилась неудачно.
126Это означает, что указанная команда была найдена, но не может быть вызвана.
127Это означает, указанная команда не найдена.

Подводя итог, мы надеемся, что вы узнали, что такое команда env в Linux, общие переменные среды, а также ее параметры.

В Linux используется гораздо больше команд. Если вы хотите узнать, как извлечь путь к каталогу в Linux, ознакомьтесь с разделом «Как использовать команду dirname в Linux».

Если у вас есть какие-либо вопросы или предложения по использованию команды env в Linux, сообщите нам об этом в разделе комментариев ниже.

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

Один из способов, с помощью которого оболочка отслеживает все эти параметры и детали, — это поддерживаемая ею область, называемая средой. Среда — это область, которую оболочка создает каждый раз при запуске сеанса, содержащего переменные, определяющие системные свойства.

В этом руководстве мы обсудим, как взаимодействовать со средой и читать или устанавливать переменные среды и оболочки в интерактивном режиме и через файлы конфигурации.

Чтобы следовать этому руководству с помощью терминала в браузере, нажмите кнопку Запустить интерактивный терминал! кнопка ниже:

Запустите интерактивный терминал!

В противном случае, если вы хотите использовать локальную систему или удаленный сервер, откройте терминал и выполните там команды из этого руководства.

Как работает среда и переменные среды

Каждый раз, когда запускается сеанс оболочки, выполняется процесс сбора и компиляции информации, которая должна быть доступна процессу оболочки и его дочерним процессам. Он получает данные для этих настроек из различных файлов и настроек в системе.

Среда предоставляет среду, через которую процесс оболочки может получить или установить параметры и, в свою очередь, передать их своим дочерним процессам.

Среда реализована в виде строк, представляющих пары "ключ-значение". Если передается несколько значений, они обычно разделяются двоеточием ( : ). Каждая пара обычно выглядит примерно так:

Если значение содержит значительные пробелы, используются кавычки:

Ключами в этих сценариях являются переменные. Они могут быть одного из двух типов: переменные среды или переменные оболочки.

Переменные среды — это переменные, которые определены для текущей оболочки и наследуются любыми дочерними оболочками или процессами. Переменные среды используются для передачи информации в процессы, порожденные оболочкой.

Переменные оболочки — это переменные, содержащиеся исключительно в оболочке, в которой они были заданы или определены. Они часто используются для отслеживания эфемерных данных, таких как текущий рабочий каталог.

По соглашению эти типы переменных обычно определяются с использованием заглавных букв. Это помогает пользователям различать переменные среды в других контекстах.

Печать оболочки и переменных окружения

Каждый сеанс оболочки отслеживает свои собственные переменные оболочки и окружения. Мы можем получить к ним доступ несколькими способами.

Мы можем увидеть список всех наших переменных окружения с помощью команд env или printenv. В состоянии по умолчанию они должны работать точно так же:

В вашей среде оболочки может быть установлено больше или меньше переменных со значениями, отличными от следующего вывода:

Это довольно типично для вывода как printenv, так и env. Разница между двумя командами очевидна только в их более конкретной функциональности. Например, с помощью printenv вы можете запросить значения отдельных переменных:

С другой стороны, env позволяет изменять среду, в которой запускаются программы, путем передачи набора определений переменных в команду, подобную этой:

Поскольку, как мы узнали выше, дочерние процессы обычно наследуют переменные среды родительского процесса, это дает вам возможность переопределить значения или добавить дополнительные переменные для дочернего процесса.

Как видно из вывода нашей команды printenv, довольно много переменных окружения настроены через наши системные файлы и процессы без нашего участия.

Они показывают переменные среды, но как мы видим переменные оболочки?

Для этого можно использовать команду set. Если мы введем set без каких-либо дополнительных параметров, мы получим список всех переменных оболочки, переменных окружения, локальных переменных и функций оболочки:

Обычно это огромный список. Вы, вероятно, захотите направить его в программу пейджера, чтобы упростить работу с объемом вывода:

Объем дополнительной информации, которую мы получаем, несколько огромен. Например, нам, вероятно, не нужно знать все функции bash, которые определены.

Мы можем очистить вывод, указав, что набор должен работать в режиме POSIX, который не будет печатать функции оболочки. Мы можем выполнить это во вложенной оболочке, чтобы это не изменило нашу текущую среду:

Здесь будут перечислены все определенные переменные окружения и оболочки.

Мы можем попытаться сравнить этот вывод с выводом команд env или printenv, чтобы попытаться получить список только переменных оболочки, но это будет несовершенным из-за разных способов вывода информации этими командами:

Скорее всего, сюда все еще будут включены несколько переменных окружения, поскольку команда set выводит значения в кавычках, а команды printenv и env не заключают в кавычки значения строк.

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

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

Общие переменные среды и оболочки

Некоторые переменные среды и оболочки очень полезны, и на них довольно часто ссылаются. Вот некоторые общие переменные среды, с которыми вы столкнетесь:

  • SHELL : описывает оболочку, которая будет интерпретировать любые вводимые вами команды. В большинстве случаев по умолчанию это будет bash, но можно установить и другие значения, если вы предпочитаете другие параметры.
  • TERM : указывает тип терминала для эмуляции при запуске оболочки. Различные аппаратные терминалы могут эмулироваться для различных рабочих требований. Обычно вам не нужно беспокоиться об этом.
  • ПОЛЬЗОВАТЕЛЬ: текущий пользователь, вошедший в систему.
  • PWD: текущий рабочий каталог.
  • OLDPWD: предыдущий рабочий каталог. Это сохраняется оболочкой, чтобы вернуться к предыдущему каталогу, запустив cd - .
  • LS_COLORS : определяет цветовые коды, которые используются для дополнительного добавления цветного вывода в команду ls. Это используется для различения разных типов файлов и предоставления пользователю дополнительной информации с первого взгляда.
  • MAIL: путь к почтовому ящику текущего пользователя.
  • ПУТЬ: список каталогов, которые система будет проверять при поиске команд. Когда пользователь вводит команду, система проверяет каталоги в этом порядке на наличие исполняемого файла.
  • ЯЗЫК : текущий язык и настройки локализации, включая кодировку символов.
  • HOME: домашний каталог текущего пользователя.
  • _ : самая последняя ранее выполненная команда.
  • BASHOPTS: список параметров, которые использовались при выполнении bash. Это может быть полезно, чтобы узнать, будет ли среда оболочки работать так, как вам нужно.
  • BASH_VERSION : версия исполняемого bash в удобочитаемой форме.
  • BASH_VERSINFO : версия bash в машиночитаемом виде.
  • СТОЛБЦЫ : количество столбцов шириной, которые используются для вывода вывода на экран.
  • DIRSTACK: стек каталогов, доступных с помощью команд pushd и popd.
  • HISTFILESIZE : количество строк истории команд, сохраненных в файле.
  • HISTSIZE : допустимое количество строк истории команд в памяти.
  • HOSTNAME: имя хоста компьютера в данный момент.
  • IFS: внутренний разделитель полей для разделения ввода в командной строке. По умолчанию это пробел.
  • PS1: основное определение командной строки. Это используется для определения того, как выглядит ваше приглашение при запуске сеанса оболочки. PS2 используется для объявления вторичных подсказок, когда команда занимает несколько строк.
  • SHELLOPTS: параметры оболочки, которые можно задать с помощью параметра set.
  • UID : UID текущего пользователя.

Настройка переменных оболочки и окружения

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

Создание переменных оболочки

Мы начнем с определения переменной оболочки в рамках нашего текущего сеанса. Это легко сделать; нам нужно только указать имя и значение. Мы будем придерживаться соглашения о сохранении всех заглавных букв в имени переменной и установим его в виде простой строки.

Здесь мы использовали кавычки, поскольку значение нашей переменной содержит пробел. Кроме того, мы использовали одинарные кавычки, потому что восклицательный знак — это специальный символ в оболочке bash, который обычно заменяется на историю bash, если он не экранирован или не заключен в одинарные кавычки.

Теперь у нас есть переменная оболочки. Эта переменная доступна в нашем текущем сеансе, но не будет передана дочерним процессам.

Мы можем увидеть это, выполнив поиск нашей новой переменной в наборе выходных данных:

Мы можем убедиться, что это не переменная среды, попробовав то же самое с printenv :

Вывод не должен возвращаться.

Давайте воспользуемся этим как возможностью продемонстрировать способ доступа к значению любой переменной оболочки или среды.

Как видите, для ссылки на значение переменной необходимо поставить перед ним знак $. Оболочка понимает, что это означает, что она должна заменить значение переменной, когда встретится с этим.

Итак, теперь у нас есть переменная оболочки. Он не должен передаваться никаким дочерним процессам. Мы можем создать новую оболочку bash из нашей текущей, чтобы продемонстрировать:

Если мы введем bash для создания дочерней оболочки, а затем попытаемся получить доступ к содержимому переменной, ничего не будет возвращено. Это то, что мы ожидали.

Вернитесь в исходную оболочку, набрав exit :

Создание переменных среды

Теперь давайте превратим нашу переменную оболочки в переменную окружения. Мы можем сделать это, экспортировав переменную. Команда для этого называется соответствующим образом:

Это превратит нашу переменную в переменную окружения. Мы можем проверить это, еще раз проверив наш экологический список:

На этот раз появляется наша переменная. Давайте снова попробуем наш эксперимент с нашей дочерней оболочкой:

Отлично! Наша дочерняя оболочка получила переменную, установленную ее родителем. Прежде чем выйти из этой дочерней оболочки, давайте попробуем экспортировать другую переменную. Мы можем установить переменные среды за один шаг следующим образом:

Проверьте, экспортируется ли он как переменная среды:

Теперь давайте вернемся в исходную оболочку:

Давайте посмотрим, доступна ли наша новая переменная:

Ничего не возвращается.

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

Переменная NEW_VAR была установлена ​​как переменная окружения в нашей дочерней оболочке. Эта переменная будет доступна самой себе и любой из ее дочерних оболочек и процессов. Когда мы вернулись в нашу основную оболочку, эта среда была уничтожена.

Понижение и удаление переменных

У нас все еще есть переменная TEST_VAR, определенная как переменная окружения. Мы можем изменить его обратно в переменную оболочки, набрав:

Это больше не переменная среды:

Однако это по-прежнему переменная оболочки:

Если мы хотим полностью отменить установку переменной оболочки или окружения, мы можем сделать это с помощью команды unset:

Мы можем убедиться, что он больше не установлен:

Ничего не возвращается, поскольку переменная не установлена.

Настройка переменных среды при входе

Мы уже упоминали, что многие программы используют переменные среды для определения особенностей работы. Мы не хотим настраивать важные переменные каждый раз, когда запускаем новую сессию оболочки, и мы уже видели, сколько переменных уже установлено при входе в систему, так как же нам создавать и определять переменные автоматически?

На самом деле это более сложная проблема, чем кажется на первый взгляд, из-за многочисленных файлов конфигурации, которые оболочка bash читает в зависимости от того, как она запущена.

Разница между сеансами входа в систему, сеансами без входа, интерактивными и неинтерактивными сеансами оболочки

Оболочка bash считывает разные файлы конфигурации в зависимости от того, как запущен сеанс.

Одно из различий между разными сеансами заключается в том, создается ли оболочка как сеанс входа или сеанс без входа.

Оболочка входа — это сеанс оболочки, который начинается с аутентификации пользователя. Если вы входите в сеанс терминала или через SSH и проходите аутентификацию, сеанс оболочки будет установлен в качестве оболочки входа в систему.

Если вы запускаете новый сеанс оболочки из сеанса, прошедшего проверку подлинности, как мы это сделали, вызвав команду bash из терминала, запускается сеанс оболочки без входа в систему. Вас не запрашивали данные аутентификации при запуске дочерней оболочки.

Другое различие, которое можно провести, заключается в том, является ли сеанс оболочки интерактивным или неинтерактивным.

Интерактивный сеанс оболочки — это сеанс оболочки, подключенный к терминалу. Сеанс неинтерактивной оболочки не привязан к сеансу терминала.

Таким образом, каждый сеанс оболочки классифицируется как вход в систему или без входа, а также интерактивный или неинтерактивный.

Обычный сеанс, который начинается с SSH, обычно представляет собой интерактивную оболочку входа. Сценарий, запускаемый из командной строки, обычно запускается в неинтерактивной оболочке без входа в систему. Терминальный сеанс может быть любой комбинацией этих двух свойств.

То, классифицируется ли сеанс оболочки как входная или не входная оболочка, влияет на то, какие файлы считываются для инициализации сеанса оболочки.

Сеанс, запущенный как сеанс входа в систему, сначала будет считывать сведения о конфигурации из файла /etc/profile.Затем он будет искать первый файл конфигурации оболочки входа в домашнем каталоге пользователя, чтобы получить сведения о конфигурации для конкретного пользователя.

Он читает первый найденный файл из ~/.bash_profile , ~/.bash_login и ~/.profile и не читает никакие другие файлы.

Напротив, сеанс, определенный как оболочка без входа в систему, будет читать /etc/bash.bashrc, а затем пользовательский файл ~/.bashrc для создания своей среды.

Неинтерактивные оболочки считывают переменную среды с именем BASH_ENV и считывают файл, указанный для определения новой среды.

Реализация переменных окружения

Как видите, существует множество различных файлов, которые нам обычно нужно просматривать для размещения наших настроек.

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

К счастью, большинство дистрибутивов Linux настраивают файлы конфигурации входа в качестве источника файлов конфигурации без входа. Это означает, что вы можете определить переменные среды, которые вы хотите, как в файлах конфигурации без входа в систему. Затем они будут прочитаны в обоих сценариях.

Обычно мы будем устанавливать пользовательские переменные окружения, и обычно мы хотим, чтобы наши настройки были доступны как в оболочке входа, так и без входа в систему. Это означает, что место для определения этих переменных находится в файле ~/.bashrc.

Открыть этот файл сейчас:

Скорее всего, он уже содержит довольно много данных. Большинство определений здесь предназначены для установки параметров bash, которые не связаны с переменными окружения. Вы можете установить переменные окружения точно так же, как в командной строке:

Любые новые переменные окружения можно добавлять в любом месте файла ~/.bashrc, если они не помещены в середину другой команды или цикла for. Затем мы можем сохранить и закрыть файл. В следующий раз, когда вы запустите сеанс оболочки, ваше объявление переменной среды будет прочитано и передано в среду оболочки. Вы можете заставить текущий сеанс прочитать файл, набрав:

Если вам нужно установить общесистемные переменные, вы можете добавить их в /etc/profile , /etc/bash.bashrc или /etc/environment .

Заключение

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

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

Существует множество других, более приземленных, но более распространенных сценариев, в которых вам потребуется прочитать или изменить среду вашей системы. Эти инструменты и методы должны стать хорошей основой для внесения этих изменений и их правильного использования.

Хотите узнать больше? Присоединяйтесь к сообществу DigitalOcean!

Присоединяйтесь к нашему сообществу DigitalOcean, насчитывающему более миллиона разработчиков, бесплатно! Получайте помощь и делитесь знаниями в нашем разделе "Вопросы и ответы", находите руководства и инструменты, которые помогут вам расти как разработчику и масштабировать свой проект или бизнес, а также подписывайтесь на интересующие вас темы.

У меня был тест Linux, и возник вопрос: "Как запустить команду напрямую, а не ее псевдоним?"
Я знал, что существует такое решение, как префикс команды с каким-то специальным символом, но я забыл об этом. Теперь я знаю, что это \ . (читать из этого поста).

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

Что делает env и именно в env без каких-либо аргументов для самого env?

В качестве примечания, я могу придумать 3 способа сделать это: env , command и \ . На мой взгляд, если какой-то тест говорит, что env недействителен, то этот тест не работает.

@Patrick: Это не сломано, потому что, как сказал Крис, может быть псевдоним в команде или env, что сделает `\` единственным приемлемым ответом.

@ArlaudPierre и `\` не определены в posix (как escape-псевдоним), поэтому они не переносимы. Так что это не более приемлемо, чем другие.

@Patrick: правда, правда. Теперь нам нужно знать точный периметр теста, чтобы сказать это. Но в любом случае считать, что ответ "env" неприемлем, не очень честно, я должен с вами согласиться в этом.

Ребята, тест тоже проверял человек (экс-сисадмин с сертификатом LPI, который обучает теперь других Linux) :) Я пожаловался верификатору, пошел к человеку и так и не понял, что именно делает env.После этого поста - понятно и мой ответ рассмотрен (принят). Спасибо всем!

2 ответа 2

запускает командную программу и аргументы со средой, сформированной путем расширения текущей среды с помощью переменных среды и значений, обозначенных name=value и name2=value2 . Если вы не включаете какие-либо аргументы, такие как name=value , текущая среда передается без изменений.

Ключевой момент, связанный с псевдонимами, заключается в том, что env — это внешняя команда, поэтому она не «знает» псевдонимы: псевдонимы — это конструкция оболочки, которая не является частью обычного процесса. модели и не влияют на программы, которые напрямую запускаются программами без оболочки (например, env). env просто передает программу и аргументы вызову exec (например, execvp, который ищет программу в PATH).

Читайте также: