.profile i .bashrc nie działają na moim komputerze Mac

29

Ten problem mam od dłuższego czasu. Po uruchomieniu terminalu .profile i .bashrc plik nie działa (nie są wykonywane). Czy możesz wskazać, gdzie powinienem szukać źródła problemu?


źródło
sprawdź, czy te pliki mają odpowiednie uprawnienia
tak ... masz rację powód był naprawdę głupi - nieprawidłowe uprawnienia chmod + x ~ / .profile i wszystko działa dobrze.
5
@xTrol: To nie ma sensu, ~/.profilenie wymaga pozwolenia na wykonanie. (Powłoka je pozyskuje, nie wykonuje). Spróbuj chmod -x ~/.profilesprawdzić, czy nadal działa.
Keith Thompson,

Odpowiedzi:

40

Miałem podobny problem z tym, że .profilenie byłem prowadzony. Okazuje się (jak wyjaśniono w odpowiedzi Apple StackExchange ), że jeśli masz .bash_profilelub .bash_loginpliki, to .profilezostanie zignorowany przez bash.

pidge
źródło
2
Mój problem polegał na tym, że zainstalowałem Python, który automatycznie utworzył plik .bash_profile, co spowodowało, że mój .profile nie uruchomił się.
5
Ta odpowiedź mi pomaga. .bash_loginzostał dodany po instalacji rvm.
17

Myślę, że te pytania i odpowiedzi powinny przejść do Superuser, ale w każdym razie:

Zgodnie z wezwaniem sekcji strony man ,

  • /etc/profilei ~/.profilejest czytany dla interaktywnej powłoki logowania, oraz
  • ~/.bashrc jest odczytywany dla interaktywnej powłoki niezalogowanej.

Jeśli Twój drugi komputer z systemem UNIX automatycznie czyta ~/.bashrcnawet interaktywną powłokę logowania, dzieje się tak dlatego, że w całym systemie /etc/ profileznajduje się linia, która czyta ~/.bashrc. System OS X /etc/profilenie ma takiego systemu.

Tak więc, jeśli chcesz uruchomić ~/.bashrcnawet dla interaktywnej powłoki logowania, musisz dołączyć linię

. ~/.bashrc

w twoim ~/.profile.

Yuji
źródło
I aby uzupełnić brakujący fragment tutaj: Powłoka terminalu (o którą było pytanie PO) jest domyślnie interaktywną powłoką logowania.
LarsH
3

Spróbuj pozyskać je „ręcznie”:

source ~/.profile

i zobacz co się stanie. Zauważ, że jak zauważyli inni, plik .profile jest pozyskiwany z powłok logowania, a .bashrc z powłok innych niż login; więc spróbuj jednego lub drugiego, a nie obu.

Gordon Davisson
źródło
2

W preferencjach terminalu sprawdź w okienku „Uruchamianie”. Masz opcje:

Muszle otwierają się za pomocą:

  • Domyślna powłoka logowania (/ usr / bin / login)
  • Command (pełna ścieżka)

Wybrałem opcję „domyślną” ... jeśli wybrano niestandardowe polecenie, może to być czynnik.

Następnym punktem do sprawdzenia jest to, czy powłoka jest uruchamiana jako powłoka logowania. Kiedy robię pswpis, widzę:

  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

Kluczowym punktem jest tutaj „ -” przed nazwą powłoki; który mówi powłoce, aby przeszła przez profil i powiązane rzeczy. Jeśli nie widzisz tego w swoich obecnych oknach, być może będziesz musiał omijać ustawienia, dopóki tego nie zrobisz.

Panel ustawień w preferencjach terminala zawiera także opcję powłoki. Mam / bin / sh na liście w moim.


Nie powinieneś tego potrzebować

Jeśli najgorsze dojdzie do najgorszego, możesz zrobić tak, jak to robiłem na niektórych innych niechętnych do współpracy systemach w przeszłości - stworzyłem program „loginsh”, który mogłem uruchomić z systemu Windows, a on z kolei wykonałby moją wybraną powłokę za pomocą „ -” przedrostek informujący, że ma on działać jako powłoka logowania.

#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);
}

(Procedury "stderr.h"nagłówka i „ err_*” są pakietem raportowania błędów, którego używam wszędzie. jlss_basename()Funkcja jest zasadniczo taka sama, jak wersje systemowa, taka jak w POSIX <libgen.h>.)

Jonathan Leffler
źródło
2

Dobre informacje powyżej, ale pomyślałem, że podzielę się szczegółami na temat mojego problemu i rozwiązania, które znalazłem.

Konieczność: Dodaj katalog do PATH na OSX 10.8 (ML).

Problem: Poradnik często „modyfikuje plik .profile w twoim katalogu domowym”. Trochę mylące, ponieważ domyślnie ten plik nie istnieje w OSX. Podwójnie mylące, ponieważ po dodaniu instrukcji eksportu w celu dołączenia nowego katalogu do istniejącej ŚCIEŻKI ... to nie działa. Objęte powyżej.

Rozwiązanie: dodałem instrukcję eksportu do mojego pliku .bash_profile (również w katalogu domowym).

Jestem pewien, że istnieje wiele sposobów na skórowanie tego kota. Ten działał dla mnie. Nieco inspirujące zaufanie: profil .bash już istniał i widziałem, że inne zainstalowane oprogramowanie (np. Ruby) zmodyfikowało go. Jeśli istnieje lepsze rozwiązanie, chętnie o nim usłyszę!

tjim
źródło