Почему интерактивные оболочки на оболочках входа в систему OSX по умолчанию?

При использовании ssh, у Вас может просто быть выполненный вместо оболочки (значение по умолчанию), когда Вы соединяетесь.

ssh -t me@host screen -RD

Это создаст новую сессию, каждый не существует или иначе соединяется с существующей сессией.

-t отметьте к ssh, говорит создать имущество даже при том, что он не запускает оболочку. Вам нужно это для интерактивного использования.

43
13.05.2014, 04:34
3 ответа

Предполагается, что работает так, что в момент, когда вы получаете приглашение оболочки, оба .profile и .bashrc были запущены. Конкретные детали того, как вы дошли до этой точки, имеют второстепенное значение, но если какой-либо из файлов вообще не запускается, у вас будет оболочка с неполными настройками.

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

Как объясняется на вики-странице Debian , на которую ссылается Алан Шутко:

«Почему тогда .bashrc отдельный файл от .bash_profile ? выполняется в основном по историческим причинам, когда машины были чрезвычайно медленными по сравнению с сегодняшними рабочими станциями. Обработка команд в .profile или .bash_profile могла занять довольно много времени, особенно на машине, где большая часть работы должна была выполняться внешними командами (pre-bash). Таким образом, сложные команды начальной настройки, которые создают переменные среды, которые могут быть переданы дочерним процессам, помещаются в .bash_profile . Временные параметры и псевдонимы, которые не наследуются, помещаются в .bashrc , так что они могут быть перечитаны каждой подоболочкой. "

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


Что-то вроде глупой особенности bash, которой нет у большинства других оболочек, заключается в том, что он не запускает автоматически .bashrc , если он запускается как оболочка входа в систему. Стандартный обходной путь для этого - включить что-то вроде следующих команд в .bash_profile :

[[ -e ~/.profile ]] && source ~/.profile    # load generic profile settings
[[ -e ~/.bashrc  ]] && source ~/.bashrc     # load aliases etc.

В качестве альтернативы можно вообще не иметь .bash_profile , а просто включить некоторые Специфичный для bash код в общем файле .profile для запуска .bashrc при необходимости.

Если OSX по умолчанию .bash_profile или .profile не делает этого , то это, вероятно, ошибка. В любом случае правильным решением будет просто добавить эти строки в .bash_profile .


Правка: Как отмечает Strugee , оболочкой по умолчанию в OSX была оболочка tcsh, чье поведение в этом отношении гораздо разумнее: при запуске в качестве оболочки для интерактивного входа tcsh автоматически считывает оба . profile и .tcshrc / .cshrc , и, следовательно, не требует каких-либо обходных решений, таких как трюк .bash_profile , показанный выше.

Основываясь на этом, я на 99% уверен, что отказ OSX предоставить соответствующий по умолчанию .bash_profile вызван тем, что, когда они переключились с tcsh на bash, люди в Apple просто не сделали этого. обратите внимание на эту небольшую бородавку в поведении запуска bash. С tcsh такие уловки не потребовались - запуск tcsh в качестве оболочки входа из эмулятора терминала OSX Just Plain Works и делает все правильно без таких проблем.

