Using Automator.app and Platypus.app, I have been able to bundle a simple shell script I created to power cycle wi-fi on my MacBook Pro. Both resulting apps run properly, but have one glaring issue that I want to correct: The apps reference the shell script from outside of the program. How can I embed the shell script and reference it from the app's resources so that the app can run even if the original source file is moved?
Converting a Shell Script Into a *.app File
26.1k Views Asked by C1pher At
2
There are 2 best solutions below
2
Mitra Ardron
On
While this works, there seems to be no way to access the Contents directory from the script. Its not passed in the environment variables to bash, or anywhere else I can find. This makes it hard to bundle stuff into the Contents directory since it seems to be inaccessible by the bash script. There are various hacks on the net, but they all involve effectively searching for the script by name, which means if there are two versions of the app in two places then it will fail. Anyone solve that?
Related Questions in MACOS
- How do I customize NSOutlineView to have border color?
- Force sublime text to use PATH from the shell value
- Do executable files always open a terminal window on MacOS?
- setting OpenGL version in objective-C
- C std library don't appear to be linked in object file
- Cross compile simple standard C program on Linux for Mac
- How to generate request format for WCF web service method for Mac and iPhone
- Bundle Multiple Xamarin apps in one pkg installer
- How to Handle Command Line Prompt from a Cocoa App
- AVFoundation - Process each image separately
- CMYK NSImage get pixel data
- how i get the mac of ibeacon or BLE
- Set JAVA_HOME on Mac
- Finding active IPv6 interfaces under Mac OS (using Python)
- OSX: Why is my launchd agent running my script twice?
Related Questions in SHELL
- passing text with \n as one argument in shell
- Delete the extra space after special character in all the lines of text file
- Calling a python function with options from shell script
- bc: prevent "divide by zero" runtime error on multiple operations
- schedule and automate sqoop import/export tasks
- How can launch an external process from java and still be able to interact with this process?
- Linux find files where mtime and ctime are not equal
- Find all files contained into directory named
- Quick way to remove all folders titled CVS in a directory and it's subdirectories?
- shell process not exiting on `exit` inside `$()`
- How to set environment variables with a forward slash in the key
- System 'bash -ic' stuck when I hit ctrl+c
- bash functions returns "command not found"
- Why does pattern "*.so?(.*)" produce a syntax error in a script but not on command line?
- retrieve plaintext password from file using bash command
Related Questions in SCRIPTING
- Using arrow keys to rotate an object
- bash functions returns "command not found"
- Calling javascript file from html file doesn't work at all
- Detecting corrupt characters in UTF-8 encoded text file
- Can I automate auto-app installation on my Android device?
- iMacros website form dropdown menu
- How to use multiple classes in multiple files in scripts?
- mIRC: Check if INI-file has a key
- Cannot open: c:\users\...\temp\package.cab when running Process.Start
- Using Gawk and Printf in a Bash script
- How can I edit a binary file under Windows by scripting
- interpreting a script through F#
- NET USE command to connect to a shared folder on local LAN
- Script to get List of logged in users
- find the lines where sequence/sorting is broken in linux
Related Questions in EXECUTABLE
- Do executable files always open a terminal window on MacOS?
- executables = executables python error (trying to turn pygame into executable with cx_freeze)
- Query, if a heap is executable
- How to create .exe from python script with modules and dependent files
- Converting a Shell Script Into a *.app File
- Is It Possible To Create a .jar File That Runs An Existing .bat File?
- How can I write a script to use an application
- which is pelican executable script that user executes from shell?
- JavaFX executable JAR runs into problems with loading FXML file, why isn't the FXML being loaded?
- Nothing happens when executing a python shebang script in /usr/local/bin/
- How to launch this program from the command line?
- Running executable files using Haskell
- How to change the working directory of a bundled Java program
- Turning Cython code into an executable "Python.h: no such file or directory
- Pascal: change TProcess description?
Related Questions in DESKTOP
- How i can set Desktop Icon of my java Application in windows7, 8?
- Deploying Client/Server Java Application
- Converting a Shell Script Into a *.app File
- Trigger a Windows Runtime background task from Windows 10 Desktop
- Desktop Database with Server without installation
- Script for button "View Desktop Version"?
- Relay Data Securely From Desktop Application
- Effective desktop layout saving for developers?
- Adaptive layout (mobile/desktop) in AngularJS - what is the preferred way to do it (example inside)
- Can I make a simple browser plugin for both desktop and mobile?
- Application Insights: How to track crashes in Desktop (WPF) applications?
- windows desktop notification
- Check if desktop window is in foreground using .bat
- Can i get the name of an java voice chat application which connect using IP?
- How to create a special docked window outside of the desktop (like microsoft test manager)
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Just to mention it, if you Get Info on a script, you can set it to be opened with the Terminal. This will run the script when you double-click it.
Otherwise, packaging a script in a .app bundle is trivial. Mac OS X will happily run any script identified as the application's executable.
At a minimum, you need to following structure in place:
Where the file called (name) is your script (which must be executable, and must have a shebang line). (name) must be identical in the .app directory and the script file: for instance, if your app directory is called "My Shell Script.app", then the file inside the MacOS directory must be called "My Shell Script", with no extension.
If this is inconvenient, it's possible to use an Info.plist file to specify an alternate executable name. The Info.plist goes in the Contents directory:
This structure (a MyScript executable in a wrapper called Wrapper.app) works if you specify MyScript as the
CFBundleExecutablein the property list:Using an Info.plist file is probably preferable, as that will allow you to rename your wrapper without breaking it.
Here's one example script that uses
/bin/shas the interpreter, but you really could have anything (#!/usr/bin/swift,#!/usr/bin/python, etc).The script will run as you double-click the app bundle.
You can bundle anything else that you need with your script within the
Contentsdirectory. If you feel fancy, you can reproduce the standard executable bundle layout with aResourcesdirectory and things like that.