Skrypt AppleScript vs. Bash?

13

Jestem wieloletnim „zaawansowanym użytkownikiem” systemu Windows i programistą, który niedawno zdecydował się przejść na system Mac OS X.

W OS X Lion i rzeczywiście w poprzednich wersjach wydają się istnieć dwie główne opcje skryptów i automatyzacji w OS X: AppleScript i Bash. To drugie jest oczywiście bezpośrednią konsekwencją OS X używającego uniksowej powłoki „bash”, podczas gdy ta druga jest własną innowacją Apple. Składnie są wyraźnie bardzo różne, a AppleScript ma styl pseudo-naturalny.

Moje pytanie brzmi: czy skrypty AppleScript i Bash są powszechnie używane (a nawet powinny być używane) do różnych zadań i celów w systemie OS X. Jestem niejasno świadomy szerokiego zakresu zadań, które mogę wykonać za pomocą skryptu Bash, choć oczywiście kod dla niektórych bardziej zaawansowanych mogą się szybko zawinąć. Czy te dwa języki mają nakładające się lub prawie identyczne przypadki użycia, pomimo późniejszego wynalezienia AppleScript przez AppleScript - czy też są przeznaczone do użycia w różnych scenariuszach? Doceniony zostanie przegląd ogólny, a także niektóre konkretne przykłady.

Noldorin
źródło
Jeśli masz zadania związane z plikami i folderami, kup „Hazel”, jest to naprawdę potężne narzędzie oparte na regułach, które jest bardzo przydatne. Może także kopać skrypty powłoki i Applescripts na podstawie reguł.
Stuart Woodward,

Odpowiedzi:

17

Zarówno shell, jak i AppleScripts mogą być używane niemal wszędzie, gdzie jest to właściwe.

Skrypty AppleScript działają lepiej podczas rozmowy z aplikacjami i urządzeniami systemowymi na poziomie użytkownika. (Na przykład możesz powiedzieć tell app "iTunes" to playi to zrobi lub tell app "Finder" to open the first file of the second window.)

Skrypty powłoki (mówiłeś o bash) działają lepiej, gdy rozmawiasz z obiektami systemowymi niskiego poziomu i uniksowymi rzeczami.

Oba są interoperacyjne: możesz wywołać polecenie powłoki z AppleScript za pomocą do shell script "command here"i możesz wywołać kod AppleScript z powłoki za pomocą osascript -e "AppleScript". Co więcej, oba elementy nakładają się na siebie (szczególnie jeśli chodzi o operacje systemu plików).

Z pewnością jest więcej zasobów do nauki skryptów powłoki online niż AppleScript i nie pomaga to, że AppleScript ma reputację języka „tylko do odczytu” (tj. Trudniej pisać niż czytać).

W każdym razie najnowocześniejszym sposobem wykonywania skryptów jest Automator, w którym można używać powłoki Shell lub AppleScripting (lub obu) wraz z gotowymi modułami z różnych zainstalowanych aplikacji.

Cajunluke
źródło
Dzięki; to bardzo pouczający przegląd. Czy masz jakieś zalecenia dotyczące dobrych zasobów edukacyjnych na temat możliwości AppleScript? (Również skrypt Bash, chociaż prawdopodobnie sam mogłem łatwo je znaleźć).
Noldorin
3
AppleScript ma (nieco zasłużoną) reputację tylko do odczytu; Skrypty powłoki czasami skłaniają się ku końcowi spektrum „tylko do zapisu”.
Daniel
@Noldorin Kupiłem książkę, aby nauczyć się AppleScript, ale zwykle staram się używać Google, a indeks książki jako drugi, gdy próbuję zapamiętać składnię określonego polecenia.
Cajunluke
@CajunLuke: Ach, w porządku. Jak nauczyłeś się AppleScript po raz pierwszy?
Noldorin
@Noldorin Dość dużo prób i błędów oraz Google. Niektóre rzeczy są trudne dla Google, dlatego kupiłem książkę.
Cajunluke
8

Chociaż oba konteksty skryptowe mogą zrobić wszystko, co inne (ponieważ skrypty powłoki mogą wywoływać w /usr/bin/osascriptcelu wywołania AppleScript, a AppleScript ma do shell scriptpolecenie), istnieją jednak konteksty, dla których jeden jest bardziej odpowiedni niż drugi.

Oba języki skryptowe są językami „kleju” - potrafią same robić minimalne czynności i zamiast tego realizują większość swoich zadań, przywołując możliwości innych programów. Skrypty powłoki używają potoków uniksowych, a AppleScript ma tell applicationskładnię.

