Wiese geht dieses Apple Script nicht? Tipp?

burning_angel

Golden Delicious
Registriert
07.01.08
Beiträge
8
Hi,

Folgendes Apple Script funktioniert nicht. Es bleibt bei der Volume benennung "NO NAME" (das ist ein USB Stick der so heißt und den ich auch sehr ungern unbenennen möchte) hängen.
Weiß jemand eine Lösung?
Im endeffekt will ich nur einen Terminal befehl mit einem einzelnen klick ausführen, ohne das mühsam ins Terminal einfügen/eintippen zu müssen.

Code:
tell application "terminal"
do script "find -x "/Volumes/NO NAME" -type f -iname '*.jpg' -exec cp -i {} "/Users/blabla/Desktop/NeuerOrdner/" \;"
 end tell

gruß
burning_angel
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Was mir spontan einfaellt. Es lautet:

Code:
do shell script

Ausserdem koennten die " problematisch werden. Vielleicht aussenrum Einfachquotes(') und innerhalb des Befehls dann Doppelquotes(")...Oder irgendwie sowas...

Code:
do script "find -x "/Volumes/NO NAME" -type f -iname '*.jpg' -exec cp -i {} "/Users/blabla/Desktop/NeuerOrdner/" \;"
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Hallo,

Was mir spontan einfaellt. Es lautet:
Nein, das ist nicht korrekt.

Terminal und do shell script haben zunächst nichts gemeinsam.
Da werden leider immer viele Verwechslungen in Kombination gebracht.

Es heißt einfach (ohne Terminal!):
Code:
-- Zielordner angeben
set zielOrdner to POSIX path of (choose folder)

-- Shell Anweisung
do shell script "find " & quoted form of zielOrdner


Ausserdem koennten die " problematisch werden. Vielleicht aussenrum Einfachquotes(') und innerhalb des Befehls dann Doppelquotes(")...
Gänsefüsse halten nur die Chinesen für essbar

Generell sollte immer "quoted form" verwendet werden.

Für Dein Skript bitte selbst anpassen.

Viele Grüße
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Nein, das ist nicht korrekt.
Äääähem.

Das funktioniert schneller, zuverlässiger und eleganter als alles was du mit der strunzdoofen (weil absurd kryptischen) OSAskript-Kindergartennotation zusammenzunageln imstande bist.
Selbst kilometerlange Shellskripten mit 10000 Zeilen Code jage ich so ein einziges mal durch 'sed' und in 0,05 Sekunden ist es ein funktionierendes UND immer noch lesbares OSA-Skript.
Das deiner "Lehrbuchlösung" in Sachen Ablaufgeschwindigkeit um *Lichtjahre* überlegen ist, wohlgemerkt.

Studenten, bitte hinsetzen.
Danke sehr.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Werter Rastafari,

was möchtest Du mir bzw. dem Forum sagen?
Das Du die Dokumentation nicht gelesen hast?

Wir kehren zur Ausgangssituation zurück:

- burning_angel schreibt "terminal" mit "do script"
- Zettt schreibt, dass es "do shell script" lauten soll

Daraus schließt burning_angel jetzt, dass es so heißt

Code:
tell application "terminal"
do shell script
 end tell

... und das ist einfach nur falsch.

Die Dokumentation sagt:

Code:
do script v : Runs a UNIX shell script or command.
do script [text] : The command to execute.
[in tab, window, or any] : The tab in which to execute the command
→ tab : The tab the command was executed in.

Wo der Unterschied ist erkläre ich euch Profis nicht.

Rastafari, das war ziemlich daneben und Du solltest Dich entschuldigen.
Mehr als neunmalkluges Geschwätz war das nicht.
Du brauchst Dich mir und anderen gegenüber nicht behaupten und etablieren.
Wer mit dummen ringt, der kann schließlich keine großen Ziele erreichen ;)

Studenten, bitte hinsetzen.
Auf Grund der Fakten würde ich sagen, dass das ziemlich kontraproduktiv war und Du jetzt wohl den Studentepeter zugeschoben bekommen hast.
Ich finde Deine Arroganz einfach fehlplatziert.

Viele Grüße
 
  • Like
Reaktionen: MacApple

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Code:
tell application "terminal"
do shell script
 end tell
