.profile и .bashrc не работают на моем Mac

12908

Эта проблема у меня давно. После запуска терминала .profile, и .bashrc файл не работает (не выполняется). Не могли бы вы указать, где искать источник проблемы?

27
проверьте, имеют ли эти файлы надлежащие разрешения 13 лет назад 0
да ... вы правы причина была действительно глупой - неверные права доступа chmod + x ~ / .profile и все работает хорошо. 13 лет назад 0
@xTrol: Это не имеет смысла, `~ / .profile` не требует разрешения на выполнение. (Оболочка получает его, но не выполняет). Попробуйте `chmod -x ~ / .profile` и посмотрите, все ли еще работает. Keith Thompson 12 лет назад 5

5 ответов на вопрос

39
pidge

У меня была похожая проблема с тем, что меня .profileне запускали. Оказывается (как описано в этом ответе компании Apple StackExchange ), что если у вас есть .bash_profileили .bash_loginфайлы, то ваш .profileбудет игнорироваться Баш.

Моя проблема заключалась в том, что я установил Python, который автоматически создал файл .bash_profile, из-за которого мой .profile не запускался. 12 лет назад 2
Этот ответ помогает мне. `.bash_login` был добавлен после того, как я установил` rvm`. 11 лет назад 5
17
Yuji

Я думаю, что это вопросы и ответы должны перейти к Superuser, но в любом случае:

Согласно разделу INVOCATION на странице руководства ,

  • /etc/profileи ~/.profileчитается для интерактивной оболочки входа в систему, и
  • ~/.bashrc читается для интерактивной оболочки без логина.

Если ваш другой компьютер UNIX автоматически читает ~/.bashrcдаже для интерактивной оболочки входа в систему, то это потому, что во всей системе /etc/ profileесть строка, которая читает ~/.bashrc. OS X в масштабе всей системы /etc/profileне имеет ни одного.

Итак, если вы хотите запустить ~/.bashrcдаже для интерактивной оболочки входа в систему, вам нужно включить строку

. ~/.bashrc 

в вашем ~/.profile.

И чтобы заполнить пропущенную часть здесь: Оболочка терминала (о которой был задан вопрос ОП) по умолчанию является интерактивной оболочкой входа в систему. LarsH 6 лет назад 0
3
Gordon Davisson

Попробуйте найти их «вручную»:

source ~/.profile 

и посмотрим, что получится. Обратите внимание, что, как уже отмечали другие, .profile поставляется из оболочек входа в систему, .bashrc - из оболочек без входа в систему; так что попробуйте один или другой, а не оба.

2
Jonathan Leffler

В настройках своего терминала проверьте на панели «Автозагрузка». У вас есть варианты:

Снаряды открываются с:

  • Оболочка для входа по умолчанию (/ usr / bin / login)
  • Команда (полный путь)

Я выбрал «default» ... если вы выбрали пользовательскую команду, это может быть фактором.

Следующий пункт, который нужно проверить, - запущена ли оболочка в качестве оболочки входа в систему. Когда я делаю psсписок, я вижу:

 PID TTY TIME CMD 24088 ttys000 0:00.03 -sh 24614 ttys001 0:00.03 -sh 25127 ttys002 0:00.05 -sh 35544 ttys003 0:00.08 -sh 40926 ttys004 0:00.03 -sh 

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

Панель настроек в настройках терминала также содержит список параметров оболочки. У меня / bin / sh в моем списке.


Вам не нужно это

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

#include <string.h> #include <stdlib.h> #include <unistd.h> #include "stderr.h" #include "jlss.h"  #ifndef DEFAULT_SHELL #define DEFAULT_SHELL "/bin/sh" #endif /* DEFAULT_SHELL */  #ifndef MAX_SHELLBASENAME #define MAX_SHELLBASENAME 256 #endif /* MAX_SHELLBASENAME */  #ifndef lint static const char sccs[] = "@(#)$Id: loginsh.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $"; #endif  int main(int argc, char **argv) { char *shell; char shellname[MAX_SHELLBASENAME];  err_setarg0(argv[0]);  /* Which shell to use? */ if ((shell = getenv("SHELL")) == (char *)0) shell = DEFAULT_SHELL;  /* Set up argv[0] in new argument list; reuse old argv space */ shellname[0] = '-'; strcpy(&shellname[1], jlss_basename(shell)); argv[0] = shellname;  /* Execv must work -- the shell must be an executable program */ execv(shell, &argv[0]); err_syserr("cannot execute shell %s\n", shell);  /* NOTREACHED */ return(EXIT_FAILURE); } 

( "stderr.h"Заголовок и err_*подпрограммы ' ' - это пакет сообщений об ошибках, который я использую повсюду. jlss_basename()Функция в основном такая же, как и в системных версиях, таких как POSIX <libgen.h>.)

2
tjim

Хорошая информация выше, но я подумаю, что поделюсь некоторыми особенностями проблемы, с которой столкнулся, и найденным решением.

Необходимость: добавить каталог в PATH на OSX 10.8 (ML).

Проблема: руководство часто "мод. .Profile в вашем домашнем каталоге". Немного сбивает с толку, поскольку по умолчанию этот файл не существует в OSX. Вдвойне сбивает с толку, потому что как только вы добавляете оператор экспорта для добавления нового каталога в существующий PATH ... это не работает. Покрытый выше.

Решение: я добавил оператор экспорта в мой файл .bash_profile (также в домашнем каталоге).

Я уверен, что есть много способов снять кожу с этой кошкой. Этот работал для меня. Некоторое доверие внушало: .bash_profile уже существовал, и я мог видеть, что другое установленное программное обеспечение (например, Ruby) изменило его. Если есть лучшее решение, я буду рад услышать об этом!