Почему в Mac OS X нет исходного кода ~ / .bashrc? [Дубликат]

95

На этот вопрос уже есть ответ здесь:

Я нашел много людей, выясняющих, почему инструкция похожа на это:

Put X to your ~/.bashrc and you can do Y

не работает

Всегда получается, что загрузочные файлы bash в Mac OS X (или сам Bash в Mac) не содержат файл ~ / .bashrc, либо в оболочке входа в систему, либо в оболочке, порожденной из оконной системы - как приложение Terminal в Mac OS X)

Почему, когда все другие Unix-подобные системы с Bash, с которыми я работал раньше, сделали это?

PS:

Я обнаружил, что Bash говорит о файлах запуска (что может быть полезно):

Когда Bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения. Опция --noprofile может использоваться, когда оболочка запущена, чтобы запретить это поведение.

Источник: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Павел Бревчински
источник
Я также заметил, что ~/.bash_profileвыполняется, но нет ~/.bashrc. Wierd.
igaurav

Ответы:

90

В OSX терминал по умолчанию запускает сеанс входа в систему, поэтому читает .bash_profile и т. Д. (Процесс входа в GUI, запрашивающий ваше имя и пароль, не использует сценарии оболочки и не запускает оболочку, все это выполняется из launchd и рабочей области)

В других Unix xterm по умолчанию запускает оболочку, не входящую в систему, поэтому они читают .bashrc, поскольку сценарии, которые предоставляют вам ваш пароль и т. Д. При входе в систему, вызывают сеанс входа в систему, и все терминалы являются подпроцессом этого процесса и наследуют среду оболочки.

Из документа GNU, на который вы ссылались

Вызывается как интерактивная оболочка без авторизации

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, Bash читает и выполняет команды из ~ / .bashrc, если этот файл существует. Это может быть запрещено с помощью параметра --norc. Опция --rcfile file заставит Bash читать и выполнять команды из файла вместо ~ / .bashrc.

Итак, обычно ваш ~ / .bash_profile содержит строку

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

после (или до) любых специфичных для входа инициализаций.

user151019
источник
7
Unicies = Unixes?
Павел Бревчински
8
Ну юниксы я имел в виду - я опиралась латынь в школе , так Удалитель формы множественного числа - см en.wikipedia.org/wiki/Unix
user151019
8
... и 3-й класс "Unixen" (хотя я предпочитаю Unices)
earcam
7
и четвертый "Единороги" ...
Тинк
8
давайте не будем забывать нулевую форму, то есть "евнухи"
smatthewenglish
19

bashчитает только .bashrcдля не-логинов :

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из ~ / .bashrc, если этот файл существует. Это может быть запрещено с помощью параметра --norc. Опция --rcfile file заставит bash читать и выполнять команды из файла вместо ~ / .bashrc.

Поскольку Терминал запускается bashкак оболочка входа в систему (запускается, wчтобы увидеть, что bashэкземпляры выполняются как -bash), .bashrcникогда не читается автоматически.

Nohillside
источник
Итак, смысл в том, что приложение Termina в Mac OS X всегда создает экземпляр bash для входа в систему? Почему ? Если вы действительно не авторизуетесь. (У вас есть логин ранее из GUI)
Paul Brewczynski
Почему другие системы unix читают ~ / .bashrc?
Павел Бревчински
3
Никто здесь не в состоянии объяснить дизайнерские решения, принятые Apple. Я легко могу поспорить с обеими сторонами, но это тоже не поможет. Так что просто примите это, как это, вероятно, лучший вариант
nohillside
Что ж, это первый раз, когда вы запускаете оболочку от имени пользователя, то есть для входа в систему, в Unix на основе X11 вы запускаете оболочку, которая затем запускает X, так что это не логин
user151019
@PaulBrewczynski Ну, в Linux есть вызов из .bash_profile в .bashrc.
Пол Стелиан