1 | launch 1.1.1 [unreleased] |
---|
2 | ============ |
---|
3 | |
---|
4 | A command-line launcher for Mac OS X in the spirit of open(1). |
---|
5 | |
---|
6 | Written by Nicholas Riley <mailto:launchsw@sabi.net>. |
---|
7 | Obtain updates from <http://web.sabi.net/nriley/software/>. |
---|
8 | |
---|
9 | WHAT IS IT? |
---|
10 | ----------- |
---|
11 | |
---|
12 | Apple provides a simple command-line launching program called 'open' |
---|
13 | with Mac OS X. It offers few options - launching applications by name |
---|
14 | or by path, launching TextEdit, or opening a number of applications, |
---|
15 | documents, folders, or URLs. With the exception of special support for |
---|
16 | TextEdit (open -e), 'launch' does all this and: |
---|
17 | |
---|
18 | - opens URLs, directly or in your preferred helper application (-l) |
---|
19 | - lets you specify applications by their four-character creator |
---|
20 | (e.g. 'ToyS') or Java-style bundle ID (e.g. com.apple.scripteditor), |
---|
21 | both of which allow you to move or rename an application without |
---|
22 | changing references to it |
---|
23 | - asks applications to print documents, something the OS X Finder |
---|
24 | didn't get until Mac OS X 10.4 |
---|
25 | - allows you to pipe output to GUI applictions |
---|
26 | - launches applications in the background |
---|
27 | - launches Carbon applications in Classic |
---|
28 | - displays file information including type, creator, bundle ID, |
---|
29 | data and resource fork sizes, dates and version |
---|
30 | - reports errors intelligibly |
---|
31 | - and much more! |
---|
32 | |
---|
33 | 'launch' is useful by itself, but is even better when used in scripts. |
---|
34 | Assign a shell command to your favorite Mac OS text, graphics or |
---|
35 | resource editor. Go to your favorite Web site with a few keystrokes. |
---|
36 | |
---|
37 | Like 'open', 'launch' provides one half of the round-trip between |
---|
38 | Terminal.app and the Finder. You can drag and drop icons or proxy icons |
---|
39 | into Terminal.app to insert their paths into command lines. To go in the |
---|
40 | other direction, just type 'launch .' (or 'open .') to open a Finder window |
---|
41 | showing the current directory. |
---|
42 | |
---|
43 | INSTALLATION |
---|
44 | ------------ |
---|
45 | |
---|
46 | The commands below install the 'launch' tool in /usr/local/bin, which |
---|
47 | is in the default path. You should subsequently be able to use |
---|
48 | 'launch' by typing its name. If you wish to install it somewhere else, |
---|
49 | modify the install line as appropriate. |
---|
50 | |
---|
51 | % sudo /usr/bin/install -d /usr/local/bin /usr/local/man/man1 |
---|
52 | % sudo /usr/bin/install -c launch /usr/local/bin |
---|
53 | % sudo /usr/bin/install -c launch.1 /usr/local/man/man1 |
---|
54 | % rehash |
---|
55 | |
---|
56 | Uninstallation: |
---|
57 | |
---|
58 | % sudo rm -f /usr/local/bin/launch /usr/local/man/man1/launch.1 |
---|
59 | |
---|
60 | COMPILATION |
---|
61 | ----------- |
---|
62 | |
---|
63 | An Xcode project, 'launch.xcodeproj', is included. A precompiled |
---|
64 | Universal binary is also provided. 'launch' was developed and tested |
---|
65 | under Mac OS X 10.4.8 with Xcode 2.4, and does not require any |
---|
66 | additional software to build. |
---|
67 | |
---|
68 | USAGE |
---|
69 | ----- |
---|
70 | |
---|
71 | Just type 'launch' by itself to receive usage information. |
---|
72 | |
---|
73 | Some examples: |
---|
74 | |
---|
75 | % launch -c 'R*ch' |
---|
76 | [BBEdit opens] |
---|
77 | |
---|
78 | % launch -pbc 'R*ch' test.txt |
---|
79 | [BBEdit starts printing test.txt in the background] |
---|
80 | |
---|
81 | % ls -l | launch -c CWIE - |
---|
82 | [CodeWarrior IDE opens with an untitled document containing the file list] |
---|
83 | |
---|
84 | % launch -i org.mozilla.camino http://www.apple.com/ |
---|
85 | [Camino opens Apple's Web site] |
---|
86 | |
---|
87 | % launch -l launchsw@sabi.net |
---|
88 | [Your preferred email client opens a new message to comment on launch] |
---|
89 | |
---|
90 | % launch -f /Applications/Preview.app |
---|
91 | /Applications/Preview.app: Mac OS X application package |
---|
92 | type: 'APPL' creator: 'prvw' |
---|
93 | architecture: Intel 80x86, PowerPC |
---|
94 | bundle ID: com.apple.Preview |
---|
95 | version: 3.0.8 |
---|
96 | kind: Application |
---|
97 | content type ID: com.apple.application-bundle |
---|
98 | contents: 1 item |
---|
99 | [...] |
---|
100 | |
---|
101 | A scripting example: a zsh function which provides an OS X wrapper |
---|
102 | around emacsclient and the Carbon build of GNU Emacs, using launch and |
---|
103 | appswitch (another one of my command-line tools). |
---|
104 | |
---|
105 | e() { |
---|
106 | ( emacsclient -n $@ >&/dev/null && \ |
---|
107 | appswitch -a Emacs ) || \ |
---|
108 | ( launch -ba Emacs && \ |
---|
109 | until { emacsclient -n $@ >&/dev/null } do sleep 1; done; |
---|
110 | appswitch -a Emacs ) |
---|
111 | export EDITOR=emacsclient |
---|
112 | } |
---|
113 | |
---|
114 | FREQUENTLY ASKED QUESTIONS |
---|
115 | -------------------------- |
---|
116 | |
---|
117 | Q. How do I discover bundle IDs for applications? |
---|
118 | |
---|
119 | A. The -f option to launch can help. Say you have OmniWeb in the |
---|
120 | /Applications/Internet folder, and want to find out its bundle ID. |
---|
121 | Type 'launch -f', and drop the OmniWeb icon on Terminal: |
---|
122 | |
---|
123 | % launch -f /Applications/Internet/OmniWeb.app |
---|
124 | /Applications/Internet/OmniWeb.app: scriptable Mac OS X application package |
---|
125 | type: 'APPL' creator: 'OWEB' |
---|
126 | architecture: PowerPC, Intel 80x86 |
---|
127 | bundle ID: com.omnigroup.OmniWeb5 |
---|
128 | |
---|
129 | Note that bundle IDs are not case-sensitive: com.barebones.BBEdit is |
---|
130 | the same as com.barebones.bbedit. |
---|
131 | |
---|
132 | |
---|
133 | Q. Why does application X open a file with a name beginning with |
---|
134 | 'launch-stationery-'? |
---|
135 | |
---|
136 | A. Your application does not support stationery. Applications which |
---|
137 | support stationery respond to it by creating a new untitled document |
---|
138 | with the contents of the stationery. Most Cocoa applications, such as |
---|
139 | TextEdit, do not support stationery. (Omni Group applications are a |
---|
140 | notable exception.) If you're looking for a text editor which |
---|
141 | supports stationery, try BBEdit, Tex-Edit Plus, the CodeWarrior IDE, |
---|
142 | or almost any other Carbon editor. |
---|
143 | |
---|
144 | For the curious: launch processes input by simultaneously reading it |
---|
145 | and writing to a temporary stationery file. Once reading is complete, |
---|
146 | launch opens the stationery file with your selected application, and |
---|
147 | deletes the stationery after one minute (as a safeguard, it is not |
---|
148 | possible to accurately gauge how long it will take for the application |
---|
149 | to open the stationery). |
---|
150 | |
---|
151 | |
---|
152 | Q. Why can't I use -f with -c to get info on an application with a |
---|
153 | given creator (or -f with -i for a bundle ID)? |
---|
154 | |
---|
155 | A. This feature may be added to a later version (or add it yourself!), |
---|
156 | but there is a workaround. Instead of: |
---|
157 | |
---|
158 | % launch -f -c 'Doug' |
---|
159 | launch: can't get information (-f) on item(s) using an application (-u, -c, -i, -a) |
---|
160 | |
---|
161 | use: |
---|
162 | |
---|
163 | % launch -f "`launch -nc 'Doug'`" |
---|
164 | /Volumes/GrayApps/Utilities/Resorcerer 2.4/Resorcerer: scriptable Mac OS X application [Carbon, prefers native OS X] |
---|
165 | type: 'APPL' creator: 'Doug' |
---|
166 | bundle ID: com.mathemaesthetics.resorcerer |
---|
167 | version: 2.4 [0x2418010 = 37847056] |
---|
168 | kind: Application |
---|
169 | [...] |
---|
170 | |
---|
171 | |
---|
172 | Q. Why doesn't launch support opening items as root? |
---|
173 | |
---|
174 | A. Apple eliminated this capability with the Mac OS X 10.1 Security |
---|
175 | Update. If at some point Apple restores this capability, 'launch' |
---|
176 | will be ready to support it. |
---|
177 | |
---|
178 | |
---|
179 | Q. Why do I get an error -600? |
---|
180 | |
---|
181 | A. A typical occurrence of this would be: |
---|
182 | |
---|
183 | % launch -n . |
---|
184 | launch: can't open items: unable to connect to system service. |
---|
185 | Are you logged in? (-600) |
---|
186 | |
---|
187 | In order to perform certain operations, launch needs to talk to |
---|
188 | various system services owned by the currently logged-on user. If you |
---|
189 | aren't using 'launch' from a terminal currently logged into the Mac OS |
---|
190 | X GUI, certain operations may not work. Try opening Terminal, creating |
---|
191 | a new terminal window, and trying again. |
---|
192 | |
---|
193 | Another possibility is to create your own interprocess messaging. |
---|
194 | For example, place this script in a file: |
---|
195 | |
---|
196 | #!/bin/sh |
---|
197 | PIPE=/tmp/.launchpipe |
---|
198 | [ -e $PIPE ] || mkfifo $PIPE |
---|
199 | while true; do |
---|
200 | read opts < $PIPE |
---|
201 | eval "/path/to/launch $opts" & # change this to launch's path |
---|
202 | done |
---|
203 | |
---|
204 | Then, define a function or alias. For zsh: |
---|
205 | |
---|
206 | rlaunch() { echo $@ > /tmp/.launchpipe } |
---|
207 | |
---|
208 | Or for tcsh: |
---|
209 | |
---|
210 | alias rlaunch 'echo \!* > /tmp/.launchpipe' |
---|
211 | |
---|
212 | Start the shell script above from the console, then you can use |
---|
213 | 'rlaunch' in place of 'launch' logged in from anywhere else. |
---|
214 | |
---|
215 | Thanks to robert <robert@allyourbass.org> for this suggestion. |
---|
216 | |
---|
217 | COMMENTS, SUGGESTIONS, BUG REPORTS, ETC. |
---|
218 | ---------------------------------------- |
---|
219 | |
---|
220 | Please send to the author, Nicholas Riley, at <launchsw@sabi.net>. |
---|
221 | |
---|
222 | VERSION HISTORY |
---|
223 | --------------- |
---|
224 | |
---|
225 | 1.1.1 - unreleased |
---|
226 | - updated error codes for Mac OS X 10.4 |
---|
227 | 1.1 - 30 October 2006 |
---|
228 | - -L: send "launch" (ascr/noop) event to app, bypasses automatic |
---|
229 | opening of untitled document, etc. |
---|
230 | - -o: pass command-line arguments (broken, r. 4474993) |
---|
231 | - display content type ID (UTI) |
---|
232 | - display architecture of Mach-O files |
---|
233 | - switched to new LSOpen APIs (now requires Mac OS X 10.4 or later) |
---|
234 | - switched to new date formatting APIs (the old ones are deprecated) |
---|
235 | - for compatibility with open(1), take app path as argument to -a |
---|
236 | - Universal Binary, compatible with Intel Macs [Peter Hosey] |
---|
237 | 1.0.1 - 3 April 2005 |
---|
238 | - prefer files to URLs; added -U for old behavior |
---|
239 | - don't display extraneous leading './' on file paths |
---|
240 | - display 'zero items', not '0 items', for consistency |
---|
241 | - display versions of non-applications |
---|
242 | - read Info.plists embedded in unbundled Mach-O applications |
---|
243 | - non-ASCII arguments are now handled with the filesystem, rather |
---|
244 | than the system encoding [Derrick Bass] |
---|
245 | - explicitly use UTF-8 everywhere else to properly interpret and |
---|
246 | display non-ASCII filenames and URLs |
---|
247 | - reading OSTypes and 'vers' resources, and opening URLs with |
---|
248 | Internet Config still uses the system encoding, converting as |
---|
249 | necessary for display |
---|
250 | - should be buildable on 10.2 again |
---|
251 | 1.0 - 23 October 2003 |
---|
252 | - work around CFBundle bug to report bundle identifiers and versions |
---|
253 | from resource forks of unpackaged Carbon applications and Classic |
---|
254 | applications [Lloyd Dupont] |
---|
255 | - added descriptions for more error codes and clarified error |
---|
256 | reporting |
---|
257 | - output all errors to stderr |
---|
258 | - provide better errors for -X option |
---|
259 | - restored -m: OS X bug is fixed in Panther |
---|
260 | - fixed a couple of tiny memory leaks |
---|
261 | - added man page [Hisashi T Fujinaka] |
---|
262 | - work around bug in LSOpenFromURLSpec opening multiple items in |
---|
263 | Mac OS X 10.3 |
---|
264 | 1.0b2 - 9 March 2003 |
---|
265 | - fixed install instructions to create /usr/local/bin if needed |
---|
266 | - show bundle version with text, hex and integer representations |
---|
267 | 1.0b1 - 14 December 2002 |
---|
268 | - accept "slack" (default http) URLs and email addresses with -l |
---|
269 | - accept input from stdin with '-' |
---|
270 | - open URLs with arbitrary applications when specified without -l |
---|
271 | - builds without compiler warnings |
---|
272 | 1.0a9 - 2 April 2002 |
---|
273 | - license, comments changes |
---|
274 | 1.0a8 - 29 March 2002 |
---|
275 | - errors with -l (from ICeCoffEE), added rlaunch script |
---|
276 | 1.0a7 - 3 March 2002 |
---|
277 | - print dates, sizes, folder valence, locked status for -f |
---|
278 | - don't abort on failure to obtain bundle information |
---|
279 | 1.0a6 - 30 November 2001 |
---|
280 | - fixed incorrect messages, broken -u and crash on -nu |
---|
281 | 1.0a5 - 28 November 2001 |
---|
282 | - print kind string for -f, still no new installer |
---|
283 | 1.0a4 - 20 November 2001 |
---|
284 | - [try to] use Installer VISE instead of InstallAnywhere |
---|
285 | 1.0a3 - 15 November 2001 |
---|
286 | - fixed package identification in -f, updated examples |
---|
287 | 1.0a2 - 15 November 2001 |
---|
288 | - -f, removed broken -m |
---|
289 | 1.0a1 - 14 November 2001 |
---|
290 | - renamed from "FindApp", launch by default, -u |
---|
291 | 1.0d5 - 7 November 2001 |
---|
292 | - option -s for launching as root [nonfunctional] |
---|
293 | 1.0d4 - 6 November 2001 |
---|
294 | - URL launching and Internet Config support |
---|
295 | 1.0d3 - 4 November 2001 |
---|
296 | - more robust, support for docs without app |
---|
297 | 1.0d2 - 4 November 2001 |
---|
298 | - options -opsbmhCX, -cin, documents |
---|
299 | 1.0d1 - 26 August 2001 |
---|
300 | - returns path of application identified by creator |
---|