Skip to content

Instantly share code, notes, and snippets.

@subtleGradient
Created November 11, 2010 16:03
Show Gist options
  • Star 58 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save subtleGradient/672684 to your computer and use it in GitHub Desktop.
Save subtleGradient/672684 to your computer and use it in GitHub Desktop.
appify. Create the simplest possible mac app from a shell script
#!/usr/bin/env bash
#
# url : https://gist.github.com/672684
# version : 2.0.1
# name : appify
# description : Create the simplest possible mac app from a shell script.
# usage : cat my-script.sh | appify MyApp
# platform : Mac OS X
# author : Thomas Aylott <oblivious@subtlegradient.com>
APPNAME=${1:-Untitled}
if [[ -a "$APPNAME.app" ]]; then
echo "App already exists :'(" >&2
echo "$PWD/$APPNAME.app"
exit 1
fi
mkdir -p "$APPNAME.app/Contents/MacOS"
touch "$APPNAME.app/Contents/MacOS/$APPNAME"
chmod +x "$APPNAME.app/Contents/MacOS/$APPNAME"
while read SCRIPT_SOURCE_LINE; do
echo "$SCRIPT_SOURCE_LINE" >> "$APPNAME.app/Contents/MacOS/$APPNAME"
done
echo "$PWD/$APPNAME.app"
@mathiasbynens
Copy link

Posting this here too:

“The application My.app cannot be opened because it has an incorrect executable format”?
Try adding a #! shebang to My.app/Contents/MacOS/My

@subtleGradient
Copy link
Author

New hello world example for appify 2.0

appify Howdy
#!/usr/bin/osascript
say "Howdy"

⌃D

open -a Howdy

@subtleGradient
Copy link
Author

"You can't open the application Test because it is not supported on this type of Mac."
Same deal. Try adding a #! shebang line.

@paulirish
Copy link

Mathias, did you augment this for chrome execution with flags? would love to get that. :>

@mathiasbynens
Copy link

appify v2.0.1 assumes my-script.sh has a newline at the end of the file. If not, it will chop off the last line, effectively breaking the generated app. I’ve fixed this in my fork of this gist, by replacing the while read loop with this:

DONE=false
until $DONE ;do
  read || DONE=true
  echo "$REPLY" >> "$APPNAME.app/Contents/MacOS/$APPNAME"
done

Paul: http://mathiasbynens.be/notes/shell-script-mac-apps#chrome-bootstrappers

@subtleGradient
Copy link
Author

Updated to your 2.0.2!
Thanks Mathias!

@subtleGradient
Copy link
Author

@mathiasbynens
Copy link

You could also add [[ ! $REPLY ]] && continue after line 25, which will cause all redundant newlines to be skipped. (See my fork.)

@subtleGradient
Copy link
Author

Maybe it should just cp the file in there instead and avoid all these silly issues.

@mathiasbynens
Copy link

Hey @subtleGradient, I just rewrote appify so it uses cp which avoids a lot of problems. Check it out: https://gist.github.com/674099

@andreif
Copy link

andreif commented Jun 6, 2015

It wouldn't work on OS X 10.10 until I added $APPNAME.app/Contents/Info.plist containing at least <plist><dict></dict></plist>

@phasstw
Copy link

phasstw commented Aug 9, 2016

I created an app, but it won't execute when I double-click on the bundle. It is just a #!/bin/sh script that has a echo "hello world" statement in it for testing purposes. Can someone give me some guidance on how to get my app to run from clicking on the bundle? Appify did not create a Info.plist file for me, maybe this is the issue? What needs to be in that file? Thanks!

@oubiwann
Copy link

oubiwann commented Dec 9, 2016

I forked this and added option-parsing, overridable icons file, and some other bits: https://gist.github.com/oubiwann/453744744da1141ccc542ff75b47e0cf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment