• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

*.app selber erstellen

bw1faeh0

Uelzener Rambour
Registriert
06.01.08
Beiträge
370
Hallo Leute,

ich habe mir mal eine *.app angeschaut, die mir Steam erstellt hat und wollte nun so eine *.app nehmen und sie so abwandeln, dass ich mit einem Doppelklick ein Shell-Skript ausführen kann.

Dazu habe ich mir den Paketinhalt mal angeschaut:

Contents/MacOS/run.sh
Contents/Resources/shortcut.icns
Contents/Info.plist

Ist ja erst mal nicht spektakulär. In meiner run.sh steht folgendes:

Code:
#!/bin/bash

open -n -a iTerm --args "sh /Users/[Name]/BackupBilder.sh"

Im Endeffekt wird iTerm gestartet und darin das Skript BackupBilder.sh, dass in meinem Homeverzeichnis liegt, ausgeführt. Ich könnte zwar den Skriptinhalt direkt in die run.sh schreiben, jedoch habe ich dann kein Fenster, in dem ich die Informationen sehen könnte, die sonst auf der Konsole ausgegeben werden.

Nun möchte ich aber das Skript BackupBilder.sh nicht immer im Homeverzeichnis liegen lassen, sondern statt dessen direkt mit in die *.app reinpacken, also neben die run.sh. Sollte dann wie folgt aussehen:

Contents/MacOS/run.sh
Contents/MacOS/BackupBilder.sh
Contents/Resources/shortcut.icns
Contents/Info.plist

Nun muss ich ja den Code in der run.sh so abändern, dass er das Skript aus Contents/MacOS/ lädt. Wie kann ich dies universell angeben, ohne absolute Pfadangaben zu nutzen?

Und eine andere Frage:
Kann ich vielleicht direkt das run.sh-Skript so anpassen, dass ich doch darin den Code des Backups habe, nur dass er sichtbar im Terminal ausgeführt wird? Sonst habe ich nämlich nur das Dockicon was läuft...

Viele Grüße!
 
Nun muss ich ja den Code in der run.sh so abändern, dass er das Skript aus Contents/MacOS/ lädt. Wie kann ich dies universell angeben, ohne absolute Pfadangaben zu nutzen?
Code:
"$( basename "${0}" )/foo.sh";

[COLOR="DarkSlateGray"]# oder (empfehlenswerter) einfach in die aktuelle Shell laden:[/COLOR]

source "$( basename "${0}" )/foo.sh";

Kann ich vielleicht direkt das run.sh-Skript so anpassen, dass ich doch darin den Code des Backups habe, nur dass er sichtbar im Terminal ausgeführt wird?
Code:
osascript \
  -e 'try' \
  -e 'set scripttext to "ls -la /Library/Application\\ Support/" ' \
  -e 'tell application "Terminal" ' \
  -e 'activate' \
  -e 'do script scripttext' \
  -e 'end tell' \
  -e 'end try';
(Man achte auf das etwas kniffelige maskieren von " und \ )
 
Hi,

danke für die schnelle Antwort, leider reicht es noch nicht ganz bei meinem Hintergrundwissen.

Also
Code:
"$( basename "${0}" )/BackupBilder.sh";
erzeugt bei mir run.sh/BackupBilder.sh

Wenn ich aber dirname nehme, komme ich weiter:
Code:
open -n -a iTerm --args "$( dirname "${0}" )/BackupBilder.sh";

Leider bekomme ich dann ein Access Denied wenn er BackupBilder.sh ausführen will...

Mit
Code:
source "$( basename "${0}" )/foo.sh";
kann ich leider nicht viel anfangen, sorry.

Wenn ich
Code:
osascript \
  -e 'try' \
  -e 'set scripttext to "ls -la /Library/Application\\ Support/" ' \
  -e 'tell application "Terminal" ' \
  -e 'activate' \
  -e 'do script scripttext' \
  -e 'end tell' \
  -e 'end try';
verwenden will, wie handhabe ich den scripttext, wenn er mehrzeilig ist?

Viele Grüße
 
Wenn ich aber dirname nehme, komme ich weiter
Mea culpa. Vermutlich bin ich nur bedenklich dehydriert. Werde mich umgehend in biergärtliche Behandlung begeben. :-)

Leider bekomme ich dann ein Access Denied wenn er BackupBilder.sh ausführen will...
...was aber nicht an dieser Form des Aufrufs liegen kann.

Mit
Code:
source "$( basename "${0}" )/foo.sh";
kann ich leider nicht viel anfangen
Was gibts da anzufangen?
'source' liest eine beliebige Datei als Text ein, und führt dann darin enthaltene Shellbefehle aus.
Im Prinzip das gleiche wie der Aufruf eines externen Skripts, nur dass die Befehle im aktuellen Shellkontext laufen statt in einer neuen Subshell. (Kein neuer Prozess wird gestartet)
Folgendes hätte den gleichen Effekt:
Code:
eval "$( cat skript.sh )";

wie handhabe ich den scripttext, wenn er mehrzeilig ist?
Code:
osascript \
  -e 'try' \
  -e 'set scripttext to "

      export PATH=\"/bin:/sbin:/usr/bin:/usr/sbin\";

      ls -l /Library/Application\\ Support/;
      ls -l /System/Library/Screen\\ Savers/;
      ls -l /Users/Shared/;

      for item in nano grep man;
      do
        echo \"${item}\";
        whereis \"${item}\";
      done;

      " ' \
  -e 'tell application "Terminal" ' \
  -e 'activate' \
  -e 'do script scripttext' \
  -e 'end tell' \
  -e 'end try';
 
Nur mal am Rande: Man kann mit dem AppleScript-Editor auch (AppleScript-basierte) Apps direkt erstellen lassen. Und AppleScript kann insb. z.B. Shellscripte ausführen.