You can learn more about using Terminal and the shell on macOS in my my book: “macOS Terminal and Shell” — Thank you!
Most Terminal users will know that
$ open .
will open the current working directory in a Finder window. (You, dear wonderful reader, know this because you read my previous post on Terminal-Finder Interaction.)
However, the open
command can do so much more.
Folders
Trivially, it cannot merely open the current working directory, but any path:
$ open ~/Library/Preferences
$ open /etc
$ open ../..
This can be used as a quick way to navigate to hidden directories.
You can also open multiple folders at once:
$ open ~/Documents ~/Desktop ~/Downloads
$ open ~/D*
To clean up, you can option-click any close button in a Finder window to close all Finder windows. Or you can use the keyboard short cut ⌘⌥W.
Files
open
can also open files. In general you can think of open
as the command line equivalent of double-clicking a file or folder in Finder.
$ open document.pdf
will open document.pdf
in the current working directory with the default application for PDF files (usually Preview). You can use this against multiple files as well:
$ open ~/Desktop/Screen\ Shot\ *.png
will open all screenshot files (if any) in a viewer in the default application (Preview).
Applications
If you have changed the default application that handles a file type or want to override the default application, you can use the -a
option:
$ open -a Preview ~/Desktop/Screen\ Shot\ *.png
$ open -a TextEdit web.html
You can specify just the name of an application or the full path, i.e. /Applications/Preview.app
. If you need to be specific, you can also specify an application’s bundle identifier with -b com.apple.Preview
.
If you want to open a document but keep the application and the new document window in the background, use the -g
option.
$ open -g ~/Desktop/Screen\ Shot\ *.png
Text Editors
There are two interesting special cases for designating applications:
$ open -e helloworld.swift
will open a file with TextEdit.
$ open -t helloworld.swift
will open a file with the default application for text files (.txt
file extensions) You can use the Finder Info panel to change the default application or, if you want more fine grained control use RCDefaultApp. In the default macOS config these are the same, but you can of course change the default app to your favourite text editor. (Many text editors, like BBEdit and Atom, have their own CLI tool, but if they don’t, you can use open -t
instead.)
You can even pipe text into open
with the -f
option:
$ ls -l ~ | open -f # TextEdit, '-e' is implied
$ ls -l ~ | open -tf # default application assigned to txt
You can set your
$EDITOR
environment variable:EDITOR='open -tnW'; export EDITOR
and then command lines tools that expect text from an editor, likegit commit
, will get the text fromopen
and thus your default text editor instead. The-n
option will actually open a new (sometimes second) instance of the application and the command line tool will resume when you quit this new instance. This a somewhat awkward workflow for Mac users. Many text editors provide a command line tool that may work better in these cases. For BBEdit the correct$EDITOR
value isbbedit -w --resume
.
Showing Files in Finder
If you are working on a file in Terminal and want to locate it in Finder, open
can do better than just opening the enclosing folder. It can select a given file as well:
$ open -R helloworld.swift
Will open a Finder window with the enclosing folder of helloworld.swift
and select the file. (You can pass multiple files into open -R
but it will only select the last file in the list.)
URLs
Finally there is one more useful thing you can open
:
$ open https://scriptingosx.com # default browser
$ open vnc://TestMac.local # Screen Sharing
$ open x-man-page://open # show man page in Terminal
and, as always, you can use the -a
option to override the default application:
$ open -a Firefox https://scriptingosx.com
Header files
For the sake of being complete: you can also open header files quickly with open. The -h
option will search and open the header file for a given class. There is an additional -s
option to choose an SDK:
$ open -h NSTask
$ open -h NSTask -s OSX10.12
$ open -h UIView.h -s iPhoneOS10.2
$ open -a BBEdit -h NSTask
If the search term is ambiguous open
will list all the options.
You can even pipe PostScript to open and have it open in Preview
# function to send man page to Preview
manp()
{
man -t $* | open -f -a /Applications/Preview.app/
}
Yes, that is a great use!
I have a similar command described here: https://scriptingosx.com/2017/04/on-viewing-man-pages/
awesome article!
How to open applications on a specific desktop?
Unfortunately, the
open
command does not have that ability.You could write some tool with AppleScript/
osascript
that determines the coordinates of the current terminal window and then opens a Finder window in the same area…I am writing a Ruby script in which I want to be able to do two things: open the Mac OSX Finder to a specified folder, and open the Mac OSX Save As dialog box to a specified folder.
The former works with this code:
system(‘open’, ‘/Users/user_name/a_folder_name’)
But what code do I need to open the Save As dialog box to a specified folder?
Joe…..
I don’t think that is possible without AppleScript UI scripting and even that will be hugely limited by Privacy control and rendered ineffective by applications that implement “Save as…” differently than others
Hey, I wrote a script to get get the same functionality to work under WSL if anybody needs it! https://gist.github.com/benjamingwynn/a778aa6cf2dd461dc18978f245bd90c1
I love:
open -a Mail file1-to-attach file2-to-attach …