Różnią się tym, że skrypty AppleScript komunikują się bezpośrednio z aplikacjami skryptowymi (prawie zawsze aplikacjami GUI), podczas gdy skrypty powłoki komunikują się przede wszystkim z programami wiersza poleceń (niektóre z nich mogą wywoływać graficzne interfejsy użytkownika, ale wiele nie.

Jeśli chodzi o zadania zarządzania plikami, oba podejścia mogą działać. Można Tell Application Finderskopiować pliki lub uruchomić cppolecenie w skrypcie powłoki. Po co więc stosować jeden na drugim? Z pewnością niektórzy pisarze skryptów lepiej znają jeden język niż drugi i dlatego wolą korzystać z tego narzędzia. Ale lepiej wziąć pod uwagę użytkownika skryptu. AppleScript często można wywoływać z graficznego interfejsu użytkownika Maca: dwukrotne kliknięcie aplikacji AppleScript, upuszczenie plików na jeden lub użycie menu AppleScript w całym systemie lub w określonym programie. Programy takie jak Mail można skonfigurować tak, aby uruchamiały AppleScript na przychodzących wiadomościach w celu ich filtrowania. Dla użytkowników przyzwyczajonych do korzystania z komputerów Mac w sposób podobny do komputera Mac (tj. Z GUI), skrypty AppleScript są często bardziej dostępne.

Skrypty powłoki często (ale nie zawsze) znajdują się w terminalu. Jeśli ktoś już korzysta z terminalu, uruchomienie skryptu powłoki może być wygodniejsze niż wywołanie AppleScript. Z drugiej strony wielu użytkowników jest zniechęconych koniecznością wpisywania poleceń w oknie terminala lub nawet kliknięciem pliku skryptu, który otwiera okno terminala, aby wykonać swoją magię. Osobiście uważam, że składnia skryptów powłoki jest bardziej czytelna niż w skryptach AppleScript, ale podejrzewam, że jestem w tej mniejszości. Skrypty powłoki znane użytkownikom wielu różnych systemów uniksowych.

W każdym razie oba są potężnymi narzędziami do uzyskania lepszej kontroli nad komputerem Mac.

Daniel
źródło
Dziękuję Ci; to z pewnością wyjaśnia sprawę i potwierdza niektóre z moich podejrzeń.
Noldorin
Zgaduję, że Tell Application Finderaby skopiować pliki otworzy okno z widocznym paskiem postępu, a cpnie zrobi tego. Czy to prawda?
TRiG
4

Pozostałe odpowiedzi dają świetne ogólne omówienie intencji tych dwóch technik skryptowych. Może dam ci tylko przykłady tego, jak z nich korzystam.

W Applescript stworzyłem reguły przetwarzania poczty, podłączyłem BBEdit do R do przetwarzania statystycznego, utworzyłem złożone akcje folderów i przeprowadziłem masową reorganizację moich zdjęć w iPhoto i Aperture. Stworzyłem również mini-aplikacje z przyciskami i wyświetlaczami tekstowymi. Zasadniczo jest to automatyczna manipulacja złożonymi aplikacjami za pomocą GUI.

Za pomocą skryptów Bash stworzyłem procedury automatycznego przetwarzania obrazu za pomocą Imagemagick, procedury przetwarzania plików PDF za pomocą Ghostscript, procedury czasu i daty oraz mnóstwo przetwarzania tekstu za pomocą Bash, sed / awk i Perl. Narzędzia uniksowe wydają się być szczupłe, szybkie i elastyczne, a Bash to świetny sposób na połączenie ich w bardzo potężne, łatwe w użyciu narzędzia.

Czasami wywołuję skrypty Bash z poziomu Applescript, zwykle w celu przetwarzania tekstu (GREP) lub do lekkiego pobierania strony (curl). Prawie zawsze używam tej techniki, aby uzyskać trochę danych lub zmiennej do dalszego wykorzystania w moim Applescript.

Popiół
źródło
Ach, te konkretne przykłady są raczej pomocne. Dzięki za to. Nawiasem mówiąc, czy masz jakieś sugerowane zasoby edukacyjne do AppleScript? Dla kompletnego początkującego. (W przeszłości używałem małego skryptu Bash i prawdopodobnie mogę go ponownie nauczyć.)
Noldorin
2
Tak, książka, z której najbardziej skorzystałem, to „AppleScript: The Definitive Guide” Matta Neuberga. Dokumentacja programistów Apple jest w porządku i warto zapoznać się z nią w celach informacyjnych, ale książka Neuberga całkiem uczciwie ocenia zarówno mocne, jak i słabe strony języka. Przekonasz się, że nacisk Applescript na „naturalną” gramatykę nie jest zbyt naturalny, aw wielu przypadkach będzie sprzeczny z intuicją. Neuberg wyjaśnia, kiedy to się dzieje i dlaczego.
Ash
Właśnie takie wrażenie wywarłem z początkowego spojrzenia na język. Dom w połowie drogi między językiem maszynowym a językiem naturalnym wydaje się raczej niezręczny. Pozdrawiam za rekomendację!
Noldorin
3

Może to być nadmierne uproszczenie, ale skrypty powłoki służą do łączenia istniejących programów w celu wykonywania nowych zadań, podczas gdy AppleScript ma zdalne sterowanie aplikacjami (głównie GUI). Klasyczne programy uniksowe zwykle czytają niektóre dane wejściowe i wytwarzają dane wyjściowe, a skrypty powłoki pozwalają je łączyć. AppleScript ma zautomatyzować aplikacje GUI.

lhf
źródło