.profile e .bashrc non funzionano sul mio Mac


29

Questo problema l'ho da molto tempo. Dopo aver eseguito il terminale .profile e il file .bashrc non funziona (non vengono eseguiti). Potresti indicare dove dovrei cercare una fonte di problemi?


controlla se questi file hanno i permessi adeguati

sì ... hai ragione il motivo è stato davvero stupido - permessi errati chmod + x ~ / .profile e tutto funziona bene.

5
@xTrol: non ha senso, ~/.profilenon richiede il permesso di esecuzione. (La shell lo genera, non lo esegue). Prova a chmod -x ~/.profilevedere se funziona ancora.
Keith Thompson,

Risposte:


40

Ho avuto un problema simile con il mio .profilenon essere eseguito. Si scopre (come spiegato in questa risposta di StackExchange di Apple ) che se hai .bash_profileo .bash_loginfile, il tuo .profileverrà ignorato da bash.


2
Il mio problema era che avevo installato Python che creava automaticamente un file .bash_profile che impediva l'esecuzione del mio .profile.

5
Questa risposta mi aiuta. .bash_loginè stato aggiunto dopo l'installazione rvm.

17

Immagino che queste domande e risposte debbano andare a Superuser, ma comunque:

Secondo la sezione INVOCAZIONE della pagina man ,

  • /etc/profilee ~/.profileviene letto per una shell di login interattiva e
  • ~/.bashrc viene letto per una shell interattiva non di accesso.

Se l'altra tua macchina UNIX legge automaticamente ~/.bashrcanche per una shell di login interattiva, ciò accade perché l'intero sistema /etc/ profileha una riga che legge ~/.bashrc. L'intero sistema di OS X /etc/profilenon ne ha uno.

Quindi, se si desidera eseguire ~/.bashrcanche per una shell di accesso interattiva, è necessario includere una linea

. ~/.bashrc

nel tuo ~/.profile.


E per compilare il pezzo mancante qui: una shell Terminale (di cui la domanda del PO riguardava) è di default una shell di login interattiva.
LarsH,

3

Prova a cercarli "a mano":

source ~/.profile

e vedi cosa succede. Si noti che, come altri hanno sottolineato, .profile proviene da shell di accesso, .bashrc da shell non di accesso; quindi prova l'uno o l'altro, non entrambi.


2

Nelle preferenze del tuo terminale, seleziona nel riquadro "Avvio". Hai opzioni:

Le conchiglie si aprono con:

  • Shell di accesso predefinita (/ usr / bin / login)
  • Comando (percorso completo)

Ho scelto 'default' ... se hai scelto il comando personalizzato, questo potrebbe essere un fattore.

Il prossimo punto da verificare è se la shell viene avviata come shell di login. Quando faccio un psannuncio, vedo:

  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

Il punto chiave qui è il ' -' davanti al nome della shell; che dice alla shell di scorrere il profilo e le cose correlate. Se non lo vedi nelle finestre correnti, potresti dover giocare con le impostazioni fino a quando non lo fai.

Il riquadro delle impostazioni nelle preferenze del terminale elenca anche un'opzione shell. Ho / bin / sh elencato nel mio.


Non dovresti averne bisogno

Se il peggio arriva al peggio, puoi fare come ho fatto su altri sistemi non collaborativi in ​​passato: ho creato un programma 'loginsh' che avrei potuto eseguire da Windows, e a sua volta avrebbe eseguito la shell prescelta con ' -' prefisso per dire che funziona come una shell di login.

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

(L' "stderr.h"intestazione e le err_*routine " " sono un pacchetto di segnalazione errori che uso ovunque. La jlss_basename()funzione è sostanzialmente la stessa delle versioni fornite dal sistema come quelle che si trovano in POSIX <libgen.h>.)


2

Buone informazioni sopra, ma ho pensato di condividere alcuni dettagli sul problema che avevo e sulla soluzione che ho trovato.

La necessità: aggiungere una directory a PATH su OSX 10.8 (ML).

Il problema: la guida è spesso "mod .profile nella directory home". Un po 'confuso poiché, per impostazione predefinita, questo file non esiste su OSX. Doppiamente confuso perché una volta aggiunta un'istruzione di esportazione per aggiungere la nuova directory al PERCORSO esistente ... non funziona. Coperto sopra.

La soluzione: ho aggiunto la dichiarazione di esportazione al mio .bash_profile (anche nella directory home).

Sono sicuro che ci sono molti modi per scuoiare questo gatto. Questo ha funzionato per me. Un po 'di fiducia che ispira: il .bash_profile esisteva già e potevo vedere che altri software installati (ad esempio Ruby) lo avevano modificato. Se c'è una soluzione migliore, sarò felice di conoscerla!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.