A chaque fois que j'ouvre un terminal bash, le code d'erreur 1 est renvoyé:
Last login: Tue Jan 15 16:19:53 on ttys000
spam@moss:~ $ echo $?
1
J'ai trouvé cela est causé par la dernière ligne de code dans mon .bash_profile
:
test -f $HOME/.debug && export profile_bash_profile='.bash_profile' || return 0
Si je supprime cette ligne, le code d'erreur 0 est renvoyé. Je ne comprends pas comment cette ligne pourrait poser problème, car je peux me procurer .bash_profile
avec le code d'erreur 0:
spam@moss:~ $ source .bash_profile
spam@moss:~ $ echo $?
0
Mettre à jour:
Est-ce que quelqu'un sait comment Mac charge ~ / .bash_profile? Je doute que Mac l’utilise quand un shell de connexion est lancé. Il semble que le return
commande ne fonctionne pas comme prévu - quand je mets return 5
comme la dernière ligne de ~/.bash_profile
et lancez un shell de connexion, il ne renvoie pas le code d'erreur 5 (et je suis sûr ~/.bash_profile
est le dernier script chargé).
bash
charge ses fichiers de points de la même manière que sur d’autres plates-formes (en gardant à l’esprit le terminal OS X, le shell de connexion démarre toujours dans un nouvel onglet ou une nouvelle fenêtre). La seule explication qui me vienne à l’esprit est qu’il existe bien un autre fichier chargé après.bash__profile
, un dans lequel le exportéprofile_bash_profile
est utilisé et provoque une erreur (d'où le code de sortie 1 - peut-être parce que la variable var n'est pas définie sur chemin, mais uniquement sur un nom de fichier?)..bash_profile
pour tout ce qui source d'autres fichiers (comme, par exemple,.bashrc
), puis tout ce qui est inclus parhomebrew
si vous utilisez ça.Réponses:
Notez que ce qui se passe quand on utilise
return
en dehors d'une fonction sans avoirsource
d le script (par exemplereturn
provenant de.bash_profile
) est non documenté dansman bash
.La différence réside dans la façon dont le code de retour d’un script ou d’une fonction est enregistré en interne dans
bash
. Si vousreturn
une valeur, cette valeur se voit attribuer le code retour du appel code, par exemple la fonction à partir de laquelle vous revenez, ou lasource
commander. Comme il n’existe aucun appelant de ce type au retour de.bash_profile
lors de l'initialisation du shell, cette valeur est simplement ignorée. Qu'est-ce que vous accédez en tant que$?
est le code retour de l'instruction précédente .Utiliser Apple bash-86.1 comme référence:
Si vous
source
un script, son contenu est analysé et exécuté, jusqu'à ce qu'unreturn
déclaration est rencontrée. Sa valeur de retour est enregistrée séparément et c’est la responsabilité de l’appelant (execute_command_internal
dansbash-3.2/execute_cmd.c
) pour attribuer sa valeur à la variable contenant le dernier code de sortie:last_command_exit_value
.S'il est appelé en tant que script de démarrage, il est chargé via un appel à
maybe_execute_file
dans lerun_startup_files
fonctionner dansbash/shell.c
. L’exécution de la commande n’est pas régulière: le contenu du fichier est exécuté correctement, y compris le fichier final.return
, personne ne se soucie de la valeur réelle de votre retour. Il est simplement jeté.Alors, quel comportement voyez-vous ici ? Essentiellement les mêmes que si vous aviez appelé
return
sans argument: commereturn
renvoie simplement le code de retour de la commande qui la précède, qui dans votre cas est le test ayant échoué.Comment obtenir le comportement souhaité? Puisque vous ne pouvez pas
exit
de.bash_profile
sans quitter le shell, vous devez vous assurer que la commande qui le précède immédiatement produit le code de retour souhaité, dans ce cas:la source
test
commandes dans mon.bashrc
?return
usage.some_command \n true; return;
?J'ai compris ce qui suit par essais et erreurs. Peut-être qu'un guru BASH peut en expliquer davantage.
.bashrc
Contenu:Après avoir ouvert un nouveau terminal:
.bashrc
Contenu:Après avoir ouvert un nouveau terminal:
.bashrc
Contenu:Après avoir ouvert un nouveau terminal:
.bashrc
Contenu:Après avoir ouvert un nouveau terminal:
Avec le même
.bashrc
comme ci-dessus:Ces commandes s’exécutent directement à partir d’un terminal:
Alors,
return
fonctionne uniquement à partir de fonctions et de fichiers sources. Je ne sais pas Comment un utilisateur~/.bashrc
est lu mais apparemment ce n’est pas une source.la source