Cualquier comando en mi terminal que salga con un código distinto de cero cierra la ventana de mi terminal

22

Al principio esto fue un poco divertido, como jugar "Bash Roulette" ... pero ahora se está volviendo viejo jajaja

Cualquier comando en mi terminal que salga con un código distinto de cero cierra la ventana de mi terminal

Me dijeron que tal vez he set -econfigurado algún script bash en algún lugar que mi terminal obtenga.

He comprobado .bash_profile/ .bashrc/ .profiley no parece que set -eesté allí.

¿Habría algún otro culpable obvio?

Alexander Mills
fuente
77
Ejecute a set +e, ¿repara el problema? Si es así, lo que supongo, entonces debes seguir buscando eso set -e. Podría estar en las versiones globales de estos archivos en /etc, o en cualquier otra secuencia de comandos procedente de ellos. Mueva sus archivos de configuración, si el problema se soluciona, vuelva a agregar las líneas en fragmentos más pequeños para ver dónde se rompe.
egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapPodría ser informativo.
muru
Puede inspeccionar el conjunto de banderas de concha actualmente habilitados con la variable especial -, así: echo $-.
David Foerster

Respuestas:

21

Muy bien, de hecho, fue un desvío lo set -eque causó mi problema.

La forma en que encontré el set -eestaba usandobash -lx

Lo mejor sería usar:

bash -lx > lx.log 2>&1

luego abra ese archivo de registro y busque set...

Una vez que encuentre ese camino set -e, puede eliminar esa línea y su problema debería desaparecer. (El reinicio de la máquina puede ser una buena idea).

En mi caso, set -eestaba en un archivo que .bash_profile obtiene, pero la línea no estaba en .bash_profile.

Alexander Mills
fuente
3
Las cosas que son seguras sourceen su shell son un conjunto mucho más pequeño que solo "scripts de shell aleatorios". -epuede ser útil en scripts reales, para la comprobación de errores tontos. (O para asegurarse de que no se olvidó de verificar errores.)
Peter Cordes
Aparentemente ese es el caso ... desearía que hubiera algo así global set -epara que set -esolo afecte el guión que lo contiene
Alexander Mills el
@AlexanderMills, para hacer eso, puede verificar $-para verificar la bandera en la secuencia de comandos interna y restaurar su estado al final, o simplemente restablecerla en la secuencia de comandos principal si sabe que obtuvo secuencias de comandos que la establecerían
ilkkachu
Entonces, ¿supongo local set -eque solo podría usarse en una función bash?
Alexander Mills
13

Si solo quiere resolver el problema, inclúyalo set +een su .bashrc- al final.

Puedes ir a cavar, hay muchos otros lugares donde set -epodría estar, pero eso se encargará del lote.

Sin embargo, si set -ees parte de su, $PROMPT_COMMANDentonces lo anterior no funcionará. Intenta printf '%s\n' "$PROMPT_COMMAND"ver qué contiene.

Comodín
fuente
en mi máquina, cuando abro una terminal, printf '%s\n' "$PROMPT_COMMAND"solo produce espacios en blanco, nada allí
Alexander Mills
@AlexanderMills, entonces ese no es el problema. Un uso común para $PROMPT_COMMANDes actualizar el nombre de la pestaña del terminal o el nombre de la ventana; MacOS X y Ubuntu hacen esto. Consulte apple.stackexchange.com/q/220641/151730 para obtener información sobre esto para Mac.
Comodín el
Encontré una respuesta al problema y agregué mi propia respuesta, set +eno funcionó, tal vez porque fue antes de la set -ellamada en mis archivos bash de origen.
Alexander Mills
1
@AlexanderMills, sí, pensé que eso estaba implícito. Tenía la intención de adjuntarlo set +e a usted .bashrc, no ponerlo al principio. Lo he hecho explícito en mi respuesta ahora. ¡Qué bueno que hayas encontrado la fuente!
Comodín el
Sí, set +eobviamente es solo una tirita, pero tú dijiste eso
Alexander Mills el