.profile та .bashrc не працюють на моєму Mac


29

Ця проблема у мене є давно. Після запуску терміналу .profile і .bashrc файл не працює (не виконується). Не могли б ви вказати, де я повинен шукати джерело проблеми?


перевірити, чи мають ці файли належні дозволи

так ... ви праві, причина була справді дурна - неправильні дозволи chmod + x ~ / .profile, і все працює добре.

5
@xTrol: Це не має сенсу, ~/.profileне вимагає дозволу на виконання. (Оболонка її джерело, вона не виконує). Спробуйте chmod -x ~/.profileі подивіться, чи все ще працює.
Кіт Томпсон

Відповіді:


40

У мене була схожа проблема з тим, що я .profileне був запущений. Виявляється (як описано в цій відповіді компанії Apple StackExchange ) , що якщо у вас є .bash_profileабо .bash_loginфайли, то ваш .profileбуде ігноруватися Баш.


2
Моя проблема полягала в тому, що я встановив Python, який автоматично створив файл .bash_profile, через що мій .profile не запускався.

5
Ця відповідь мені допомагає. .bash_loginбуло додано після встановлення rvm.

17

Я думаю, це питання і відповіді повинно перейти до Superuser, але все одно:

Згідно з розділом ІНВОКАЦІЯ довідкової сторінки ,

  • /etc/profileі ~/.profileчитається для інтерактивної оболонки для входу та
  • ~/.bashrc читається для інтерактивної оболонки без входу.

Якщо ваш інший апарат UNIX автоматично зчитує ~/.bashrcнавіть інтерактивну оболонку входу, це тому, що на всій системі /etc/ profileє рядок, який читає ~/.bashrc. У системі OS X /etc/profileнемає такої.

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

. ~/.bashrc

у вашому ~/.profile.


І щоб заповнити пропущений фрагмент тут: оболонка терміналу (про яке йдеться в питанні ОП) за замовчуванням - це інтерактивна оболонка для входу.
LarsH

3

Спробуйте знайти їх "від руки":

source ~/.profile

і подивіться, що станеться. Зауважте, що, як зазначають інші, .profile розміщується оболонками для входу, .bashrc - оболонками, які не входять у систему; тому спробуйте те чи інше, а не те й інше.


2

У налаштуваннях вашого терміналу перевірте на панелі "Запуск". У вас є варіанти:

Раковини відкриваються:

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

У мене вибрано "за замовчуванням" ... якщо у вас вибрана спеціальна команда, це може бути фактором.

Наступний момент, який слід перевірити, чи запущена оболонка як оболонка для входу. Коли я роблю 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

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

Необхідність: Додайте каталог до PATH на OSX 10.8 (ML).

Проблема: Керівництво часто "модифікує .profile у вашому домашньому каталозі". Трохи заплутано, оскільки за замовчуванням цей файл не існує в OSX. Дуже заплутано, оскільки щойно ви додаєте заяву про експорт, щоб додати новий каталог до існуючого PATH ... він не працює. Покрито вище.

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

Я впевнений, що існує багато способів зняти шкіру з цією кішкою. Цей працював на мене. Дещо надихає впевненість: .bash_profile вже існував, і я міг помітити, що інше встановлене програмне забезпечення (наприклад, Ruby) змінило його. Якщо буде краще рішення, я буду радий почути про це!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.