... und das ist einfach nur falsch.
Ach das meintest du?
Na da hast du natürlich recht, in einen Tell-Block gehört das natürlich nicht.
Dann brauchst du dich nicht angesprochen fühlen. Das las sich für mich so, als wärst du mit der verlinkten Erklärung nicht einverstanden.

Was dir allerdings am maskieren von Sonderzeichen nicht gefällt würde mich schon mal interessieren. Hierfür die Verwendung von (als provisorischer Workaround eingeführten) hergeleiteten AS-Konstrukten ("quoted form of POSIX..." et al) zu empfehlen ist sowas von grotesk, dass mir die Worte fehlen. Das habe ich sicher nur missverstanden, oder? Das hast du nicht wirklich gemeint und bist dann trotzdem stehen geblieben, nicht wahr?
 

burning_angel

Golden Delicious
Registriert
07.01.08
Beiträge
8
erstmal vielen dank für euer engagement, aber so richtig werde ich als anfänger nicht aus eurer Diskussion schlau.
Könntet ihr mir nochmal bitte den "richtigen" Apple Script Code Posten, den ich einsetzen muss, damit die Funktionalität der Befehlsfolge im Terminal bleibt, das aber als Apple Script funktioniert?

dankeschön und viele grüße
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
:eek:
Code:
[SIZE="-1"]tell app "Terminal"
    do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
end tell
[COLOR="DarkSlateGray"]--alternativ geht auch (bei einem Einzeiler)[/COLOR]
tell app "Terminal" to do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
[/SIZE]
Nur eins verstehe ich nicht so ganz...
Der Befehl wird ein neues Terminal-Fenster aufschlagen und dort die Suche durchführen.
Gibts irgendeinen besonderen Grund, warum du das alles nicht gleich sowieso dort erledigst?
 

CloneOfMyself

Weigelts Zinszahler (Rotfranch)
Registriert
24.02.07
Beiträge
253
ich gebe littel_pixel schon recht mit der "quoted form". Man denke nur an Dateinamen, die so ziemlich alles enthalten könnten. Und sie berücksichtig eben auch single quotes. Oder wärst Du darauf gekommen und hättest Lust sowas zu maskieren:

quoted form of "Halli\"Hallö\"Huhu'Haha"
--> "'Halli\"Hallö\"Huhu'\\''Haha'"

und wenn der dateiname eben aus variablen kommt und nicht statisch ist, dann hat man eben keine chance selbst alles richtig zu maskieren. da bleibt eigentlich nur quoted form of, da nur diese form alles richtig maskiert.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.358
Hallo! :)

Da schließe ich mich doch glatt an! Ohne "quoted form of" wäre AS wesentlich aufwändiger, denn wenn man mit Variablen arbeitet, so ist das der einfachste und sicherste Weg (Siehe das Beispielscript von Little Pixel)

Ausserdem ist das ja nicht eine Erfindung von AS. Wenn ich mal in das hier gepostete shell script schaue, so sehe ich doch schon im dem Original solche quotes :-*

Wenn man sie richtig einsetzt, sind sie doch genauso sicher wie Maskierungen, oder etwa doch nicht?

Also @ burning_angel:
In deinem Fall würde dein Original-Skript nicht ohne die Gänsefüsschen funktionieren, da das Leerzeichen im Pfad nicht maskiert ist.
Die Frage von Rastafari ist zwar berechtigt, aber Du möchtest dir ja das tippen ersparen. Du merkst aber, dass die Variante, dein Skript in einem AS zu kompilieren, zusätzlichen Aufwand erfordert.
Um sich "das Tippen zu ersparen", nimmt man deshalb eigentlich einen anderen Weg und erstellt sich ein "ausführbares Skript".

Man speichert das Skript in einer reinen Textdatei und macht diese mit dem Kommando ausführbar:
Code:
chmod +x Pfad/zur/Datei
Um quotes zu vermeiden :p , ziehe den Pfad ins Terminalfenster

