107

Why doesn't "exit" close a Terminal.app window on Mac OS X?

$ exit
logout

[Process completed]

Is there a way to close the window without using the mouse?

Florenz Kley
  • 1,531
  • 7
  • 18

7 Answers7

121

A window displayed by Terminal.app is just the frontend for the process you choose to run inside of it - in your case, a Unix shell. When you exit the shell, the Terminal.app does not close the window by default, so you have the possibility to inspect the output from whatever command you ran, after it finishes.

You can change your preferences here

Terminal Preferences -> Settings -> Shell:

to either

  1. always close the window, whatever the exit status of the shell was
  2. close the window if the shell exited cleanly
  3. keep the window open (the default)

Besides that, you can (almost) always close windows in OSX with Cmd-W, so you don't need mouse even if it doesn't close automatically.

One more hint: I like hitting Ctrl-D instead of typing exit. Two keys vs. five.

Florenz Kley
  • 1,531
  • 7
  • 18
Amadan
  • 1,837
  • 1
  • 12
  • 12
  • 19
    In Yosemite it's: preferences -> profiles -> shell -> "when the shell exits"... Shell is whichever shell you have selected in General-> On startup open... – cloudsurfin Sep 22 '15 at 17:21
  • Once the shell is exited, is it possible to start a new shell in the same window? If so, how? – Sodved Jul 09 '16 at 02:14
  • @Sodved: I don't think it is, but could be wrong. – Amadan Jul 11 '16 at 05:34
  • This does not answer the question that was asked, as it does not propose a **command line** operation. – Chris Stratton Jan 04 '17 at 17:59
  • @ChrisStratton You're correct that it does not directly answer the question asked, but it **does** facilitate the use of the `exit` command which the OP was using originally. – simpleauthority Dec 22 '18 at 03:57
  • `Ctrl-D` in not working for me. – roottraveller Jul 03 '19 at 04:52
  • @roottraveller: Reading "is not working for me" is not working for me. You need to explain what happens instead, for there to be any chance that I'd recognise what the issue is. – Amadan Jul 03 '19 at 04:55
  • @Amadan yes `Ctrl-D` is just making a split horizontally in the terminal. however, I am able to close using `Command + W` as mentioned in another answer below. – roottraveller Jul 03 '19 at 05:44
  • @roottraveller: _Command_-D is "split horisontally". _Ctrl_-D is EOT (End of Transmission) control character, which `bash` understands as "I've had enough". – Amadan Jul 03 '19 at 05:54
  • @Amadan ohh my bad. it's working. I'm not even high. idk what I was thinking. – roottraveller Jul 03 '19 at 06:24
31

Command + Q -> closes the application/process.

Command + W -> closes window/instance

Nisse Engström
  • 230
  • 1
  • 4
  • 8
19

Actually, for this requirement, you should set some config to your Terminal. follow below instructions and you will close your Terminal just with an exit command.

When the Terminal is up, press +, to open the prefrences window. then you will see below screen:

enter image description here

Then press shell tab and you will see below screen:

enter image description here

Now select Close if the shell exited cleanly for When the shell exits.

Your Terminal is ready for the exit just with an exit command.

AmerllicA
  • 345
  • 2
  • 7
14

Yes there is. For example you can use AppleScript to achieve it:

osascript -e 'tell application "Terminal" to close first window'

The first window is always the currently active window. That's the one you want to close.

Before closing the window, the Terminal may ask you, if you really want to close the window. This depends on your settings. You may have chosen to 'close the window only if the shell exited cleanly or no other processes are running apart from …'. (This may be the default setting.) In that case adding & exit to the command closes the window immediately and without asking.

osascript -e 'tell application "Terminal" to close first window' & exit
Nisse Engström
  • 230
  • 1
  • 4
  • 8
Thomas.S
  • 141
  • 1
  • 2
1

I needed a variant of this solution for an application that required the user to enter their password in terminal for a sudo script. Catalina's security makes sending keystrokes a real pain, so hopefully this solution helps someone else in the future:

tell application "Terminal"
    activate
    do script "sudo say --rate=140 Intergalactic && kill -9 $$"
    delay 5
    repeat
        try
            do shell script "ps a | grep -v grep | grep 'sudo say --rate=140 Intergalactic'"
            delay 0.5
        on error
            exit repeat
        end try
    end repeat
    close front window
end tell

Here is an explanation for some of the weird looking stuff:

  • kill -9 $$: This is basically exit that works; for some reason exit wasn't working for me for my application. You want to kill the shell process so that the user doesn't get prompted to terminal a running terminal... This will allow it to silently close.
  • try...do shell script: This checks to see if the command is still running, and if so, the loop keeps going so that window doesn't get killed. If grep finds a match, it returns an error code 0 (AppleScript is happy); if grep doesn't find a match, it returns an error code 1 and then your script stops running when the party is just about the begin.
  • close front window: Yes, I realize #closefrontwindowisconsideredharmful. There is a 500ms gap where either another terminal window could come into focus, or the user could Command+Tab to another Terminal window or something... I figure if you are interacting with the window, it's probably an edge case. Feel free to come up with a better way and let us know!

I'll probably be occasionally maintaining this thing here: https://gist.github.com/andrewodri/e0440c52f7c0a7333c35ab6443581efe

Andrew Odri
  • 131
  • 4
1

If you want to terminate the application itself from the commandline:

killall Terminal
Just Jake
  • 738
  • 5
  • 17
  • 7
    that is considered harmful. Apart from the fact tha killall does different things on different Unix versions, it's not nice to kill an application instead of asking it to just quit. – Florenz Kley Nov 15 '12 at 13:55
  • very good solution. We just need to exit terminal so there is no asking!! best answer. – Sabrina Sep 19 '19 at 19:33
1

I also suggest against the killall suggestion. As suggested modify the settings in your preferences to close window if shell exit was successful. If you're REALLY LAZY (like me), open up your bash profile and add an alias. I have mine set so all I have to do is type 'q'.

bran.io
  • 71
  • 1
  • 1
  • 6