Qualquer comando no meu terminal que saia com código diferente de zero fecha minha janela do terminal

22

No começo isso foi um pouco engraçado, como jogar "Bash Roulette" ... mas agora está ficando velho lol

Qualquer comando no meu terminal que saia com código diferente de zero fecha minha janela do terminal

Foi-me dito que talvez eu tenha set -edefinido algum script bash em algum lugar que minhas fontes terminais.

Eu verifiquei .bash_profile/ .bashrc/ .profilee não parece set -eestar lá.

Haveria outros culpados óbvios?

Alexander Mills
fonte
7
Execute a set +e, ele corrige o problema? Se sim, o que suponho, então você precisa continuar procurando por isso set -e. Pode estar nas versões globais desses arquivos em /etcou em qualquer outro script originado a partir deles. Afaste os arquivos de configuração, se o problema for resolvido, adicione novamente as linhas em pedaços menores para ver onde eles quebram.
Egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trappode ser informativo.
Muru
Você pode inspecionar o conjunto de bandeiras do escudo atualmente habilitados com a variável especial -assim: echo $-.
David Foerster

Respostas:

21

Tudo bem, de fato, foi um rebelde set -eque causou o meu problema.

O jeito que eu encontrei set -eestava usandobash -lx

A melhor coisa a fazer seria usar:

bash -lx > lx.log 2>&1

abra esse arquivo de log e faça uma pesquisa por set...

Uma vez que você achar que é rebelde, set -evocê pode remover essa linha e seu problema deve desaparecer! (A reinicialização da máquina pode ser uma boa ideia).

No meu caso, o set -earquivo estava em um arquivo com fontes .bash_profile, mas a linha não estava no próprio .bash_profile.

Alexander Mills
fonte
3
O que é seguro sourceno seu shell é um conjunto muito menor do que apenas "scripts aleatórios do shell". -epode ser útil em scripts reais, para verificação de erro estúpido. (Ou para se certificar de que você não esquecer de erro de verificação de qualquer coisa.)
Peter Cordes
Aparentemente desse caso ... Eu gostaria que houvesse algo como global set -ede modo que set -esó afeta o script que contém
Alexander Mills
@AlexanderMills, para fazer isso, você pode verificar $-o sinalizador no script interno e restaurar seu estado no final, ou apenas redefini-lo no script principal se souber que possui scripts de origem que o
definiriam
Então eu acho local set -eque só poderia ser usado em uma função bash?
Alexander Mills
13

Se você quiser apenas resolver o problema, inclua set +eno seu .bashrc- no final.

Você pode cavar - há muitos outros lugares onde set -epode estar - mas isso vai cuidar disso.

Se, no entanto, o fizer set -eparte do seu $PROMPT_COMMAND, o procedimento acima não funcionará. Experimente printf '%s\n' "$PROMPT_COMMAND"e veja o que há nele.

Curinga
fonte
na minha máquina, quando abro um terminal, printf '%s\n' "$PROMPT_COMMAND"gera apenas espaço em branco, nada lá #
Alexander Mills
@AlexanderMills, não é esse o seu problema. Um uso comum $PROMPT_COMMANDé atualizar o nome da guia do terminal ou o nome da janela; O MacOS X e o Ubuntu fazem isso. Consulte apple.stackexchange.com/q/220641/151730 para obter dados sobre isso no Mac.
Wildcard
Encontrei uma resposta para o problema e adicionei minha própria resposta, set +enão funcionou, talvez porque foi antes da set -echamada nos meus arquivos bash de origem.
Alexander Mills
1
@AlexanderMills, sim, eu pensei que estava implícito. Eu pretendia acrescentar set +e ao seu .bashrc, não colocá-lo no início. Eu fiz isso explícito na minha resposta agora. Que bom que você encontrou a fonte!
Curinga
Sim, set +eobviamente , é apenas um curativo, mas você afirmou que
Alexander Mills