kann ich irgendwo definieren, dass mein Script ein AS ist?
Ohne lang auszuschweifen wie das zu handhaben ist: Du kannst ganz einfach direkt aus dem AppleSkript-Editor dein Projekt als fix und fertiges Programm-Bundle speichern. Bei Bedarf änderst du dann nur noch den Bundle-Identifier, Versionsnummern, das Programmicon usw und fügst ggf noch weitere Resourcen hinzu ..... na, eine korrekte "Info.plist" zusammenzudengeln dürfte dir ja im Grunde schon bekannt sein.
Kein Mensch wird dann mehr bemerken, dass da ein AS drinsteckt und kein Mach-O Binary. Eine ganze Menge von Mac-Apps wurden so gebaut, wenn auch die meisten nicht mit dem primitiven "Editor"-Zwerg, sondern mit der deutlich mächtigeren Luxus-Werkzeugkiste "AppleSkript Studio".
Programm-Bundles kannst du mit fast allem bauen was du an Interpretersprachen installiert hast: Bourneshell, OsaScript (aka AppleSkript), Perl, Python, Ruby, wenn du zB eine speziell konfigurierte (sicherheitsgelockerte) Ghostscript-Version verwendest kannst du sogar aus Postscript eine App basteln, genügend Leidensfähigkeit und Spieltrieb mal vorausgesetzt.
Warum AS in manchen Situationen nach Rosetta schreit?
Weils mit ziemlicher Sicherheit irgendeine AS-Erweiterung ("Scripting Addition", ein sog. "OSAX") bei dir im System hat die noch aus PPC-Code ist. OSAscript ist zwar sehr "extensibel", aber leider nicht besonders intelligent, und performant schon gar nicht. Das ist im Grunde ein Interpreter in einem Interpreter, der in einem Interpreter einen Interpreter interpretiert, während er mit anderen Interpretern kommunizieren kann. Etwas übertrieben formuliert.
Wie schon erwähnt, AS ist eine plumpe Wildsau und die Methode bietet sich deshalb
nur für kleine eingebettete Skripten an.
V.a. auch weil hier die Resource-Limits für ein Shellskript sehr viel knapper bemessen sind als bei nativer Ausführung. Gegenüber der Shell im Kernel natürlich erst recht. Skripte dürfen nur ein paar kB lang sein und auch die max Länge von übergebenen Argumenten ist sehr viel kleiner als "normal", AFAIR sinds nur 16 kB statt der üblichen 256. Sei also etwas vorsichtig beim FileNameGlobbing etc., arbeite lieber mit find/xargs Konstrukten oder zB den etwas dämlichen "echo $x|while read; do..." Schleifen wenn du grössere Objektmengen oder Textmonster abarbeiten willst.
Und TESTE DEIN SKRIPT
IMMER SEHR SORGFÄLTIG
OHNE ADMINPRIVILEGIEN AUS bevor du den Modifier für die Privilegien ergänzt und ihn erstmals benutzt. Es ist SEHR GEFÄHRLICH ein Skript als root rennen zu lassen, das aufgrund solcher Textmengenbeschränkungen vollkommen unerwartet nur zur Hälfte an die Shell übergeben wird und dadurch verstümmelte, d.h. fehlerhafte Befehle enthält. WAS IM TERMINAL FEHLERFREI FUNKTIONIERT TUT ES HIER NICHT AUTOMATISCH AUCH!!!
Ich schreib das nur so fett weil ich es selber auch schon geschafft hab damit ganz "auf blöd" eine wahre Nemesis zu erleben. Ein Löschbefehl der eigentlich über "/Volumes/irgend/was/viel/zu/langes" laufen soillte hat es nur noch bis zum "/Volumes" geschafft, der Rest der Zeile und alles danach wurde abgeschnitten. Kannst du dir wohl denken was dann passiert ist... :-c :-c :-c :-c
Wenn du richtig "massive" Dinge bauen willst die in einem Interpreter laufen sollen und du brauchst Admin-Privilegien, solttest du dich tiefer einlesen in die Funktionsweise von "launchd", und in die ausführlichen Beschreibungen auf Apples Developersite zum Thema "Authentication, Authorization and Privileges".
Wenn du das alles schön befolgst wird es dir gelingen eine App zu basteln, bei der man nur genau ein einziges mal bei der ersten Inbetriebnahme nach der Installation ein Kennwort anzugeben hat, und danach nie wieder. Ich nehme mal an du kennst schon irgendwelche Programme die dich in dieser Situation darum bitten, eine "Sicherheitskomponente" aktivieren zu dürfen. Wunderschön gut gemachte Anschauungsbeispiele hierfür sind die Systemtools von Marcel Bresink (u.a. "TinkerTool System") oder die Editoren "TextWrangler" oder "BBEdit" von BareBones. Falls du also mal nach den Sternen greifst: Join
this train, lass den Rest ohne dich losfahren.