If you’re a fan of shell scripts in macOS, you’ve probably noticed how running one will leave you with a useless Terminal window after it’s completed. You can fix this from the Terminal settings.
This method only works if you’re launching a shell script outside of bash, such as by clicking on it in Finder or by setting a custom hotkey to open the program. Otherwise, you’ll just be taken back to the command prompt. You can always use
killall Terminal to make the Terminal app close itself from within a script, but that will close every open Terminal window, so it’s not ideal.
Change This Behaviour in the Profile Settings
Open up the Terminal app from the Dock or your Applications folder, then open the settings by pressing Command+Comma.
In the Settings window, switch to the Profiles tab. The default profile (the one at the top) should be selected by default. In the settings on the right, click the “Shell” tab and then click the “When the shell exits” drop-down menu.
The drop-down menu defaults to “Don’t close the window,” but you’ll want to change this to “Close if the shell exited cleanly.”
You can also make it close every time, but this way you’ll still get an error message if a process exits with a nonzero exit status. Keep in mind that you may need to exit the script explicitly with the
exit command to get this behavior in all cases.
Though if you’re launching from Finder, the exit command is automatically appended to the script.
Alternatively, Use iTerm
iTerm2, a popular Terminal replacement for macOS, will automatically close the window when a shell script exits. If you already use iTerm as your default terminal, you may have noticed that shell scripts launched from Finder still open with the stock Terminal app. This means you’ll still have the same issue unless you set scripts to open with iTerm.
You can change which applications scripts open in by right clicking on the script in Finder and then selecting “Get Info.”
There will be a dropdown to change what this script opens with. Set it to iTerm and press “Change All” to apply this change to every script.
By default, if you already have an iTerm window open, it will launch in a separate tab rather than a separate window, and the tab will close automatically when it’s done.