Я использую экран ежедневно для своих нужд терминала, и я вполне доволен этим. В последнее время , хотя, я сделал некоторые обновления мои файлы конфигурации Баш , и я заметил , что я устанавливал различные 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
, 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 ../..'
...
[~]$
Ты можешь видеть
источник
Ответы:
экран и переменные среды
По умолчанию экран передает своим оболочкам (и другим процессам) любые переменные среды, которые были у него при запуске сеанса (т. Е. Переподключение не меняет, какие переменные среды передаются новым оболочкам). Но поскольку конфигурационные файлы как экрана, так и оболочек обычно меняют переменные окружения, есть много мест, где могут быть внесены неожиданные изменения. Есть несколько переменных, таких как TERM , экран которых он почти всегда меняет, но они, как правило, требуются для функциональности, предоставляемой экраном .
Допустим, что ни конфигурация вашей оболочки, ни конфигурация экрана не изменят переменную с именем FOOBAR (скорее всего, в общем). Если вы начнете сеанс с
FOOBAR=foo screen
, то все оболочки, созданные в этом сеансе, будут иметь переменную среды с именем FOOBAR со значениемfoo
.Ситуация усложняется для переменных, которые может изменить экран или ваша оболочка.
Отсутствие настроек при использовании экрана
Войти Оболочки
Если вы обнаружите, что в оболочках, запускаемых с экрана , отсутствуют некоторые параметры , это может быть связано с тем, что ваша оболочка настроена только на обновление этих настроек для оболочек «входа». Большинство оболочек понимают специальное соглашение (в C:),
**argv == '-'
что экран может быть настроен для использования.Согласно экранной документации :
Чтобы экранные оболочки запускались в качестве оболочек для входа в систему, запускайте экран с помощью
screen -s -/bin/bash
или добавьте эту строку в свой.screenrc
:Отрегулируйте путь к любой оболочке, которую вы используете.
Конфигурация экрана
Отсутствует или сброс переменных среды также может быть из - за
setenv
иunsetenv
команды в окно файла конфигурации. Вам нужно будет проверить как .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
оболочки с экраном .Другая стратегия заключается в добавлении новых элементов в переменную только условно. В зависимости от оболочки, код для этого может быть немного сложным, но обычно он может быть заключен в функцию оболочки для удобства использования.
Еще одна стратегия - всегда начинать с фиксированного значения в ваших файлах конфигурации. Иногда это может вызвать проблемы при перемещении файлов конфигурации из системы в систему, когда значения по умолчанию могут значительно отличаться.
диагностика
Если вы не можете напрямую определить, где происходит конкретная модификация, вы можете попробовать следующее, чтобы отследить, где происходит изменение.
Проверьте текущее значение в вашей начальной оболочке:
Проверьте, как сама оболочка изменяет значение при создании под-оболочки:
Проверьте, как оболочка изменяет значение при создании под-оболочки 'login':
Проверьте, как экран изменяет значение:
источник
screen -s -/bin/bash
но он не работает так, как я ожидал, что он будет работать под управлением Cygwin на моей рабочей машине. На этой машине я запускаю,screen -h 50000
и она просто наследует мою,PATH
фактически не получая файл снова. Это запускается каждый раз, когда я запускаю новое окно.FOOBAR=baz screen
и проверьecho $FOOBAR
в оболочке windows отscreen
аscreen -s -/bin/bash
. Оба варианта должны иметьFOOBAR
=baz
. Если вашаPATH
модификация, вам придется отслеживать, что это делает. ПопробуйтеSYSSCREENRC=/dev/null SCREENRC=/dev/null screen
, если это позволяетPATH
, то это, вероятно,setenv PATH
в/etc/screenrc
или~/.screenrc
. В противном случае это то, что вы.bashrc
делаете.В последний раз, когда я видел подобную проблему, я решил ее, используя
screen -l
при запуске экрана.Вы можете использовать
-l
опцию при вызовеscreen
(переворачивать режим входа на, также контролируетсяdeflogin
иlogin
команды в.screenrc
) , чтобы установить , следует ли экран входа в окно , по умолчанию (добавление / удаление / и т.д. / запись utmp).Режим входа по умолчанию включен, но его можно изменить во время компиляции. Если экран не скомпилирован с поддержкой utmp, эти команды недоступны.
Мне не нужен
-l
режим на экране Debian Lenny по умолчанию (v4.0.3); кажется, он включен по умолчанию. Мои~/.profile
и~/.bashrc
читают правильно. Как вы вызываетеscreen
? Какую версию ты используешь?источник
screen -ln
должен запускать мой , и он все еще запускается. так что попробуйте флаг, но это, вероятно, не правильный ответ. оставлю это здесь на данный момент.~/.profile
-l
-l
только контролирует,screen
добавляет ли запись вutmp
файл, а не вызывает ли он новые оболочки с их собственной-l
опцией или использует пользовательский exec--
with--prefix.Проблема заключается в поведении запуска на Leopard. Посмотрите этот отчет об ошибках MacPorts для экрана на Leopard, чтобы понять, почему он никогда не будет исправлен, если вы не можете каким-то образом сделать репортаж о запуске Snow Leopard.
https://trac.macports.org/ticket/18235#comment:26
источник
Нет ничего плохого в том, чтобы получить ваш .bashrc из .bash_profile. Если вы используете свой компьютер только локально, ваш .bash_profile в большинстве случаев будет получен только при первоначальном входе в систему (очевидно, что в других случаях он получен).
Я организую свои файлы так, чтобы, если я хочу, чтобы что-то было сделано только при входе в систему, я помещал информацию в .bash_profile, а для всего остального я помещал их в .bashrc. PATH - это одна вещь, которую я помещаю в свой .bashrc, и я поставляю .bashrc в свой .bash_profile.
источник
.bashrc
и.bash_profile
файлы где-нибудь, чтобы я мог их увидеть? Проблема, с которой я столкнулся при выполнении чего-то подобного, заключалась в том, чтоPATH
он увеличивался каждый раз, когда я создавал новый экземпляр экрана, потому что он наследовал старый,PATH
а затем снова все добавлял.Всякий раз , когда у меня есть какая - то проблема , как я создать файл
$HOME/.debug
и все файлы источников / выполняется во время входа / оболочки вызова (например~/.bashrc
,~/.bash_profile
,~/.profile
,/etc/bashrc
и т.д.) У меня есть в первой строкеили похожие. Для конкретной отладки вы также можете добавить такие вещи, как
Таким образом, вы можете быть на 100% абсолютно уверены, какие файлы используются или нет.
Перенаправление на stderr важно, вы не хотите, чтобы во многих ситуациях что-то портило stdout.
источник
Вы можете остаться с .profile, так как система не касается bashrc (например, графического сеанса). Теперь у вас просто есть два разных набора окружения - один из .profile, другой для bash из .bashrc.
источник