.profile und .bashrc funktionieren auf meinem Mac nicht

29

Dieses Problem habe ich schon lange. Nach dem Ausführen von Terminal .profile und .bashrc Datei funktioniert nicht (werden nicht ausgeführt). Könnten Sie angeben, wo ich nach einer Problemquelle suchen soll?


quelle
Überprüfen Sie, ob diese Dateien die richtigen Berechtigungen haben
ja ... du hast recht der grund war echt doof - falsche berechtigungen chmod + x ~ / .profile und alles funktioniert gut.
5
@xTrol: Das macht keinen Sinn, ~/.profileerfordert keine Ausführungsberechtigung. (Die Shell gibt es aus, sie führt es nicht aus). Probieren chmod -x ~/.profileSie aus, ob es noch funktioniert.
Keith Thompson

Antworten:

40

Ich hatte ein ähnliches Problem damit, dass ich .profilenicht geführt wurde. Es stellt sich heraus (wie in erklärte diese Apple - Stack Antwort ) , dass , wenn Sie haben .bash_profileoder .bash_loginDateien, dann .profilewird von bash ignoriert.

Pidge
quelle
2
Mein Problem war, dass ich Python installiert habe, wodurch automatisch eine .bash_profile-Datei erstellt wurde, die dazu führte, dass mein .profile nicht ausgeführt wurde.
5
Diese Antwort hilft mir. .bash_loginwurde nach der Installation hinzugefügt rvm.
17

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 Anmeldeshell gelesen, und
  • ~/.bashrc wird für eine interaktive Shell ohne Anmeldung gelesen.

Wenn Ihr anderer UNIX-Computer ~/.bashrcauch für eine interaktive Anmeldeshell automatisch liest , liegt das daran, dass die systemweite /etc/ profileZeile liest ~/.bashrc. OS X hat systemweit /etc/profilekeine.

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

. ~/.bashrc

in deinem ~/.profile.

Yuji
quelle
Und um das fehlende Teil hier auszufüllen: Eine Terminal-Shell (worum es in der OP-Frage ging) ist standardmäßig eine interaktive Login-Shell.
LarsH
3

Versuchen Sie, sie "von Hand" zu beschaffen:

source ~/.profile

und sehen, was passiert. Beachten Sie, dass .profile, wie bereits erwähnt, von Anmelde-Shells bezogen wird, .bashrc von Shells, die keine Anmelde-Shells sind. Also versuchen Sie es mit dem einen oder anderen, nicht mit beiden.

Gordon Davisson
quelle
2

Überprüfen Sie in den Terminaleinstellungen im Bereich "Start". Sie haben folgende Möglichkeiten:

Muscheln öffnen mit:

  • Standardanmeldeshell (/ 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 Anmeldeshell 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 die Shell angewiesen, das Profil und verwandte Inhalte zu durchsuchen. Wenn Sie das in Ihren aktuellen Fenstern nicht sehen, müssen Sie möglicherweise die Einstellungen ändern, bis Sie dies tun.

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


Das solltest du nicht brauchen

Wenn das Schlimmste zum Schlimmsten wird, können Sie das tun, was ich in der Vergangenheit auf einigen anderen nicht kooperativen Systemen getan habe. Ich habe ein Programm "loginsh" erstellt, das ich unter Windows ausführen kann, und das wiederum meine ausgewählte Shell mit " -" ausführen würde. Präfix, damit es als Anmeldeshell 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 Fehlerberichterstattungspaket, das ich überall verwende. Die jlss_basename()Funktion ist im Grunde die gleiche wie die vom System bereitgestellten Versionen, wie sie in POSIX zu finden sind <libgen.h>.)

Jonathan Leffler
quelle
2

Gute Informationen oben, aber ich dachte, ich würde einige Einzelheiten über das Problem und die Lösung, die ich gefunden habe, mitteilen.

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

Das Problem: Die Anleitung lautet häufig "Ändern des .profile in Ihrem Home-Verzeichnis". Ein bisschen verwirrend, da diese Datei unter OSX standardmäßig nicht vorhanden ist. Das ist doppelt verwirrend, denn sobald Sie eine export-Anweisung hinzugefügt haben, um das neue Verzeichnis an den vorhandenen PATH anzuhängen, funktioniert es nicht. Oben abgedeckt.

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

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

tjim
quelle