AppleScript vs. Bash script?


13

Sono un "power user" di lunga data di Windows e sviluppatore che ha recentemente deciso di passare a Mac OS X.

Su OS X Lion e sulle versioni precedenti sembrano esserci due opzioni principali per lo scripting e l'automazione in OS X: AppleScript e Bash script. Quest'ultimo è ovviamente una conseguenza diretta dell'OS X che utilizza la shell "bash" di Unix, mentre il primo è l'innovazione di Apple. Le sintassi sono chiaramente molto diverse, con AppleScript che ha uno stile di linguaggio pseudo-naturale.

La mia domanda è: sono gli script AppleScript e Bash comunemente usati (anzi, dovrebbero essere usati) per compiti e scopi diversi su OS X. Sono vagamente a conoscenza della vasta gamma di attività che posso svolgere con lo script Bash, anche se ovviamente il codice per alcuni più avanzati possono rapidamente contorcersi. Questi due linguaggi hanno casi d'uso sovrapposti o quasi identici, nonostante la successiva invenzione di AppleScript di Apple - o sono pensati per essere utilizzati con diversi scenari in mente? Una panoramica di alto livello e alcuni esempi specifici sarebbero apprezzati.


Se hai attività correlate a file e cartelle acquista "Hazel", è uno strumento molto potente basato su regole molto utile. Può anche lanciare script di shell e script di apples basati su regole.
Stuart Woodward,

Risposte:


17

Entrambi gli script Shell e Apple possono essere utilizzati praticamente ovunque sia appropriato.

Gli AppleScript funzionano meglio quando si parla con app e strutture di sistema a livello di utente. (Ad esempio, puoi dire tell app "iTunes" to playe lo farà, o tell app "Finder" to open the first file of the second window.)

Gli script di shell (a cui hai fatto riferimento bash) funzionano meglio quando si parla di oggetti di sistema di basso livello e cose Unixy.

Sono entrambi interoperabili: puoi chiamare un comando shell da AppleScript con do shell script "command here"e puoi chiamare il codice AppleScript dalla shell con osascript -e "AppleScript". Inoltre, c'è un po 'di sovrapposizione tra i due (specialmente quando si tratta di operazioni sul file system).

Esistono sicuramente più risorse per l'apprendimento dello scripting shell online di AppleScript e non aiuta che AppleScript abbia la reputazione di essere un linguaggio di "sola lettura" (cioè più difficile da scrivere che da leggere).

In ogni caso, il modo più moderno di fare scripting è con Automator, dove è possibile utilizzare shell o AppleScript (o entrambi) insieme a moduli predefiniti da varie app installate.


Grazie; questa è una panoramica molto istruttiva. Hai qualche consiglio per buone risorse di apprendimento su AppleScript? (Anche sceneggiatura Bash, anche se probabilmente sono riuscito a trovarle abbastanza facilmente da solo.)
Noldorin,

