6 votes

.profile n'est pas chargé sur les connexions non identifiées /bin/sh

Le problème se trouve dans le titre, mais laissez-moi ajouter quelques détails ici.

Je suis sous OS X 10.10.5 (14F27). Utilisation de Terminal.app par défaut.


Contenu des fichiers de configuration

Contenu de /etc/profile

echo " # lecture de /etc/profile"
# Fichier .profile système pour sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

Contenu de /etc/bashrc

echo " # lecture de /etc/bashrc"
# Fichier .bashrc système pour shells bash(1) interactifs.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Faire en sorte que bash vérifie sa taille de fenêtre après l'exécution d'un processus
shopt -s checkwinsize
# Informer le terminal du dossier de travail à chaque invite.
if [ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]; then
    update_terminal_cwd() {
        # Identifier le répertoire en utilisant une URL de schéma "file:",
        # incluant le nom de l'hôte pour différencier les connexions locales vs.
        # distantes. Échapper les espaces en pourcentage.
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
    }
    PROMPT_COMMAND="update_terminal_cwd; $PROMPT_COMMAND"
fi

Contenu de ~/.profile

echo " # lecture de ~/.profile"
...

Contenu de ~/.bashrc

echo " # lecture de ~/.bashr"
...
source /etc/profile
...

Contenu de ~/.bash_profile

echo " # lecture de ~/.bash_profile"
source ~/.profile
source ~/.bashrc

Sortie de l'appel à sh et bash

Alors voici la sortie de l'invocation de sh.

$ sh
sh-3.2$ 

sh --login
 # lecture de /etc/profile
 # lecture de /etc/bashrc
 # lecture de ~/.profile
d12frosted:~ d12frosted$ 

$ bash
 # lecture de ~/.bashr
 # lecture de /etc/profile
 # lecture de /etc/bashrc
d12frosted:~ d12frosted$ 

$ bash --login 
 # lecture de /etc/profile
 # lecture de /etc/bashrc
 # lecture de ~/.bash_profile
 # lecture de ~/.profile
 # lecture de ~/.bashr
 # lecture de /etc/profile
 # lecture de /etc/bashrc
d12frosted:~ d12frosted$ 

Comme vous pouvez le voir, lors de l'appel de sh - il ne charge aucune configuration. Quelque chose est-il cassé dans mon environnement ou est-ce attendu?

8voto

yoliho Points 340

Cela est attendu que sh charge seulement ~/.profile lorsqu'il s'agit d'un shell de connexion.

Issu du manuel de référence de Bash

Si Bash est invoqué avec le nom sh, il tente de mimer le comportement de démarrage des versions historiques de sh le plus fidèlement possible, tout en se conformant à la norme POSIX également.

Lorsqu'il est invoqué en tant que shell de connexion interactif, ou en tant que shell non-interactif avec l'option --login, il tente d'abord de lire et exécuter des commandes depuis /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 interactif 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. Comme un shell invoqué comme sh ne tente pas de lire et exécuter des commandes depuis 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.

Si vous voulez que bash s'exécute en tant que sh utilise ~/.profile lorsque ce n'est pas un shell de connexion (par exemple, conserver l'environnement actuel), utilisez

env ENV=$HOME/.profile /bin/sh

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