[314] | 1 | launch 1.1.1 [unreleased]
|
---|
| 2 | ============
|
---|
[3] | 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,
|
---|
[52] | 15 | documents, folders, or URLs. With the exception of special support for
|
---|
[214] | 16 | TextEdit (open -e), 'launch' does all this and:
|
---|
[3] | 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
|
---|
[214] | 24 | didn't get until Mac OS X 10.4
|
---|
[52] | 25 | - allows you to pipe output to GUI applictions
|
---|
[3] | 26 | - launches applications in the background
|
---|
| 27 | - launches Carbon applications in Classic
|
---|
| 28 | - displays file information including type, creator, bundle ID,
|
---|
[146] | 29 | data and resource fork sizes, dates and version
|
---|
[3] | 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 |
|
---|
[146] | 51 | % sudo /usr/bin/install -d /usr/local/bin /usr/local/man/man1
|
---|
[267] | 52 | % sudo /usr/bin/install -c launch /usr/local/bin
|
---|
[146] | 53 | % sudo /usr/bin/install -c launch.1 /usr/local/man/man1
|
---|
[3] | 54 | % rehash
|
---|
| 55 |
|
---|
| 56 | Uninstallation:
|
---|
| 57 |
|
---|
[166] | 58 | % sudo rm -f /usr/local/bin/launch /usr/local/man/man1/launch.1
|
---|
[3] | 59 |
|
---|
| 60 | COMPILATION
|
---|
| 61 | -----------
|
---|
| 62 |
|
---|
[308] | 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.
|
---|
[3] | 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 |
|
---|
[54] | 81 | % ls -l | launch -c CWIE -
|
---|
[52] | 82 | [CodeWarrior IDE opens with an untitled document containing the file list]
|
---|
[3] | 83 |
|
---|
[214] | 84 | % launch -i org.mozilla.camino http://www.apple.com/
|
---|
[146] | 85 | [Camino opens Apple's Web site]
|
---|
[52] | 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
|
---|
[308] | 91 | /Applications/Preview.app: Mac OS X application package
|
---|
[3] | 92 | type: 'APPL' creator: 'prvw'
|
---|
[308] | 93 | architecture: Intel 80x86, PowerPC
|
---|
[3] | 94 | bundle ID: com.apple.Preview
|
---|
[308] | 95 | version: 3.0.8
|
---|
[3] | 96 | kind: Application
|
---|
[308] | 97 | content type ID: com.apple.application-bundle
|
---|
[146] | 98 | contents: 1 item
|
---|
[3] | 99 | [...]
|
---|
| 100 |
|
---|
[146] | 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 && \
|
---|
[309] | 107 | appswitch -a Emacs ) || \
|
---|
[146] | 108 | ( launch -ba Emacs && \
|
---|
| 109 | until { emacsclient -n $@ >&/dev/null } do sleep 1; done;
|
---|
| 110 | appswitch -a Emacs )
|
---|
| 111 | export EDITOR=emacsclient
|
---|
| 112 | }
|
---|
| 113 |
|
---|
[3] | 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
|
---|
[308] | 124 | /Applications/Internet/OmniWeb.app: scriptable Mac OS X application package
|
---|
[3] | 125 | type: 'APPL' creator: 'OWEB'
|
---|
[308] | 126 | architecture: PowerPC, Intel 80x86
|
---|
| 127 | bundle ID: com.omnigroup.OmniWeb5
|
---|
[3] | 128 |
|
---|
| 129 | Note that bundle IDs are not case-sensitive: com.barebones.BBEdit is
|
---|
| 130 | the same as com.barebones.bbedit.
|
---|
| 131 |
|
---|
| 132 |
|
---|
[52] | 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
|
---|
[146] | 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.
|
---|
[52] | 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 |
|
---|
[3] | 152 | Q. Why can't I use -f with -c to get info on an application with a
|
---|
[52] | 153 | given creator (or -f with -i for a bundle ID)?
|
---|
[3] | 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'
|
---|
[146] | 166 | bundle ID: com.mathemaesthetics.resorcerer
|
---|
| 167 | version: 2.4 [0x2418010 = 37847056]
|
---|
[3] | 168 | kind: Application
|
---|
[146] | 169 | [...]
|
---|
[3] | 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
|
---|
[166] | 190 | X GUI, certain operations may not work. Try opening Terminal, creating
|
---|
| 191 | a new terminal window, and trying again.
|
---|
[3] | 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 |
|
---|
[314] | 225 | 1.1.1 - unreleased
|
---|
| 226 | - updated error codes for Mac OS X 10.4
|
---|
[309] | 227 | 1.1 - 30 October 2006
|
---|
[265] | 228 | - -L: send "launch" (ascr/noop) event to app, bypasses automatic
|
---|
[304] | 229 | opening of untitled document, etc.
|
---|
[310] | 230 | - -o: pass command-line arguments (broken, r. 4474993)
|
---|
[214] | 231 | - display content type ID (UTI)
|
---|
[308] | 232 | - display architecture of Mach-O files
|
---|
[214] | 233 | - switched to new LSOpen APIs (now requires Mac OS X 10.4 or later)
|
---|
[265] | 234 | - switched to new date formatting APIs (the old ones are deprecated)
|
---|
[214] | 235 | - for compatibility with open(1), take app path as argument to -a
|
---|
[304] | 236 | - Universal Binary, compatible with Intel Macs [Peter Hosey]
|
---|
[166] | 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
|
---|
[146] | 251 | 1.0 - 23 October 2003
|
---|
[137] | 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]
|
---|
[146] | 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
|
---|
[127] | 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
|
---|
[52] | 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
|
---|