Вопрос или проблема
Я смотрю на историю
что делает эта команда
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'
?
-
exec
: Эта команда замещает текущий процесс новым. В данном случае процессом будет являться/bin/sh
с заданными переменными окружения. -
env
: Командаenv
используется для формирования окружения, в котором будет запущена новая программа. Она позволяет временно задать переменные окружения. -
TERM='dumb'
: Установка переменнойTERM
на значение ‘dumb’ указывает терминалу, что он не поддерживает никаких возможностей, за исключением простого ввода/вывода. Это может быть полезно в средах, где ожидаются минимальные возможности терминала. -
INSIDE_EMACS='30.0.92,tramp:2.7.1.30.1'
: Это переменная, указывающая на то, что вы находитесь внутри среды Emacs. В данном контексте, она содержит информацию о версии Emacs и используемом плагине Tramp. -
ENV=''
: Устанавливает переменную окруженияENV
в пустое значение, что означает, что никакие дополнительные настройки окружения не должны загружаться. -
HISTFILE=~/.tramp_history
: Указание файла для хранения истории команд. -
PROMPT_COMMAND=''
: Установка переменнойPROMPT_COMMAND
в пустую строку, что отключает любые команды, выполняемые перед выводом приглашения. -
PS1=///01f0dd71d3eb563311f9d396860f0297\#$
и подобные: Определяет вид приглашения командной строки. -
/bin/sh -i
: Запускает новый экземпляр интерактивной оболочки с установленными переменными окружения.
Почему echo $INSIDE_EMACS
не выводит ничего?
Теперь рассмотрим, почему, после выполнения данной команды, переменная INSIDE_EMACS
не доступна:
-
Область видимости переменных: Переменные окружения, установленные в данном экземпляре
env
, не сохраняются после завершения процесса. Когда вы запускаете новый интерактивный шелл (в данном случае/bin/sh -i
), он не наследует переменные окружения от родительского процесса, если они не были правильно экспортированы. -
Проблема с
exec
: При использованииexec
, оболочка, в которой вы выполняете команду, заменяется новой оболочкой. Текущий контекст взаимодействия с оболочкой будет потерян, и любые команды, введенные в рамках этой новой оболочки, не будут видеть ранее установленные переменные окружения. -
Отсутствие экспорта: Если переменная
INSIDE_EMACS
не была экспортирована, она останется локальной для текущей сессии и не будет доступна дальше. Для того чтобы переменная окружения была доступна в дочерних процессах, она должна быть явно экспортирована с помощью командыexport
.
Итог
Ваша команда, несмотря на её сложность, не сохраняет переменные окружения, установленные внутри exec env
, в новой оболочке, поскольку exec
заменяет специалиста оболочку новой, и переменные окружения не экспортируются. Чтобы исправить данную ситуацию, необходимо либо не использовать exec
, либо гарантировать, что переменные среда корректно экспортированы перед запуском новой оболочки.