Toute commande dans mon terminal qui se termine avec un code différent de zéro ferme la fenêtre de mon terminal


22

Au début, c'était un peu drôle, comme jouer à "Bash Roulette" ... mais maintenant ça devient vieux lol

Toute commande dans mon terminal qui se termine avec un code différent de zéro ferme la fenêtre de mon terminal

On m'a dit que j'avais peut-être set -emis dans un script bash quelque part que mes sources terminales.

J'ai vérifié .bash_profile/ .bashrc/ .profileet il ne semble pas set -ey être.

Y aurait-il d'autres coupables évidents?


7
Exécuter un set +e, cela résout-il le problème? Si oui, ce que je suppose, alors vous devez continuer à chercher cela set -e. Il pourrait être dans les versions globales de ces fichiers sous /etc, ou dans tout autre script provenant d'eux. Éloignez vos fichiers de configuration, si le problème est résolu, ajoutez les lignes en petits morceaux pour voir où il se casse.
egmont

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trappourrait être informatif.
muru

Vous pouvez consulter l'ensemble des drapeaux shell actuellement activées avec la variable spéciale -comme ceci: echo $-.
David Foerster

Réponses:


21

Très bien, donc en effet, c'était une capricieuse set -equi a causé mon problème.

La façon dont je trouve l' set -eutilisaitbash -lx

La meilleure chose à faire serait d'utiliser:

bash -lx > lx.log 2>&1

puis ouvrez ce fichier journal et effectuez une recherche pour set...

une fois que vous trouvez que capricieux, set -evous pouvez supprimer cette ligne et votre problème devrait avoir disparu! (Le redémarrage de la machine peut être une bonne idée).

Dans mon cas, le set -efichier se trouvait dans un fichier contenant les sources de .bash_profile, mais la ligne n'était pas dans le fichier .bash_profile lui-même.


3
Les choses qui sont sûres sourcedans votre shell sont un ensemble beaucoup plus petit que les "scripts shell aléatoires". -epeut être utile dans des scripts réels, pour une vérification d'erreur stupide. (Ou pour vous assurer que vous n'avez rien oublié de vérifier les erreurs.)
Peter Cordes

Apparemment, c'est le cas ... j'aurais aimé qu'il y ait quelque chose comme global set -eça qui set -en'affecte que le script contenant
Alexander Mills

@AlexanderMills, pour ce faire, vous pouvez vérifier $-pour vérifier l'indicateur dans le script interne et restaurer son état à la fin, ou simplement le réinitialiser dans le script principal si vous savez que vous avez trouvé des scripts qui le définiraient
ilkkachu

Donc, je suppose que local set -ene pourrait être utilisé que dans une fonction bash?
Alexander Mills

13

Si vous voulez simplement résoudre le problème, incluez-le set +edans votre .bashrc- à la fin.

Vous pouvez aller creuser - il y a beaucoup d'autres endroits où il set -epourrait y en avoir - mais cela s'occupera du lot.

Si, cependant, cela set -efait partie de votre, $PROMPT_COMMANDalors ce qui précède ne fonctionnera pas. Essayez de printf '%s\n' "$PROMPT_COMMAND"voir ce qu'il contient.


sur ma machine, lorsque j'ouvre un terminal, ne printf '%s\n' "$PROMPT_COMMAND"produit que des espaces, rien là
Alexander Mills

@AlexanderMills, alors ce n'est pas votre problème. Une utilisation courante pour $PROMPT_COMMANDest de mettre à jour le nom de l'onglet du terminal ou le nom de la fenêtre; MacOS X et Ubuntu le font tous les deux. Voir apple.stackexchange.com/q/220641/151730 pour les données à ce sujet pour Mac.
Wildcard

J'ai trouvé une réponse au problème et ajouté ma propre réponse, set +en'a pas fonctionné, peut-être parce que c'était avant l' set -eappel dans mes fichiers bash d'origine.
Alexander Mills

1
@AlexanderMills, oui, je pensais que c'était implicite. Je voulais ajouter set +e à la vôtre .bashrc, pas le mettre au début. Je l'ai expliqué dans ma réponse maintenant. Heureusement que vous avez trouvé la source!
Wildcard

Oui, set +ec'est juste un pansement, évidemment, mais vous avez dit que
Alexander Mills
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.