.profile et .bashrc ne fonctionnent pas sur mon Mac

29

Ce problème que j'ai depuis longtemps. Après avoir exécuté le terminal .profile et le fichier .bashrc ne fonctionnent pas (ne sont pas exécutés). Pourriez-vous indiquer où devrais-je rechercher une source de problème?


la source
vérifier si ces fichiers ont les autorisations appropriées
oui ... vous avez raison, la raison était vraiment stupide - autorisations incorrectes chmod + x ~ / .profile et tout fonctionne bien.
5
@xTrol: Cela n'a pas de sens, ~/.profilene nécessite pas de permission d'exécution. (Le shell le source, il ne l'exécute pas). Essayez de chmod -x ~/.profilevoir si cela fonctionne toujours.
Keith Thompson

Réponses:

40

J'ai eu un problème similaire avec mon .profilenon-exécution. Il se trouve (comme expliqué dans cette réponse d' Apple StackExchange ) que si vous avez .bash_profileou .bash_loginfichiers, votre .profileseront ignorées par bash.

pidge
la source
2
Mon problème était que j'avais installé Python qui créait automatiquement un fichier .bash_profile qui empêchait mon .profile de s'exécuter.
5
Cette réponse m'aide. .bash_logina été ajouté après l'installation rvm.
17

Je suppose que ce Q&R devrait aller au superutilisateur, mais de toute façon:

Selon la section INVOCATION de la page de manuel ,

  • /etc/profileet ~/.profileest lu pour un shell de connexion interactif, et
  • ~/.bashrc est lu pour un shell interactif sans connexion.

Si votre autre machine UNIX lire automatiquement ~/.bashrcmême pour un shell interactif de connexion, c'est parce que le système à l' échelle /etc/ profilea une ligne qui se lit ~/.bashrc. OS X à l'échelle du système /etc/profilen'en a pas.

Donc, si vous souhaitez exécuter ~/.bashrcmême pour un shell de connexion interactif, vous devez inclure une ligne

. ~/.bashrc

dans votre ~/.profile.

Yuji
la source
Et pour compléter la pièce manquante ici: Un shell de terminal (sur lequel portait la question de l'OP) est par défaut un shell de connexion interactif.
LarsH
3

Essayez de les acheter "à la main":

source ~/.profile

et voyez ce qui se passe. Notez que, comme d'autres l'ont souligné, .profile provient de shells de connexion, .bashrc de shells sans connexion; essayez donc l'un ou l'autre, pas les deux.

Gordon Davisson
la source
2

Dans vos préférences de terminal, vérifiez dans le volet «Démarrage». Vous avez des options:

Les coquilles s'ouvrent avec:

  • Shell de connexion par défaut (/ usr / bin / login)
  • Commande (chemin complet)

J'ai choisi «par défaut» ... si vous avez choisi la commande personnalisée, cela peut être un facteur.

Le prochain point à vérifier est de savoir si le shell est démarré en tant que shell de connexion. Lorsque je fais une psannonce, je vois:

  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

Le point clé ici est le « -» devant le nom du shell; qui indique au shell de parcourir le profil et les éléments associés. Si vous ne voyez pas cela dans vos fenêtres actuelles, vous devrez peut-être régler les paramètres jusqu'à ce que vous le fassiez.

Le volet des paramètres dans les préférences du terminal répertorie également une option shell. J'ai / bin / sh répertorié dans le mien.


Vous ne devriez pas en avoir besoin

Si le pire arrive au pire, vous pouvez faire comme je l'ai fait sur d'autres systèmes non coopératifs dans le passé - j'ai créé un programme `` loginsh '' que je pouvais exécuter à partir de Windows, et à son tour, il exécuterait mon shell choisi avec le ' -' préfixe pour lui dire de fonctionner comme un shell de connexion.

#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'en- "stderr.h"tête et les err_*routines ' ' sont un package de rapport d'erreurs que j'utilise partout. La jlss_basename()fonction est fondamentalement la même que les versions fournies par le système telles que celles trouvées dans POSIX <libgen.h>.)

Jonathan Leffler
la source
2

Bonnes informations ci-dessus, mais j'ai pensé partager quelques détails sur le problème que j'ai rencontré et la solution que j'ai trouvée.

Le besoin: Ajoutez un répertoire à PATH sur OSX 10.8 (ML).

Le problème: le guidage est souvent "modifiez le .profile dans votre répertoire personnel". Un peu déroutant car, par défaut, ce fichier n'existe pas sur OSX. Doublement déroutant car une fois que vous ajoutez une instruction d'exportation pour ajouter le nouveau répertoire au CHEMIN existant ... cela ne fonctionne pas. Couvert ci-dessus.

La solution: j'ai ajouté l'instruction d'exportation à mon .bash_profile (également dans le répertoire personnel).

Je suis sûr qu'il existe de nombreuses façons d'écorcher ce chat. Celui-ci a fonctionné pour moi. Un peu inspirant confiance: le .bash_profile existait déjà et je pouvais voir que d'autres logiciels installés (par exemple Ruby) l'avaient modifié. S'il y a une meilleure solution, je serai heureux d'en entendre parler!

tjim
la source