When you run any command in the OS X Terminal, you are running some program that has been coded and compiled to perform a specific function, be it something simple like “ls” to list directory contents, or something more interactive like “top” to display information on running processes. These commands are all programs on your Mac, just like applications such as Pages, Word, TextEdit, and Safari that have graphical interfaces and are the main productivity programs you use when running OS X.
Opening Applications using the Terminal
Most applications in OS X are opened by using a graphical approach like mouse click actions or services like Spotlight; however, you can also open applications using the OS X Terminal. This might seem unnecessary, but it can have its uses. For instance, I have a Mac Mini running the third-party media center software “XBMC” on it. This software sometimes crashes and needs to be relaunched, so while I can screen share to it or rummage for my wireless mouse and keyboard to access it, another approach if I am at my laptop is to simply log in with SSH and use one of several command options for opening the program.
1. Direct executable execution
Applications in OS X are packaged as bundles, which are folders including the executable along with any supporting resources (libraries, images, fonts, etc.) that the program needs to run. You can see these by right-clicking any application and choosing the option to “Show Package Contents.” In this bundle structure, the application executable is located in the /Contents/MacOS/ directory, and can be launched directly in the Terminal by specifying the full path to this executable. For example, you can open Safari by running the following command:
/Applications/Safari.app/Contents/MacOS/safari
2. The “open” command
My preferred method of opening an application from the Terminal is to use the “open” command with the the “-a” flag to specify the application by name. For example, the following command will open Safari:
open -a Safari
This approach mimics opening the program using the graphical interface, and can be useful if you are creating scripts where you would like to open a specific application. You can also use many of the “open” command’s options to do things like launch a new instance of a program (though this may conflict with OS X’s Resume service), or open a program in the background. In addition, since the “open” command launches applications indirectly, once run you can simply close the Terminal window and the application will remain open, as opposed to using direct executable execution.
The “open” command is also useful because you can cleanly launch applications for the current user account on a remote system. For instance, in looking at the XBMC setup on my Mac Mini, when XBMC crashes I can use “ssh” to remotely log in as the current username and then simply run “open -a XBMC” to quickly re-launch it.
3. Osascript approaches
The “osascript” command is OS X’s Terminal command for running “open scripting architecture” scripts like AppleScript. Since with AppleScript you can instruct the system to do things like launch applications, with a relatively basic scripting line like ‘open app “APPNAME”‘ coupled with the “osascript” command, you can create a quick one-line command to open any application on the system. For example, the following command will launch Safari similar to the “open” command above:
osascript -e 'open app "Safari"'
Keep in mind that as with the “open” command, this will also require you to be logged into the system as the currently active user. Otherwise you will get an error (-10810) at the Terminal and the specified application will not open.
Quitting Applications using the Terminal
While the “open” command is great for launching applications, this approach will only open them and does not provide a way to quit them. Therefore, the AppleScript approach with the “osascript” command may be the easiest way to cleanly quit a running application using the Terminal. For example, given the command above to open Safari, you can use the following one to easily quit it:
osascript -e 'quit app "Safari"'
Note that while this will attempt to quit programs, if you have unsaved changes in them and a Save dialogue box or other notice pops up that requires user input to proceed, then the program will not quit.
Force-quitting Applications using the Terminal
If you need to force-quit an application using the Terminal, then this can be done in two ways. The first is to simply use the “killall” command, which allows you to specify a program by name and then the system will internally identify it and close it down. The following command is a way to force-quit Safari (since we’ve been using this as an example so far):
killall Safari
In addition to this, for those who like to delve a little deeper into the Terminal, you can first find the process ID (PID) of the running application and then use the standard “kill” command to force-quit it. There are several ways to get the PID of a running application, but an easy one in the Terminal is to use the “pgrep” command and specify the program name. For example, to do so with Safari you would run the following command:
pgrep Safari
If Safari is running, then this command will output a single number that is the program’s PID. You can then use “kill PID” (replacing PID with the number) to quit Safari. This approach is a two-step process, but you can lump it all into one command by nesting them together using grave accent symbols to encase the “pgrep” command, such as the following:
kill `pgrep Safari`
What these accent symbols do is first execute the “pgrep Safari” command, and then use the result when running the “kill” command. Therefore, this essentially finds the PID for Safari, and then kills the specified PID.
pgrep -l Safari
to verify what will be killed, then
pkill Safari
or
pkill -l Safari
You can get around the issue with the application closing when the terminal closes by doing something like:
nohup open -a TextEdit > /dev/null &
The nohup allows the terminal window to be closed without closing TextEdit. The > sends any output that TextEdit may produce to the bit bucket. It doesn’t seem that the & is necessary, ordinarily it’s required to free up the terminal window.