В Linux и, насколько мне известно, во всех системах Unix эмуляторы терминала по умолчанию запускают интерактивные оболочки, не входящие в систему. Это означает, что для bash запущенная оболочка будет:
Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды от
/etc/bash.bashrc
и~/.bashrc
, если эти файлы существуют. Это может быть запрещено с помощью--norc
опции.Опция
--rcfile
file заставит bash читать и выполнять команды из файла вместо/etc/bash.bashrc
и~/.bashrc
.
А для логинов оболочек:
Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с
--login
параметром, она сначала читает и выполняет команды из файла/etc/profile
, если этот файл существует. После прочтения этого файла, он ищет~/.bash_profile
,~/.bash_login
и~/.profile
, в таком порядке, и читает и выполняет команду из первого, который существует и читаемые.Эта
--noprofile
опция может использоваться, когда оболочка запускается, чтобы запретить это поведение.
В OSX, однако, оболочка по умолчанию (то есть bash), запущенная в терминале по умолчанию (Terminal.app), фактически использует источники ~/.bash_profile
и ~.profile
т. Д. Другими словами, она действует как оболочка входа в систему.
Основной вопрос : почему интерактивная оболочка по умолчанию является оболочкой входа в OSX? Почему OSX решил сделать это? Это означает, что все инструкции / учебные пособия для вещей, основанных на оболочке, в которых упоминаются изменения ~/.bashrc
, потерпят неудачу в OSX или наоборот ~/.profile
. Тем не менее, хотя Apple может выдвинуть много обвинений, найм некомпетентных или идиотских разработчиков не является одним из них. Предположительно, у них были веские причины для этого, так почему?
Подвопросы: Terminal.app на самом деле запускает интерактивную оболочку входа или они изменили поведение bash? Это специфично для Terminal.app или не зависит от эмулятора терминала?