Эта проблема у меня давно. После запуска терминала .profile, и .bashrc файл не работает (не выполняется). Не могли бы вы указать, где искать источник проблемы?
5 ответов
У меня была похожая проблема с моим .profile
не запускался. Оказывается (как объяснено в этом ответе Apple StackExchange), что если у вас есть файлы .bash_profile
или .bash_login
, то ваш .profile
будет игнорироваться bash.
Я думаю, что это вопросы и ответы должны перейти к Superuser, но в любом случае:
Согласно разделу INVOCATION на странице руководства,
/etc/profile
и~/.profile
читаются для интерактивной оболочки входа в систему, и~/.bashrc
читается для интерактивной оболочки без входа в систему.
Если ваш другой компьютер UNIX автоматически читает ~/.bashrc
даже для интерактивной оболочки входа в систему, это потому, что в общесистемном /etc/
profile
есть строка, которая читает ~/.bashrc
. Общесистемный /etc/profile
OS X не имеет ни одного.
Итак, если вы хотите запустить ~/.bashrc
даже для интерактивной оболочки входа в систему, вам нужно включить строку
. ~/.bashrc
в вашем ~/.profile
.
Попробуйте найти их "вручную":
source ~/.profile
и посмотрим, что получится. Обратите внимание, что, как уже отмечали другие, .profile поставляется из оболочек входа в систему, .bashrc - из оболочек без входа в систему; так что попробуйте один или другой, а не оба.
Хорошая информация выше, но я подумаю, что поделюсь некоторыми особенностями проблемы, с которой столкнулся, и найденным решением.
Необходимость: добавить каталог в PATH на OSX 10.8 (ML).
Проблема: руководство часто "мод. .Profile в вашем домашнем каталоге". Немного сбивает с толку, поскольку по умолчанию этот файл не существует в OSX. Вдвойне сбивает с толку, потому что как только вы добавляете оператор экспорта для добавления нового каталога в существующий PATH ... это не работает. Покрытый выше.
Решение: я добавил оператор экспорта в мой файл .bash_profile (также в домашнем каталоге).
Я уверен, что есть много способов снять кожу с этой кошкой. Этот работал для меня. Некоторое доверие внушало: .bash_profile уже существовал, и я мог видеть, что другое установленное программное обеспечение (например, Ruby) изменило его. Если есть лучшее решение, я буду рад услышать об этом!
В настройках своего терминала проверьте на панели «Автозагрузка». У вас есть варианты:
Снаряды открываются с:
- Оболочка для входа по умолчанию (/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', которую я мог запускать из окон, и она, в свою очередь, запустила бы выбранную мной оболочку с помощью ' -
префикс, чтобы сказать, чтобы он работал как оболочка для входа.
#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);
}
(The "stderr.h"
заголовок и err_*
подпрограммы пакет отчетов об ошибках я использую везде. Функция jlss_basename()
в основном совпадает с версиями, предоставляемыми системой, например, в POSIX <libgen.h>
.)