Рейтинг:2

Разница между «эхо» и «экспортом» переменной среды?

флаг sa

Среда - Ubuntu 18.

Если я добавлю одну строку JAVA_HOME="/usr/java11" в /etc/environment и выполнить источник /etc/среда , я могу повторить эту переменную среды:

эхо $JAVA_HOME
/USR/Java11

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

экспорт | grep JAVA_HOME
--результат пустой--

Затем я использую экспорт $JAVA_HOME=/usr/java8 для экспорта переменной (обратите внимание, здесь java8, а не java 11), я могу:

экспорт |grep JAVA_HOME
объявить -x JAVA_HOME="/usr/java8"

Теперь я еще могу эхо $JAVA_HOME как /usr/java11:

эхо $JAVA_HOME
/USR/Java11

Вопрос: чем отличается эхо $переменная и экспорт | grep JAVA_HOME?

Я пробую простую программу на Python, os.environ.get("JAVA_HOME") возвращает "/usr/java8" из экспорта, а не из эха.

guiverc avatar
флаг cn
Вы упомянули Ubuntu 18, так это *содержащая* среда Ubuntu Core 18 или *snap* только среда? поскольку модели *конфайнмента* в игре в релизах 18 отличаются от более открытых моделей 18.04 - пожалуйста, будьте конкретны.
флаг hr
Я думаю, проблема здесь в том, что `/etc/environment` — это просто список пар имя=значение. Когда `pam_env` читает эти переменные, они экспортируются в среду, но при их использовании в вашей текущей оболочке создаются только обычные переменные оболочки - например, проверьте с помощью `declare -p JAVA_HOME`.
Ben L avatar
флаг sa
@steeldriver, что такое «обычные переменные оболочки» и что такое другие переменные?
Ben L avatar
флаг sa
@guiverc извините, я не знаю, что такое «содержится» и что такое «привязка». Это док-контейнер, созданный из «FROM ubuntu: 18.04».
guiverc avatar
флаг cn
Ubuntu 18.04 отличается от 18 продуктов; Обычные выпуски Ubuntu на основе *deb* (без включения) используют формат *год.месяц*; отличается от продуктов на основе 18 или *year*, в которых используется сдерживание.Ubuntu имеет продукты на основе *year* с 2016 года — вы должны быть точны, поскольку 18 и 18.04 представляют разные продукты (выпуск 18 не может использовать пакет *deb* — это только *snap*) к сведению: модели *confinement* могут различаться в зависимости от snap ; но если вы знакомы с контейнерами, вы знаете это; это ~ то же самое с другой терминологией ..
vanadium avatar
флаг cn
Отвечает ли это на ваш вопрос? [В чем разница между set, export и env и когда я должен использовать каждый из них?] (https://askubuntu.com/questions/205688/whats-the-difference-between-set-export-and-env-and-when -должен-я-использую-каждый)
Рейтинг:12
флаг hr

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

В частности, хотя /и т.д./окружающая среда бывает, содержит строки вида имя=значение которые допустимы как назначения переменных оболочки POSIX, его основная цель (в современной системе Linux) — чтение pam_env модуль при инициализации сеанса пользователя - это pam_env который экспортирует их в среду пользователя.

Когда вы источник /и т.д./окружающая среда в вашу оболочку, нет никакой особой магии, которая сообщает оболочке, что присвоения относятся к переменным среды (которые экспортируются в среду и, следовательно, наследуются подпроцессами), а не к обычным переменным оболочки (которые доступны только в текущей оболочке объем).

В следующий раз, когда вы войдете в систему, pam_env сотворит свое волшебство и JAVA_HOME будет затем появится в выводе экспорт | grep JAVA_HOME.

Смотрите также

Ben L avatar
флаг sa
Спасибо, что указали на разницу между «переменной оболочки» и «переменной среды».
vanadium avatar
флаг cn
«переменные среды» технически также являются «переменными оболочки». Они являются подмножеством.
Рейтинг:5
флаг cn

эхо и экспорт во-первых, это очень разные команды.

  • эхо отобразит текст. В эхо $JAVA_HOME, оболочка заменит $JAVA_HOME содержимым переменной оболочки JAVA_HOME, если она определена. В противном случае, $JAVA_HOME вернет пустую строку.
  • экспорт предоставляет атрибут «экспорт» для переменной оболочки. экспорт JAVA_HOME установит атрибут экспорта, т. е. переменная также будет доступна в среде любой подоболочки или подпроцесса, а не только в вашей текущей оболочке. Если переменная еще не установлена, вы можете определить ее при экспорте, как в экспорт JAVA_HOME=/usr/java11.

В /и т.д./окружающая среда, переменные среды регистрируются с синтаксисом присвоения переменной. Содержание /и т.д./окружающая среда в установке Ubuntu по умолчанию действительно может быть выполнено.Итак, если вы выполните строку, которую вы включили:

`JAVA_HOME=/usr/java11`

Затем все, что нужно сделать, это присвоить переменной оболочки PATH текущее значение.

Однако, поскольку вы включили переменную в /и т.д./окружающая среда, он должен быть эффективно экспортирован при следующем запуске вашей системы. Тогда он должен существовать в экспорт и появиться в эхо $JAVA_HOME в первом терминале, который вы открываете. Итак, что вы сейчас наблюдаете, так это то, что вы еще не перезапустили машину после изменения /и т.д./окружающая среда (и не экспортировал переменную другими способами).

Рейтинг:3
флаг in

Основываясь на других ответах здесь, некоторые команды, которые параллельны экспорт но для других категорий переменных установлен (который работает, например, для ПЕРЕМЕННАЯ=значение тогда набор | grep ПЕРЕМЕННАЯ) и окружение

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

Видеть В чем разница между set, export и env и когда я должен использовать каждый из них?

эхо $ПЕРЕМЕННАЯ всегда работает, так как все виды переменных могут быть прочитаны как $ПЕРЕМЕННАЯ; однако это означает, что он не дает вам информации о том, что это за переменная или откуда она берется.

Рейтинг:0
флаг us

эхо это команда для вывода текста и переменных на стандартный вывод (или перенаправление).

экспорт перечисляет текущие экспортированные переменные в оболочке.

Этот поток объясняет, почему вы бы использовали экспорт намного лучше, чем я могу:

https://stackoverflow.com/questions/7411455/what-does-export-do-in-shell-programming ... он отлично объясняет, что такое экспорт

Ответить или комментировать

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