Sedna
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Oder wärst Du darauf gekommen und hättest Lust sowas zu maskieren:
quoted form of "Halli\"Hallö\"Huhu'Haha"
--> "'Halli\"Hallö\"Huhu'\\''Haha'"
1) Solche Querulanten sind *immer* ein Problem, egal wo und wie du sie eingeben musst.
2) Auch in bash gibts sowas wie "gib mich mal die name von...", weisst du?
3) \"\"Halli\\\"Hallö\\\"Huhu\\'Haha\"\"
Die Regel ist furchtbar simpel:
JEDEN Namen für die Shell immer nur in Gänsefüsschen übergeben.
(Falls nicht schon längst geschehen, ganz normal anfügen)
Dann vor jeden Backslash und vor jedes Gänsefüsschen einen Backslash, sowie vor einfachen Quotes zwei davon. Und Fertig. So what?

Und fang jetzt nicht wieder mit den "unüblichen Zeichen" an, sonst nenne ich dir mal Namen die in AS-Befehlen unter keinen Umständen funktionieren (hoffentlich frisst das das Forum...?):
Das¬ist¬ein@solcher
Icon^r <--- authentischer Mac OS Name!!
_kill^n me^g if ^hyou can^r^n
# Das hier zeigt die Forensoft sonst nicht an,
# der rote Strich ist ein "Non-breaking Space".
# Die Caret-Darstellung bezeichnet <CR>,<LF>,<Backspace> bzw <BELL>

Und weisst du was? Die hab ich noch alle irgendwie kleingekriegt.
Besonders lustig finde ich übrigens Dateinamen, die bestimmten URL-Schemata entsprechen.
Da kannst du richtig Gaudi haben mit AS (köstlich!)
Schön, wenn beim öffnen einer Datei (haha!) plötzlich der Browser aufpoppt...

Und die Krönung sind Dateinamen, die "rein zufällig" die Bezeichnung des AppleEvents für "kOSAScript:SocketDisconnect" sind. Programmende, finito.
Vergleichbar etwa einem "kill -SIGTERM" an die bash gesendet, den 32-bit Code dafür weiss ich leider nicht mehr aus dem effeff. AppleScript ist so dämlich, das zu fressen und ein "Signal" an sich selber zu schicken: "Stirb, du... huch, das bin ja ICH!" :)

Sonst noch absurde Sonderfälle vorzuschlagen?

und wenn der dateiname eben aus variablen kommt und nicht statisch ist, dann hat man eben keine chance selbst alles richtig zu maskieren.
Darum bevorzuge ich ja das komplette arbeiten mit Stringvariablen in der Shell.
Packst'se einfach in " " --> und bingo

da nur diese form alles richtig maskiert.
Die Form maskiert nur das was du eingibst.
Jetzt musst du aber im Skripteditor ja den Text auch schon mit Maskierung eingeben... hmm.
 

CloneOfMyself

Weigelts Zinszahler (Rotfranch)
Registriert
24.02.07
Beiträge
253
Es ist ja jetzt ein wenig OT, aber was soll's. Ich kann deine Aufgeregtheit im Moment auch nicht so ganz nachvollziehen. Es ging ja um die Verbindung zwischen shell und Applescript. Und da ist die quoted form of posix path of ... insbesondere im Umgang mit Dateien einem eigenen Gequote vorzuziehen, zumal, wie bereits gesagt, es bei der Übergabe von Pfaden aus AS-Variablen heraus gar nicht möglich ist, die Maskierung selbst vorzunehmen. Und die quoted form of... ist da eine sehr galante und zuverlässige Methode, die man sich deshalb besser gleich generell innerhalb von Applescript aneignen sollte.
Nur eines deiner Beispiele:
set x to choose file
quoted form of POSIX path of x --> "'/Das¬ist¬ein@solcher'"
do shell script "mv " & quoted form of (POSIX path of x) & space & "Ein_ganz_normaler_Name"
Funktioniert tadellos...
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Funktioniert tadellos...
Das Zeichen ¬ geht, ja. Aber nicht das was da stand bevor du es per Latin-1 Darstellung im Browser betrachtet hast. Ich kanns leider hier nicht sichtbar machen, habs versucht per SGML-Entity in den Text einzubauen, hat aber leider nicht geklappt. (Forendarstellungen sind halt auch limitiert)

