Salga automáticamente de la Terminal al escribir exit

Guión

Utilizo mucho la terminal para SSH, sin embargo, me gustaría que la aplicación Terminal se cerrara cuando la última pestaña se cierra usando exit. Ya tengo la ventana de la terminal configurada para cerrarse al salir con éxito, sin embargo, la Terminal sigue ejecutándose. Seguí el tutorial de Ricky Campbell aquí, que usa un AppleScript para salir de la terminal. El AppleScript funciona perfectamente cuando se ejecuta fuera de la Terminal, sin embargo, de alguna manera no puedo hacer que funcione el comando trap que debe colocarse en la terminal.

Como referencia, publicaré el texto relevante aquí:

Ahora necesitamos una forma de iniciar el guión. Esto se puede hacer con el comando bash "trampa", haciendo que escuche la señal de SALIDA. Como quiero que esto suceda cada vez que mi usuario abre un shell, lo agrego a mi archivo .profile. Hago esto con nano:

$ nano ~/.perfil

En este archivo, agregue lo siguiente en alguna parte. Es posible que deba editar la ruta al archivo AppleScript que creó anteriormente:

trap '/usr/bin/osascript $HOME/Scripts/QuitTerminal.scpt' SALIR

Todo lo que hace es escuchar la señal EXIT dentro de bash y cuando la recibe, ejecuta el script que creamos anteriormente.

Pregunta

¿Cómo hago para solucionar este problema? Por alguna razón, la trampa no se dispara o no funciona como debería, incluso después de numerosos reinicios. ¿Hay alguna forma alternativa de cerrar la aplicación Terminal cuando sale la última pestaña?

Solución

Los enlaces proporcionados por Dori llevaron a la solución. El artículo sugiere que el comando trap debe estar en .profile, cuando en realidad debe colocarse en .bashrc. Moverlo al script correcto solucionó el problema.

¿Ha agregado el comando trap a su /Users/YourUsername/.profile?
@Martin Sí, lo tengo. He confirmado un par de veces ahora.

Respuestas (4)

El enfoque dado aquí parece un poco más simple, ¿tal vez funcione para usted?

Si no quiere acordarse de escribir "quit" en lugar de "exit", y está usando bash, simplemente agregue lo siguiente a su .bashrcu otro script de inicio de shell:

trap '/usr/bin/osascript -e "tell application \"terminal\" to quit"' 0

¿Qué hace? Cuando el shell recibe la señal 0 (cero), es decir, se le dice que salga, ejecutará este comando como lo último que hace. Esto permite que su shell, etc., salga con gracia, y pedirle a Terminal.app que salga a través de applescript se asegura de que haga lo mismo. En otras palabras, escriba 'salir', y su shell sale, luego la Terminal se cierra, todo limpiamente y de la forma en que la naturaleza pretendía.

El hilo completo se puede encontrar aquí .

Gracias. La solución estaba ahí. Tenía el comando trap en .profile y no en .bashrc. Moverlo solucionó el problema por completo y ahora funciona como se esperaba.
También hay una pestaña en las Preferencias llamada Shell. Si cambia 'Cuando el shell sale:' a 'cerrar si el shell salió limpiamente', lo hará sin ninguna secuencia de comandos.
@atroon Creo que la preferencia se aplica al cierre de una ventana de Terminal, no a toda la aplicación de Terminal.

También puede usar este comando enrevesado, que no activa una advertencia sobre la terminación de su propio proceso:

osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

O bien, podría definir un alias (como quito exit) en su perfil:

alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

No necesita trapninguna señal.

Simplemente, coloque el comando osascript en su ~/.bash_logoutarchivo (créelo, si no existe)

osascript -e "tell application \"Terminal\" to quit"

bash lo .bash_logoutejecuta después de cerrar la sesión. Puede ingresar cualquier comando de shell en este archivo, cada uno se ejecutará cuando cierre la sesión.

Por ejemplo, puede abrir una ventana del Finder en la carpeta donde estuvo por última vez, antes de salir, con open .o como...

open .
say "Good bye, my master - leaving terminal now, continue with Finder"
osascript -e "tell application \"Terminal\" to quit"

etcétera...

Encuentro esta URL para el caso de Terminal con varias pestañas. http://cyberdork33.wordpress.com/2010/05/25/make-osx-terminal-quit-when-last-window-closed/
recién probado en os x 10.8.2
TL.DR:
para la parte de la pestaña (salir para cerrar la pestaña actual)
Terminal > Preferencias > Configuraciones > Shell
Cuando el shell sale: Cierra si el shell salió limpiamente (o Cierra la ventana)
Indicar antes de cerrar: Nunca (o Solo si hay procesos que no sean el shell de inicio de sesión e: Inserta " osascript")

para la parte de la última pestaña (salir para cerrar esta última pestaña y todas las ventanas de terminal y salir de Terminal.app):
1) agregar a ~/.bash_profile:

trap '/usr/bin/osascript $HOME/Scripts/QuitTerminal.scpt' EXIT

2) crear secuencias de comandos/QuitTerminal.scpt

tell application "Terminal"
    # If there is only one tab remaining, and it contains the word "logout"
    # then this is the final window
    if (count of (tabs of (every window whose visible is true))) = 1 then
        try
            set theContents to words of ((contents of tab 1 of window 1) as Unicode text)
            set exitLastTab to (theContents contains "logout")
        on error
            set exitLastTab to false
        end try

        if exitLastTab is true then
            quit
        end if

    else if (count of (tabs of (every window whose visible is true))) < 1 then
        # If no window remains open, then obviously we can quit the app.
        # This would occur when the final window is closed without 'exit'
        quit
    end if
end tell

Espero eso ayude.

Si bien su respuesta teóricamente puede responder a la pregunta, sería preferible incluir las partes esenciales del artículo en una respuesta a continuación y proporcionar el enlace como referencia.