Почему выполнение env TERM=’dumb’ INSIDE_EMACS завершилось неудачей?

Вопрос или проблема

Я смотрю на историю
что делает эта команда

exec env TERM='dumb' INSIDE_EMACS='30.0.92,tramp:2.7.1.30.1' ENV='' HISTFILE=~/.tramp_history PROMPT_COMMAND='' PS1=///01f0dd71d3eb563311f9d396860f0297\#\$ PS2='' PS3='' /bin/sh  -i

должна делать?

Если я выполню

echo $INSIDE_EMACS

ничего не показывает.

Почему?

Ответ или решение

Согласно вашему запросу, давайте подробно разберем команду и проблемы, связанные с переменной окружения INSIDE_EMACS, а также выясним, почему вызов echo $INSIDE_EMACS ничего не выводит.

Что делает команда exec env TERM='dumb' INSIDE_EMACS='30.0.92,tramp:2.7.1.30.1'?

  1. exec: Эта команда замещает текущий процесс новым. В данном случае процессом будет являться /bin/sh с заданными переменными окружения.

  2. env: Команда env используется для формирования окружения, в котором будет запущена новая программа. Она позволяет временно задать переменные окружения.

  3. TERM='dumb': Установка переменной TERM на значение ‘dumb’ указывает терминалу, что он не поддерживает никаких возможностей, за исключением простого ввода/вывода. Это может быть полезно в средах, где ожидаются минимальные возможности терминала.

  4. INSIDE_EMACS='30.0.92,tramp:2.7.1.30.1': Это переменная, указывающая на то, что вы находитесь внутри среды Emacs. В данном контексте, она содержит информацию о версии Emacs и используемом плагине Tramp.

  5. ENV='': Устанавливает переменную окружения ENV в пустое значение, что означает, что никакие дополнительные настройки окружения не должны загружаться.

  6. HISTFILE=~/.tramp_history: Указание файла для хранения истории команд.

  7. PROMPT_COMMAND='': Установка переменной PROMPT_COMMAND в пустую строку, что отключает любые команды, выполняемые перед выводом приглашения.

  8. PS1=///01f0dd71d3eb563311f9d396860f0297\#$ и подобные: Определяет вид приглашения командной строки.

  9. /bin/sh -i: Запускает новый экземпляр интерактивной оболочки с установленными переменными окружения.

Почему echo $INSIDE_EMACS не выводит ничего?

Теперь рассмотрим, почему, после выполнения данной команды, переменная INSIDE_EMACS не доступна:

  1. Область видимости переменных: Переменные окружения, установленные в данном экземпляре env, не сохраняются после завершения процесса. Когда вы запускаете новый интерактивный шелл (в данном случае /bin/sh -i), он не наследует переменные окружения от родительского процесса, если они не были правильно экспортированы.

  2. Проблема с exec: При использовании exec, оболочка, в которой вы выполняете команду, заменяется новой оболочкой. Текущий контекст взаимодействия с оболочкой будет потерян, и любые команды, введенные в рамках этой новой оболочки, не будут видеть ранее установленные переменные окружения.

  3. Отсутствие экспорта: Если переменная INSIDE_EMACS не была экспортирована, она останется локальной для текущей сессии и не будет доступна дальше. Для того чтобы переменная окружения была доступна в дочерних процессах, она должна быть явно экспортирована с помощью команды export.

Итог

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

Оцените материал
Добавить комментарий

Капча загружается...