33
27.01.2020, 19:34
[118239] Основная причина, по которой терминальные приложения X по умолчанию запускают оболочки без входа в систему, заключается в том, что в начале вашего .Xsession должен был быть запущен .profile для настройки ваших начальных элементов входа в систему. Затем, так как все это уже было настроено, терминальным приложениям не нужно было запускать его, они могли запускать .bashrc. Обсуждение того, почему это имеет значение, находится по адресу [118705]https://wiki.debian.org/DotFiles[118706]:[12195]Давайте возьмём xdm в качестве примера. Однажды Пьер возвращается из отпуска и обнаруживает, что его системный администратор установил xdm в систему Debian. Он отлично входит в систему, и xdm читает его файл .xsession и запускает fluxbox. Кажется, что всё в порядке, пока он не получит сообщение об ошибке не в той локали! Так как он переопределяет переменную LANG в своем .bash_profile, и так как xdm никогда не читает .bash_profile, его переменная LANG теперь установлена в en_US вместо fr_CA.[12196]Теперь, наивным решением этой проблемы является то, что вместо запуска "xterm", он может настроить свой оконный менеджер на запуск "xterm -ls". Этот флаг говорит xterm, что вместо запуска обычной оболочки он должен запускать оболочку для входа в систему. При такой настройке xterm порождает /bin/bash, но помещает "-/bin/bash" (или, может быть, "-bash") в вектор аргумента, поэтому bash действует как оболочка для входа в систему. Это означает, что каждый раз, когда он открывает новый xterm, он будет читать /etc/profile и .bash_profile (встроенный bash behavior), а затем .bashrc (потому что .bash_profile говорит делать это). Сначала может показаться, что это работает нормально - его точечные файлы не тяжелые, так что он даже не замечает задержку - но есть более тонкая проблема. Он также запускает веб-браузер непосредственно из меню своего fluxbox, и веб-браузер наследует переменную LANG от fluxbox, которая теперь установлена не на ту локаль. Так что, хотя его xterms могут быть в порядке, и все, что запускается из его xterms, может быть в порядке, его веб браузер все еще выдает ему страницы не с той локали.[12197]В OS X пользовательское окружение не запускается кучей скриптов оболочки, и запуск не приводит к появлению .profile в любой момент времени. (Это своего рода позор, так как это означает, что гораздо более надоедливо устанавливать переменные окружения, но такова жизнь). Так как это не так, когда бы он запустил .profile? [118711] Только [118712], если бы вы вошли? Это кажется немного бессмысленным, так как многие коробки никогда не будут целями ssh. Может также заставить терминалы запускать оболочки для входа в систему по умолчанию, так что .profile будет запущен когда-нибудь.[12198]А как насчет .bashrc? Он бесполезен? Нет. Он все еще имеет то назначение, которое было во времена VT100. Он используется в любое время, когда вы открываете оболочку, кроме открытия окна терминала. Так что, если вы открываете оболочку из Emacs или vi, или если вы делаете su-пользователя. [118246]
14
27.01.2020, 19:34
[118227] Не знаю, зачем они это сделали. Однако вот мое предположение.[12188]Для начала стоит отметить, что в системе GNU/Linux вы, конечно, можете перейти на vt1, vt2 и т.д. Там вы получаете оболочку для входа в систему. В системе OS X эквивалента нет. Единственный способ получить доступ к основам UNIX - это через терминальный эмулятор или через однопользовательский режим (оговорка: я никогда не пользовался однопользовательским режимом; это IIRC, управляемый с помощью командной строки, но я могу ошибаться). Поэтому, в OS X, что бы ни было по умолчанию в эмуляторе, это по умолчанию для всей системы.[12189]Теперь, зачем вам делать оболочку по умолчанию для входа в систему? Есть пара (читайте: не так уж и много) причин, по которым я могу придумать это сделать.[12190]Это обеспечит вам постоянный пользовательский опыт, если вы вставите SSH в ящик. (Особенно важно для серверной версии OS X - предположительно, если вы работаете с сервером OS X, вы новичок)[12191]Оболочкой по умолчанию OS X была [118831]tcsh[118832]. Это примерно такая дикая догадка, которую вы можете получить, но может быть, что [118833]tcsh[118834] обычно что-то делали, когда запускались как оболочка для входа в систему, и исторический шаблон застрял. (Сомневаюсь, однако - может быть, один из старых завсегдатаев мог бы нам сказать.)[12192] "Мы - Яблоко". Мы - поставщики самого большого дистрибутива UNIX на планете. Неважно, насколько банальны наши причины; если мы принимаем решение, ваш инструмент должен с этим справиться"[12193]Честно говоря, я использую Дарвина ~6 лет и не могу ответить на этот вопрос должным образом. Для меня это тоже не имеет смысла.[12194]Чтобы ответить на ваш вопрос, [118703]bash[118704] не исправлен или что-то в этом роде (по крайней мере, для этого). Эмулятор терминала по умолчанию запускает оболочки для входа в систему по умолчанию, и предположительно iTerm копирует это.[118238].
4
27.01.2020, 19:34

Теги

Похожие вопросы