¿Reiniciar bash desde la terminal sin reiniciar la aplicación de terminal (mac)?

46

Miré a mi alrededor y busqué una respuesta a esta pregunta, pero parece que no la encuentro (lo cual es extraño).

Mi pregunta es, ¿hay alguna manera simple de reiniciar la sesión bash desde el terminal en mac? Solo quiero el mismo comportamiento que si cerrara la aplicación de terminal y la volviera a iniciar (restablecimiento de todas las variables, fuente de .bash_profile, etc.).

Sé cómo obtener .bash_profile, pero eso no es lo que quiero. Una de las razones por las que quiero hacer esto es porque un complemento para mi solicitud de bash tiene un código que evita que los colores se carguen varias veces. Por lo tanto, el abastecimiento de .bash_profile no vuelve a cargar las variables de color y tengo que reiniciar la aplicación del terminal para que los cambios surtan efecto.

Mattias
fuente

Respuestas:

65

exec bash debería reemplazar el proceso actual del shell con (una nueva instancia de) bash.

Muzer
fuente
2
¿Bash en la aplicación de terminal es un shell interactivo y exec bashsolo reinicia ese shell interactivo? Además, ¿puede explicar exactamente qué hace el comando exec y sus opciones? ¡Gracias!
Mattias
exec reemplaza el proceso actual por uno nuevo. Bash tiene una página de manual muy bien escrita pero desafortunadamente difícil de buscar; escriba man bash, encuentre la última instancia de la cadena SHELL BUILTIN COMMANDS y luego desplácese hacia abajo hasta exec. En resumen, pasar el -cindicador lo ejecutará sin ninguna variable de entorno (lo que podría ser necesario para sus propósitos, no lo sé), y los otros argumentos -l y -a probablemente no sean las cosas que desea (parecen ser históricas). / características oscuras y específicas). También puede usar exec para abrir nuevos descriptores de archivo en el shell actual, si deja de lado el comando.
Muzer
¿Puedes mostrar un ejemplo de cómo usar exec para abrir nuevos descriptores de archivos en el shell actual? ¿Y qué hay de mi pregunta sobre el shell interactivo / inicio de sesión? ¿Es el shell ejecutado en el terminal un shell interactivo, y es que todo el comando exec toca. Por último, la respuesta aprobada de esta pregunta recomienda el comando exec con el indicador -l, pero no entiendo lo que hace. Perdón por preguntar tanto, solo quiero entender los comandos que uso.
Mattias
1
Lo siento, sí. No estoy seguro acerca de las Mac, pero en el mundo de Linux, al menos los shells ejecutados desde un terminal gráfico no son (usualmente) shells de inicio de sesión, y solo está reiniciando el shell interactivo y no el terminal en sí o su shell de inicio de sesión. -lAquí hay un argumento para bash y solo hace que se comporte como un shell de inicio de sesión. Abrir los descriptores de archivos en el shell actual no tiene nada que ver con su pregunta, pero puede usar, exec 4<>test.txtpor ejemplo, para hacer que el descriptor de archivos apunte a test.txt. Luego, en el resto de su shell, puede hacer la echo test>&4salida a test.txt.
Muzer
1
@Muzer por razones con las que no puedo decir que estoy totalmente de acuerdo, OSX ha decidido que los emuladores de terminal GUI ejecutarán shells de inicio de sesión .
terdon
1

La respuesta aceptada es excelente para un shell que usa bash, que también es lo que solicitó el OP, sin embargo, estoy usando Terminal en macOS con un shell no predeterminado (zsh) y ejecutar el comando exec bashobviamente no tiene el efecto deseado : lanza bash en lugar de mi shell predeterminado.

Por lo tanto, el comando environment-agnostic sería el exec $SHELLque utiliza la variable de entorno $SHELLque almacena el shell predeterminado para el usuario.

Además, tenga en cuenta que Apple reemplazará bash con zsh en macOS Catalina para tener el efecto que el OP busca ejecutar exec zsho exec $SHELLserá el camino a seguir después de actualizar a macOS 10.15.

phip
fuente