.profile und .bashrc funktionieren auf meinem Mac nicht

13034

Dieses Problem habe ich schon lange. Nachdem das Terminalprofil ausgeführt wurde, funktioniert die .bashrc-Datei nicht (wird nicht ausgeführt). Könnten Sie angeben, wo ich eine Problemquelle suchen muss?

27
Prüfen Sie, ob diese Dateien über die richtigen Berechtigungen verfügen vor 13 Jahren 0
ja ... du hast recht der Grund war wirklich dumm - falsche Berechtigungen chmod + x ~ / .profile und alles funktioniert gut. vor 13 Jahren 0
@xTrol: Das macht keinen Sinn, `~ / .profile` benötigt keine Ausführungsberechtigung. (Die Shell bezieht sie, führt sie jedoch nicht aus). Versuchen Sie `chmod -x ~ / .profile` und sehen Sie, ob es noch funktioniert. Keith Thompson vor 12 Jahren 5

5 Antworten auf die Frage

39
pidge

Ich hatte ein ähnliches Problem, .profileweil ich nicht ausgeführt wurde. Es stellt sich heraus (wie in dieser Apple StackExchange-Antwort beschrieben ), dass, wenn Sie .bash_profileoder .bash_loginDateien haben, Ihre .profilevon bash ignoriert werden.

Mein Problem war, dass ich Python installierte, wodurch automatisch eine .bash_profile-Datei erstellt wurde, die dazu führte, dass mein .profile nicht ausgeführt wurde. vor 12 Jahren 2
Diese Antwort hilft mir. `.bash_login` wurde hinzugefügt, nachdem ich` rvm` installiert habe. vor 11 Jahren 5
17
Yuji

Ich denke, diese Fragen und Antworten sollten an den Superuser gehen, aber trotzdem:

Gemäß dem Abschnitt INVOCATION der Manpage ,

  • /etc/profileund ~/.profilewird für eine interaktive Login-Shell gelesen und
  • ~/.bashrc wird für eine interaktive Shell ohne Login gelesen.

Wenn Ihr anderer UNIX-Rechner ~/.bashrcselbst für eine interaktive Login-Shell automatisch liest, liegt dies daran, dass das gesamte System /etc/ profileüber eine Zeile verfügt, die liest ~/.bashrc. OS X /etc/profilehat kein systemweites System .

Wenn Sie also ~/.bashrcauch für eine interaktive Login-Shell ausgeführt werden möchten, müssen Sie eine Zeile einfügen

. ~/.bashrc 

in deiner ~/.profile.

Und das fehlende Stück hier ausfüllen: Eine Terminal-Shell (um die sich die OP-Frage drehte) ist standardmäßig eine interaktive Login-Shell. LarsH vor 6 Jahren 0
3
Gordon Davisson

Try sourcing them "by hand":

source ~/.profile 

and see what happens. Note that, as others have pointed out, .profile is sourced by login shells, .bashrc by non-login shells; so try one or the other, not both.

2
Jonathan Leffler

Überprüfen Sie in den Terminaleinstellungen im Bereich "Start". Sie haben Optionen:

Muscheln öffnen mit:

  • Standard-Login-Shell (/ usr / bin / login)
  • Befehl (vollständiger Pfad)

Ich habe 'default' gewählt ... wenn Sie den benutzerdefinierten Befehl gewählt haben, kann dies ein Faktor sein.

Der nächste zu überprüfende Punkt ist, ob die Shell als Login-Shell gestartet wird. Wenn ich eine psAuflistung mache, sehe ich:

 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 

Der Schlüsselpunkt hier ist das ' -' vor dem Shell-Namen; Dadurch wird der Shell mitgeteilt, dass sie durch das Profil und die dazugehörigen Inhalte laufen soll. Wenn Sie dies nicht in Ihren aktuellen Fenstern sehen, müssen Sie die Einstellungen möglicherweise erst ändern, wenn Sie dies tun.

Der Einstellungsbereich in den Terminaleinstellungen enthält auch eine Shell-Option. Ich habe / bin / sh in meinem aufgelistet.


Sie sollten das nicht brauchen

Wenn das Schlimmste im schlimmsten Fall eintrifft, können Sie dies tun, wie ich es in früheren Zeiten auf anderen unkooperativen Systemen getan habe. Ich habe ein Programm "loginsh" erstellt, das ich unter Windows ausführen konnte. Anschließend würde es meine ausgewählte Shell mit dem ' -' ausführen. Präfix, damit es als Login-Shell fungiert.

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

(Die "stderr.h"Header- und ' err_*' - Routinen sind ein Fehlerberichtspaket, das ich überall benutze. Die jlss_basename()Funktion entspricht im Wesentlichen den vom System bereitgestellten Versionen, wie sie in POSIX zu finden sind <libgen.h>.)

2
tjim

Gute Informationen oben, aber ich dachte, ich würde einige Details zu meinem Problem und der gefundenen Lösung mitteilen.

Die Notwendigkeit: Fügen Sie PATH unter OSX 10.8 (ML) ein Verzeichnis hinzu.

Das Problem: Anleitung ist oft "das Profil in Ihrem Home-Verzeichnis modifizieren". Ein bisschen verwirrend, da diese Datei standardmäßig unter OSX nicht vorhanden ist. Doppelt verwirrend, denn sobald Sie eine Exportanweisung hinzugefügt haben, um das neue Verzeichnis an den vorhandenen PATH anzuhängen, funktioniert es nicht. Oben abgedeckt.

Die Lösung: Ich habe die Exportanweisung zu meinem .bash_profile (auch im Home-Verzeichnis) hinzugefügt.

Ich bin sicher, dass es viele Möglichkeiten gibt, diese Katze zu häuten. Dieser hat für mich gearbeitet. Etwas Zuversicht ermutigend: Das .bash_profile war bereits vorhanden und ich konnte sehen, dass andere installierte Software (z. B. Ruby) sie modifiziert hatte. Wenn es eine bessere Lösung gibt, würde ich mich freuen, davon zu erfahren!