• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

*.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!
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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 \ )
 

bw1faeh0

Uelzener Rambour
Registriert
06.01.08
Beiträge
370
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
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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';
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
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.