3
AppleScript ha una reputazione (un po 'guadagnata) per essere di sola lettura; Gli script Shell a volte si inclinano verso l'estremità "sola scrittura" dello spettro.
Daniel

@Noldorin Ho comprato un libro per imparare AppleScript, ma tendo a usare Google per primo e l'indice del libro per secondo quando sto cercando di ricordare la sintassi di un particolare comando.
Cajunluke,

@CajunLuke: Ah, abbastanza giusto. Come hai imparato AppleScript per la prima volta però ??
Noldorin,

@Noldorin Praticamente tentativi ed errori e Google. Per Google alcune cose sono difficili, quindi è per questo che ho comprato il libro.
Cajunluke,

8

Mentre entrambi i contesti di scripting possono fare qualsiasi cosa l'altro (poiché gli script di shell possono chiamare /usr/bin/osascriptper invocare un AppleScript e AppleScript ha il do shell scriptcomando), ci sono davvero contesti per i quali uno è più adatto dell'altro.

Entrambi i linguaggi di scripting sono linguaggi "collanti": possono fare autonomamente cose minime e invece svolgono la maggior parte dei loro compiti invocando le capacità di altri programmi. Gli script Shell fanno uso di pipe Unix, mentre AppleScript ha la tell applicationsintassi.

Il punto in cui divergono è che gli script Apple comunicano direttamente con le applicazioni di script (quasi sempre applicazioni GUI), mentre gli script di shell comunicano principalmente con i programmi della riga di comando (alcuni dei quali possono invocare interfacce utente grafiche, ma molti non lo fanno).

Quando si tratta di attività di gestione dei file, entrambi gli approcci possono funzionare. È possibile Tell Application Findercopiare file o eseguire il cpcomando in uno script di shell. Quindi perché usarne uno sopra l'altro? Certamente alcuni sceneggiatori hanno più familiarità con una lingua rispetto all'altra, e quindi preferiranno usare questo strumento. Ma una migliore considerazione è dell'utente dello script. AppleScript può spesso essere richiamato dalla GUI del Mac: facendo doppio clic su un'applicazione AppleScript o rilasciando i file su una o utilizzando un menu AppleScript a livello di sistema o all'interno di un determinato programma. Programmi come Mail possono essere impostati per eseguire un AppleScript sui messaggi in arrivo per filtrarli. Per gli utenti abituati a utilizzare i Mac in un modo "simile a un Mac" (cioè dalla GUI), gli AppleScript sono spesso più accessibili.

Gli script Shell spesso (ma non sempre) vivono nel Terminale. Se uno sta già utilizzando Terminal, eseguire uno script shell può essere più conveniente che invocare un AppleScript. D'altra parte, molti utenti sono scoraggiati dal fatto di dover digitare i comandi in una finestra di Terminale o persino di fare clic su un file di script che apre una finestra di Terminale per fare la sua magia. Personalmente trovo che la sintassi degli script della shell sia più leggibile di quella degli script Apple, ma sospetto di essere in minoranza su quello. Gli script Shell sono familiari agli utenti di molti sistemi simili a Unix.

In ogni caso, entrambi sono potenti strumenti per ottenere un migliore controllo sul tuo Mac.


Grazie; questo certamente chiarisce la questione e conferma alcuni dei miei sospetti.
Noldorin,

Immagino che Tell Application Finderper copiare i file si aprirà una finestra con una barra di avanzamento visibile, mentre cpnon lo farà. È giusto?
TRiG

4

Le altre risposte offrono una panoramica di alto livello dell'intenzione alla base di queste due tecniche di scripting. Forse ti darò solo esempi di come li uso.

Con Applescript, ho creato regole di elaborazione per Mail, collegato BBEdit a R per l'elaborazione statistica, creato complesse azioni cartella e fatto una riorganizzazione basata sul tempo delle mie foto in iPhoto e Aperture. Ho anche creato mini-app con pulsanti e display di testo. Fondamentalmente, si tratta della manipolazione automatica di app complesse con GUI.

Con lo scripting Bash, ho creato routine automatiche di elaborazione delle immagini con Imagemagick, routine di elaborazione PDF con Ghostscript, routine di data e ora e molte elaborazioni di testo con Bash, sed / awk e Perl. Le utility Unix tendono ad essere snelle, veloci e flessibili e Bash è un ottimo modo per combinarle in strumenti molto potenti e facili.

A volte chiamo script Bash da all'interno di un Applescript, di solito per scopi di elaborazione del testo (GREP) o per il recupero di siti Web leggeri (arricciatura). Uso quasi sempre questa tecnica per ottenere un po 'di dati o una variabile da usare ulteriormente nel mio Applescript.


Ah, questi esempi specifici sono piuttosto utili. Grazie per questo. A proposito, hai qualche risorsa di apprendimento suggerita per AppleScript? Per un principiante completo. (Ho usato un po 'di script Bash in passato e probabilmente posso impararlo di nuovo da solo.)
Noldorin,

2
Sì, il libro di cui ho maggiormente beneficiato è stato "AppleScript: The Definitive Guide" di Matt Neuberg. La documentazione per gli sviluppatori di Apple è ok e vale la pena di consultarla come riferimento, ma il libro di Neuberg valuta onestamente sia i punti di forza che i punti deboli della lingua. Scoprirai che l'insistenza di Applescript sulla grammatica "naturale" non è molto naturale e in molti casi sarà controintuitiva. Neuberg chiarisce quando ciò accade e perché.
Ash,

Questa è esattamente l'impressione che ho avuto inizialmente guardando la lingua. Questa casa a metà strada tra macchina e linguaggi naturali sembra piuttosto imbarazzante. Saluti per la raccomandazione!
Noldorin,

3

Potrebbe essere un'eccessiva semplificazione, ma lo scripting della shell serve a combinare i programmi esistenti per eseguire nuove attività mentre AppleScript deve controllare (principalmente la GUI) le applicazioni in remoto. I programmi Unix classici in genere leggono alcuni input e producono output e script di shell consentono di combinarli. AppleScript è per automatizzare le applicazioni della GUI.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.