Wie mache ich aus einem Shell Skript eine MacOS App für die Finder Toolbar? Und wie ändere ich das Icon einer App?

Gerade noch über die verschlimmbesserte Funktion zum Hinzufügen von Apps zur Finder Toolbar gemeckert, und schon mit dem Problem konfrontiert, dort ein Shell Skript unterbringen zu wollen.

Man kann zwar ein Shell Skript per CMD-Drag’n’Drop in die Finder Toolbar ziehen, allerdings öffnet ein Klick auf dieses Skript selbiges im Text-Editor. Shell Skripte werden aus der Finder Toolbar heraus offensichtlich nicht ausgeführt. Es stellt sich also die Frage, wie man auf einfache Art und Weise aus einem Shell Skript eine native MacOS App macht, um diese dann in die Finder Toolbar zu ziehen.

MacOS App aus Shell Skript mit Hilfs-Skript erstellen

Die Lösung bedient sich eines Hilfs-Skriptes appify, das aus einem Shell Skript eine MacOS App generiert.

#!/usr/bin/env bash
Appify="$(basename "$0")"

if [ ! "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then cat <
    Copyright © 2011 Mathias Bynens 
    Copyright © 2011 Sencha Labs Foundation
    Copyright © 2015 Axel Dietrich 
EOF
exit; fi

# Options
appify_SRC="$1"
appify_FILE="$(basename $appify_SRC)"
appify_NAME="${2:-$(echo "$appify_FILE"| sed -E 's/.[a-z]{2,4}$//' )}"
appify_ROOT="$appify_NAME.appify/Contents/MacOS"
appify_RESOURCES="$appify_NAME.appify/Contents/Resources"
appify_INFO="$appify_NAME.appify/Contents/Info.plist"

# Create the bundle
if [[ -a "$appify_NAME.appify" ]]; then
    echo "$PWD/$appify_NAME.appify already exists :(" 1>&2
    exit 1
fi
mkdir -p "$appify_ROOT"
mkdir -p "$appify_RESOURCES"
touch "$appify_RESOURCES/$appify_NAME.icns"

# Copy the source into the bundle as the CFBundleExecutable
if [ -f "$appify_SRC" ]; then
    cp  "$appify_SRC" "$appify_ROOT/$appify_FILE"
    echo "Copied $appify_ROOT/$appify_FILE" 1>&2
else
    # Create a new blank CFBundleExecutable
    cat <<-EOF > "$appify_ROOT/$appify_FILE"
#!/usr/bin/env bash
echo "This ('$0') is a blank appified script." 1>&2
exit 1
EOF
    echo "Created blank '$appify_ROOT/$appify_FILE' be sure to edit this file to make it do things and stuff" 1>&2
fi
chmod +x "$appify_ROOT/$appify_FILE"

# Create the Info.plist
cat <<-EOF > "$appify_INFO"




  CFBundlePackageType
  APPL
  CFBundleInfoDictionaryVersion
  6.0
  CFBundleName
  $appify_NAME
  CFBundleExecutable
  $appify_FILE
  CFBundleIdentifier
  appified.$USER.$appify_FILE
  CFBundleVersion
  0.1
  CFBundleGetInfoString
  0.1 appified by $USER at `date`
  CFBundleIconFile
  $appify_NAME.icns
  CFBundleShortVersionString
  0.1


EOF
  # Appify!
  if [[ -a "$appify_NAME.app" ]]; then
      echo "$PWD/$appify_NAME.app already exists :(" 1>&2
    exit 1
fi
mv "$appify_NAME.appify" "$appify_NAME.app"

# Success!
echo -e "nBe sure to customize your $appify_INFO" 1>&2
echo "Optional: Put your own Icon(set) as $appify_NAME.icns in $appify_NAME.app/Contents/Resources" 1>&2
echo -e "Created $PWD/$appify_NAME.app. Done!n"

Das Skript wird unter dem Namen appify im Home-Verzeichnis gespeichert und anschliessend im Terminal per chmod +x appify ausführbar gemacht.

Mit dem Aufruf

$ ./appify das-shell-skript.sh

wird im selben Verzeichnis aus dem Shell Skript das-shell-skript.sh eine MacOS App mit dem Namen das-shell-skript.app generiert. Mit Angabe eines zusätzlichen Parameters “App Name”

$ ./appify das-shell-skript.sh "App Name"

lässt sich der MacOS App ein anderer Name geben.

Diese App lässt sich nun per CMD-Drag’n’Drop in die Finder Toolbar ziehen und von dort aus starten. Unschön könnte das Standard-Icon sein, dass MacOS dieser App in der Finder Toolbar gibt. Aber auch dafür gibt es eine unkomplizierte Lösung.

Das Icon einer MacOS App ändern

Der einfache Weg

  1. Zunächst eine rechteckige PNG-Grafik mit 512 x 512 px mit dem gewünschten Icon anlegen.
  2. Dann Doppel-Klick auf die PNG-Grafik; die Grafik wird im Previewer angezeigt.
  3. Nun mit CMD-C die Grafik in die Zwischenablage kopieren.
  4. Danach Rechtsklick auf die im ersten Schritt angelegte MacOS App und im Kontext-Menü “Get Info” anklicken.
  5. Im Popup-Info-Fenster ist oben links das (Standard-)Icon dieser App zu sehen. Dieses Icon anklicken; es sollte ein blauer Rahmen erscheinen.
  6. Nun mit CMD-V die eigene Grafik hineinkopieren.

Fertig!

Der Weg für Profis

Dabei wird das Icon direkt mit in die MacOS App eingebaut. Dazu erledigt das appify-Skript bereits die Vorarbeit, indem es eine Info.plist Datei anlegt. In dieser ist unter anderem die Information enthalten, welchen Namen eine Icon(set)-Datei trägt, in der sich ein oder mehrere App-Icons für die MacOS App befindet.

  1. Wir benötigen zunächst eine *.icns Datei, in der das Icon unserer App abgespeichert ist. “icns” steht dabei für Iconset, da eine solche Datei auch App-Icons in unterschiedlichen Größen bevorraten kann. Im einfachsten Fall ist das nur ein Icon. Der Weg zu einem solchen *.icons File kann wie folgt aussehen:
    • Terminal öffnen.
    • Verzeichnis das-shell-skript.iconset anlegen.
    • In dieses Verzeichnis die gewünschte App-Icon-Grafik als icon_512x512.png kopieren. (Annahme: Es handelt sich um eine Grafik mit 512 x 512 px)
    • Den Befehl iconutil -c icns das-shell-skript.iconset ausführen.

    Nun sollte im aktuellen Verzeichnis eine Datei das-shell-skript.icns existieren. Wenn ja, kann mit rm -rf das-shell-skript.iconset das Iconset-Verzeichnis gelöscht werden.

  2. Rechtsklick im Finder auf unsere MacOS App das-shell-skript.app. Es erscheint das Kontext-Menü. Dort “Show Package Contents” wählen.
  3. Im Finder wird nun der Inhalt unserer MacOS App angezeigt. Dies sollte das Verzeichnis Contents sein. Doppelklick.
  4. Auf der nächsten Ebene befindet sich die erwähnte Info.plist Datei sowie zwei Unterverzeichnisse. Doppelklick auf Resources.
  5. Dort befindet sich eine (leere) Datei mit Namen das-shell-skript.icns. Diese durch die in Schritt 1 angelegte *.icns-Datei ersetzen.

Fertig! Aber halt! Viele Wege führen nach Rom.

Die Superhero-Methode für echte Männer

Benötigt die XCode Developer Tools.

  1. Terminal öffnen.
  2. Mit sips -i das-shell-skript.png aus der Grafik sozusagen die eigene Icon-Datei erstellen.
  3. Die Grafik als Ressource speichern. Das geht mit dem Befehl DeRez -only icns das-shell-skript.png > icon.rsrc.
  4. Einbinden dieser Ressource in unsere App mit Rez -append icon.rsrc -o $'das-shell-skript.app/Iconr'.
  5. MacOS mitteilen, dass diese App jetzt ein Icon hat: SetFile -a C das-shell-skript.app.

Fertig!

Join the conversation!

Leave a Reply

Your email address will not be published. Required fields are marked *