10

Я использую экран ежедневно для своих нужд терминала, и я вполне доволен этим. В последнее время , хотя, я сделал некоторые обновления мои файлы конфигурации Баш , и я заметил , что я устанавливал различные элементы PATH PATH MANPATH INFOPATH и т.д.) в 2 -х местах. Я изменил файлы так, чтобы они были такими, какими они должны быть, и теперь все мои переменные среды устанавливаются один раз в .bash_profile . В этом и заключается моя проблема.

Очевидно, причина, по которой я устанавливал их в двух местах, была из-за экрана. экран появляется только выполнить .bashrc и не появляется , чтобы наследовать мой PATH или какие - либо другие переменные окружения правильно с моей первоначальной Баш оболочки. Поскольку он выполняет только .bashrc и теперь я устанавливаю свои переменные только в .bash_profile , я получаю неполный PATH .

Мой вопрос в том, как вывести мои переменные окружения на экран без дублирования. Чтение документов Bash похоже, указывает на то, что это может быть оболочка, используемая экраном для входа в систему, то есть интерактивная оболочка без регистрации, но я не мог понять, как заставить экран использовать оболочку определенного типа, только оболочка для использования через -s /bin/bash .

Вы можете просмотреть мои файлы конфигурации на моей странице GitHub. Это коммит, который сломал экран.

РЕДАКТИРОВАТЬ: я использую Screen version 4.00.03 (FAU) 23-Oct-06 и я склонен вызывать его по screen -h 50000

РЕДАКТИРОВАТЬ: Теперь я был в состоянии проверить это на Cygwin (CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686 5/3) i686 , Screen version 4.00.03 (FAU) 23-Oct-06), и он демонстрирует другое поведение, чем на мой Mac.

Конкретное поведение, которое я сейчас обнаружил, заключается в том, что в Cygwin изменения, которые я делаю в PATH в .bash_profile, дублируются при входе в экран, и затем последовательное создание окон экрана не дублирует путь, а создает исходный код .bash_profile.

Чтобы проиллюстрировать поведение, о котором я говорю:

Выход из свежего терминала:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Вывод из первого вызова экрана:

[~]$ screen -h 50000 -s -/bin/bash

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Последующие звонки в C-a c:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Ты можешь видеть

6 ответов6

15

Экран и переменные среды

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

Допустим, что ни конфигурация вашей оболочки, ни конфигурация экрана не изменят переменную с именем FOOBAR (скорее всего, в общем). Если вы запустите сеанс с FOOBAR=foo screen , то все оболочки, созданные в этом сеансе, будут иметь переменную среды с именем FOOBAR со значением foo .

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

Отсутствуют настройки при использовании экрана

Войти Оболочки

Если вы обнаружите, что в оболочках, запускаемых с экрана, отсутствуют некоторые параметры, это может быть связано с тем, что ваша оболочка настроена только на обновление этих настроек для оболочек «входа». Большинство оболочек понимают специальное соглашение (в C: **argv == '-'), которое экран может быть настроен для использования.

Согласно экранной документации:

команда оболочки

Установите команду, которая будет использоваться для создания новой оболочки. Это переопределяет значение переменной окружения $ SHELL. Это полезно, если вы хотите запустить tty-Enhancer, который ожидает выполнения программы, указанной в $ SHELL. Если команда начинается с символа «-», оболочка будет запущена как логин-оболочка.

Чтобы экранные оболочки запускались как оболочки входа в систему, запустите экран с screen -s -/bin/bash или добавьте эту строку в ваш .screenrc:

shell -/bin/bash

Отрегулируйте путь к любой оболочке, которую вы используете.

Конфигурация экрана