Wie eine Sprache, die zur Übergabe NUL-terminierte Strings benutzt, ausgerechnet das "canonical decomposite" Unicode-Äquivalent von NUL übertragen können soll, bleibt jedenfalls das Geheimnis von Merlin oder Houdini. Es kann nicht gehen. Die Shell kanns übrigens auch nur mit Extremtricks (literale Anzeige im Terminal ist nicht möglich), aber der Dateiname ist dennoch völlig legal. Apple setzt diesen Trick selbst zwei mal auf deinem Startvolume ein, um zwei essentielle Metadatenordner des Dateisystems vor dir zu verbergen.
Zeig mir mal, wie du mit deiner Formel die Ordner...
"/<NUL><NUL><NUL><NUL>HFS+ Private Data"
"/<NUL><NUL><NUL><NUL>HFS+ Private Directory Data"
...sichtbar machst. (Sie sind immer da, auf jedem Volume.)
Und dann verrate ich dir, wie es mit konventioneller Maskierung eben doch geht. :)
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
1) Solche Querulanten sind *immer* ein Problem, egal wo und wie du sie eingeben musst.
2) Auch in bash gibts sowas wie "gib mich mal die name von...", weisst du?
3) \"\"Halli\\\"Hallö\\\"Huhu\\'Haha\"\"
Die Regel ist furchtbar simpel:
JEDEN Namen für die Shell immer nur in Gänsefüsschen übergeben.
(Falls nicht schon längst geschehen, ganz normal anfügen)
Dann vor jeden Backslash und vor jedes Gänsefüsschen einen Backslash, sowie vor einfachen Quotes zwei davon. Und Fertig. So what?

Und fang jetzt nicht wieder mit den "unüblichen Zeichen" an, sonst nenne ich dir mal Namen die in AS-Befehlen unter keinen Umständen funktionieren (hoffentlich frisst das das Forum...?):
Das¬ist¬ein@solcher
Icon^r <--- authentischer Mac OS Name!!
_kill^n me^g if ^hyou can^r^n
# Das hier zeigt die Forensoft sonst nicht an,
# der rote Strich ist ein "Non-breaking Space".
# Die Caret-Darstellung bezeichnet <CR>,<LF>,<Backspace> bzw <BELL>

Und weisst du was? Die hab ich noch alle irgendwie kleingekriegt.
Besonders lustig finde ich übrigens Dateinamen, die bestimmten URL-Schemata entsprechen.
Da kannst du richtig Gaudi haben mit AS (köstlich!)
Schön, wenn beim öffnen einer Datei (haha!) plötzlich der Browser aufpoppt...

Und die Krönung sind Dateinamen, die "rein zufällig" die Bezeichnung des AppleEvents für "kOSAScript:SocketDisconnect" sind. Programmende, finito.
Vergleichbar etwa einem "kill -SIGTERM" an die bash gesendet, den 32-bit Code dafür weiss ich leider nicht mehr aus dem effeff. AppleScript ist so dämlich, das zu fressen und ein "Signal" an sich selber zu schicken: "Stirb, du... huch, das bin ja ICH!" :)

Sonst noch absurde Sonderfälle vorzuschlagen?


Darum bevorzuge ich ja das komplette arbeiten mit Stringvariablen in der Shell.
Packst'se einfach in " " --> und bingo


Die Form maskiert nur das was du eingibst.
Jetzt musst du aber im Skripteditor ja den Text auch schon mit Maskierung eingeben... hmm.
Die meisten Entwickler wollen indessen keinen Krieg führen, sondern ein Problem lösen.

Aber hey, scheiß drauf: Wenn es der Brustbehaarung dient, alle irgendwie kleinzukriegen …
 

burning_angel

Golden Delicious
Registriert
07.01.08
Beiträge
8
:eek:
Code:
[SIZE=-1]tell app "Terminal"
    do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
end tell
[COLOR=DarkSlateGray]--alternativ geht auch (bei einem Einzeiler)[/COLOR]
tell app "Terminal" to do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
[/SIZE]
Nur eins verstehe ich nicht so ganz...
Der Befehl wird ein neues Terminal-Fenster aufschlagen und dort die Suche durchführen.
Gibts irgendeinen besonderen Grund, warum du das alles nicht gleich sowieso dort erledigst?

der grund ist komfort ;)

kann man eigentlich noch an die befehlsfolge einen befehl dranhägen, so dass das terminal nach erfolgreicher ausfühurng gleich wieder geschlossen wird?