0 votes

Bash n'exécute que ~/.profile mais ni ~/.bash_profile ni ~/.bashrc

J'ai un problème étrange avec bash:

Je change mon shell par défaut en /bin/sh depuis zsh et il n'exécute pas ~/.bash_profile ou ~/.bashrc lorsque j'ouvre un nouveau terminal, il n'exécute que ~/.profile.

Quel pourrait être le problème?

Je pourrais probablement sourcer ~/.bashrc depuis ~/.profile mais cela ne semble pas être une bonne idée, par exemple cela pourrait casser si je change à nouveau de shell.

2voto

Michael Zhou Points 167

Je vous suggère de lire le manuel bash sous la rubrique INVOCATION qui indique :

   Si bash est invoqué avec le nom sh, il tente de reproduire le comportement de démarrage des versions historiques de sh aussi fidèlement
   que possible, tout en se conformant également à la norme POSIX. Lorsqu'il est invoqué en tant que shell de connexion interactif, ou un shell non-
   interactif avec l'option --login, il tente d'abord de lire et d'exécuter des commandes à partir de /etc/profile et
   ~/.profile, dans cet ordre. L'option --noprofile peut être utilisée pour inhiber ce comportement. Lorsqu'il est invoqué en tant que shell inter-
   actif avec le nom sh, bash recherche la variable ENV, étend sa valeur si elle est définie, et utilise la
   valeur étendue comme nom d'un fichier à lire et à exécuter. Étant donné qu'un shell invoqué en tant que sh ne tente pas de lire et
   exécuter des commandes à partir d'autres fichiers de démarrage, l'option --rcfile n'a aucun effet. Un shell non-interactif invoqué
   avec le nom sh ne tente pas de lire d'autres fichiers de démarrage. Lorsqu'il est invoqué en tant que sh, bash entre en mode posix après
   que les fichiers de démarrage ont été lus.

Une nouvelle session de terminal dans OS X/macOS démarre toujours en tant que shell de connexion.

0voto

David Anderson Points 30783

Pour obtenir que /bin/sh exécute ~/.bashrc de la même manière que /bin/bash le fait, vous devrez faire ce qui suit.

  1. Ajoutez les lignes suivantes à ~/.profile.

    LOGINSHELL=YES
    export ENV=~/.shrc
  2. Créez le fichier ~/.shrc contenant la ligne suivante.

    if [ "$LOGINSHELL" != "YES" ]; then  source ~/.bashrc; fi

Pour faciliter le débogage, j'ajoute généralement la ligne suivante au début du fichier ~/.profile.

export DEBUGSHELL=YES

Cette ligne peut être commentée une fois le débogage terminé, comme indiqué ci-dessous.

#export DEBUGSHELL=YES

Ensuite, ajoutez des déclarations conditionnelles echo au début et à la fin des fichiers tels que ~/.profile, ~/.bashrc, ~/.shrc et autres. Par exemple, ~/.shrc contiendrait ce qui suit.

if [ "$DEBUGSHELL" = "YES" ]; then echo entered .shrc; fi
if [ "$LOGINSHELL" != "YES" ]; then  source ~/.bashrc; fi
if [ "$DEBUGSHELL" = "YES" ]; then echo exited .shrc; fi

Une autre idée, qui peut être utile, est de créer un fichier ~/.bashcm pour contenir les commandes qui doivent être exécutées pour les shells de connexion et interactifs. Par exemple, c'est généralement ici que je place mes commandes alias. Vous devrez également inclure la ligne suivante dans vos fichiers ~/.profile et ~/.bashrc.

source ~/.bashcm

-1voto

Hamid Rouhani Points 1421

/bin/sh n'est pas bash. C'est Bourne Shell. L'emplacement de Bash (Bourne Again Shell) est /bin/bash. Changez votre shell par défaut en bash pour utiliser ~/.bash_profile au lieu de ~/.profile

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X