Отсутствие или сброс переменных среды также могут быть вызваны командами setenv и unsetenv в файле конфигурации экрана . Вам нужно будет проверить как .screenrc в вашем домашнем каталоге, так и любой файл, который ваша компиляция экрана использует в качестве 'system screenrc' (вы можете попробовать команду, подобную strings "$(which screen)" | fgrep -i screenrc чтобы найти путь, который был настроен во время компиляции - обычно это /etc/screenrc для экрана, установленного системой; при установке дополнений, вероятно, будет использоваться другой путь). Вы можете использовать SCREENRC=/dev/null SYSSCREENRC=/dev/null screen чтобы временно избегать этих файлов настроек, но есть опция времени компиляции, которая препятствует эффективному использованию SYSSCREENRC (предположительно, чтобы системные администраторы могли заставить некоторый начальный бит) конфигурации).

Дублирование настроек при использовании экрана

Весьма распространено добавлять элементы в переменную среды, такую как PATH, в файл (ы) конфигурации оболочки, чтобы обновленное значение было доступно для обычных сеансов оболочки (например, xterm или других окон терминала, сеансов консоли и т.д.). Если такие элементы добавляются в конфигурации оболочки для оболочки (или, если вы используете параметр -/path/to/shell описанный выше, в конфигурации оболочки для входа в систему), то оболочка, запущенная экраном , вероятно, будет иметь несколько копий. из добавленных предметов.

Одной из стратегий, позволяющих избежать этого, является добавление всех добавлений к переменным, таким как PATH, в конфигурацию оболочки для каждого входа в систему и избегание использования параметра оболочки -/path/to/shell с screen.

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

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

диагностика

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

Проверьте текущее значение в вашей начальной оболочке:

echo "$PATH"

Проверьте, как сама оболочка изменяет значение при создании под-оболочки:

/bin/bash -c 'echo "$PATH"'

Проверьте, как оболочка изменяет значение при создании под-оболочки 'login':

perl -e '$s=shift;exec {$s} "-$s", @ARGV or die "unable to start shell"' /bin/bash
echo "$PATH"
exit

Проверьте, как экран изменяет значение:

printf '#!/bin/sh\nl=/tmp/echo-var.log;rm -f "$l"; echo $PATH >"$l"' >/tmp/echo-var &&
chmod a+x /tmp/echo-var &&
screen -s /tmp/echo-var &&
cat /tmp/echo-var.log
2

В прошлый раз, когда я видел подобную проблему, я решил ее, используя screen -l при запуске screen.

Вы можете использовать опцию -l при вызове screen (включить режим входа в систему ; также управляется deflogin и login в .screenrc), чтобы указать, должен ли экран регистрировать окно по умолчанию (добавляя / удаляя запись / etc / utmp) ,

Режим входа по умолчанию включен, но его можно изменить во время компиляции. Если экран не скомпилирован с поддержкой utmp, эти команды недоступны.

Мне не нужен режим -l на стандартном экране Debian Lenny (v4.0.3); Похоже, он включен по умолчанию. Мои ~/.profile и ~/.bashrc читаются правильно. Как вы вызываете screen? Какую версию ты используешь?

2

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

https://trac.macports.org/ticket/18235#comment:26

1

Нет ничего плохого в получении вашего .bashrc из .bash_profile. Если вы используете свою машину только локально, ваш .bash_profile в большинстве случаев будет получен только при первом входе в систему (очевидно, что в других случаях он получен).

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

0

Всякий раз, когда у меня возникает такая проблема, я создаю файл $HOME/.debug и во всех файлах, которые получаются / выполняются во время входа в систему / вызова оболочки (например, ~/.bashrc , ~/.bash_profile , ~/.profile , /etc/bashrc ) у меня в качестве первой строки

test -f $HOME/.debug && echo $HOME/.bashrc 1>&2

или похожие. Для конкретной отладки вы также можете добавить такие вещи, как

test -f $HOME/.debug && echo PATH now equals $PATH 1>&2

Таким образом, вы можете быть на 100% абсолютно уверены, какие файлы используются или нет.

Перенаправление на stderr важно, вы не хотите, чтобы во многих ситуациях что-то портило stdout.

0

Вы можете остаться с .profile, так как система не касается bashrc (например, графического сеанса). Теперь у вас просто есть два разных набора окружений - один из .profile, другой для bash из .bashrc.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .