¿Script AppleScript vs. Bash?

13

Soy un "usuario avanzado" y desarrollador de Windows desde hace mucho tiempo que recientemente decidió cambiar a Mac OS X.

En OS X Lion y, de hecho, en versiones anteriores, parece haber dos opciones principales para la creación de scripts y la automatización en OS X: AppleScript y Bash. Este último es, por supuesto, una consecuencia directa de que OS X use el shell "bash" de Unix, mientras que el primero es la innovación de Apple. Las sintaxis son claramente muy diferentes, ya que AppleScript tiene un estilo de lenguaje pseudo-natural.

Mi pregunta es, ¿se usan comúnmente AppleScript y Bash script (de hecho, deberían usarse) para tareas y propósitos dispares en OS X. Soy vagamente consciente de la gran variedad de tareas que puedo realizar con Bash script, aunque por supuesto el código para algunos más avanzados pueden enredarse rápidamente. ¿Estos dos lenguajes tienen casos de uso superpuestos o casi idénticos, a pesar de la invención posterior de AppleScript de Apple, o están destinados a ser utilizados con diferentes escenarios en mente? Se agradecería una descripción general de alto nivel, así como algunos ejemplos específicos.

Noldorin
fuente
Si tiene tareas relacionadas con archivos y carpetas, compre "Hazel", es una herramienta basada en reglas realmente poderosa que es muy útil. También puede patear scripts de shell y Applescripts basados ​​en reglas.
Stuart Woodward

Respuestas:

17

Tanto el shell como AppleScripts se pueden usar en cualquier lugar, ya sea apropiado.

AppleScripts funciona mejor cuando se habla con aplicaciones e instalaciones del sistema a nivel de usuario. (Por ejemplo, puede decir tell app "iTunes" to playy lo hará, o tell app "Finder" to open the first file of the second window).

Las secuencias de comandos de shell (se refirió a bash) funcionan mejor cuando se habla de objetos de sistema de bajo nivel y cosas de Unixy.

Ambos son interoperables: puede llamar a un comando de shell desde AppleScript con do shell script "command here"y puede llamar al código de AppleScript desde el shell con osascript -e "AppleScript". Además, hay una cierta superposición entre los dos (especialmente cuando se trata de operaciones del sistema de archivos).

Ciertamente, hay más recursos para aprender scripts de shell en línea que AppleScript y no ayuda que AppleScript tenga la reputación de ser un lenguaje de "solo lectura" (es decir, más difícil de escribir que de leer).

En cualquier caso, la forma más moderna de crear secuencias de comandos es con Automator, donde puede utilizar shell o AppleScripting (o ambos) junto con módulos prefabricados de varias aplicaciones que haya instalado.

Cajunluke
fuente
Gracias; Esa es una descripción muy informativa. ¿Tiene alguna recomendación para obtener buenos recursos de aprendizaje sobre la posibilidad de AppleScript? (Bash script también, aunque podría encontrarlos con bastante facilidad probablemente.)
Noldorin
3
AppleScript tiene una reputación (algo ganada) de ser de solo lectura; Las secuencias de comandos de Shell a veces se inclinan hacia el extremo "solo de escritura" del espectro.
Daniel
@Noldorin Compré un libro para aprender AppleScript, pero tiendo a usar Google primero y el índice del libro en segundo lugar cuando intento recordar la sintaxis de un comando en particular.
Cajunluke
@CajunLuke: Ah, bastante justo. ¿Cómo aprendiste AppleScript por primera vez?
Noldorin
@Noldorin Prácticamente prueba y error y Google. Algunas cosas son difíciles para Google, por eso compré el libro.
Cajunluke
8

Si bien cualquiera de los contextos de scripting puede hacer cualquier cosa que el otro pueda hacer (porque los scripts de shell pueden /usr/bin/osascriptinvocar para invocar un AppleScript y AppleScript tiene el do shell scriptcomando), de hecho, hay contextos para los cuales uno es más adecuado que el otro.

Ambos lenguajes de secuencias de comandos son lenguajes de "pegamento": pueden hacer cosas mínimas por sí mismos y, en su lugar, realizar la mayoría de sus tareas invocando las capacidades de otros programas. Los scripts de Shell utilizan tuberías Unix, mientras que AppleScript tiene la tell applicationsintaxis.

Donde divergen es que AppleScripts se comunica directamente con aplicaciones programables (casi siempre aplicaciones GUI), mientras que los scripts de shell se comunican principalmente con programas de línea de comandos (algunos de los cuales pueden invocar interfaces gráficas de usuario, pero muchos no).

Cuando se trata de tareas de administración de archivos, ambos enfoques pueden funcionar. Uno puede Tell Application Findercopiar archivos o ejecutar el cpcomando en un script de shell. Entonces, ¿por qué usar uno sobre el otro? Ciertamente, algunos escritores de guiones están más familiarizados con un idioma que con el otro y, por lo tanto, preferirán usar esa herramienta. Pero una mejor consideración es del usuario del script. AppleScript a menudo se puede invocar desde la GUI de Mac: haciendo doble clic en una aplicación AppleScript, o soltando archivos en una, o usando un menú AppleScript en todo el sistema o dentro de un programa en particular. Se pueden configurar programas como Mail para ejecutar un AppleScript en los mensajes entrantes para filtrarlos. Para los usuarios acostumbrados a usar Macs de forma "similar a Mac" (es decir, desde la GUI), los AppleScripts suelen ser más accesibles.

Los scripts de Shell a menudo (pero no siempre) viven en la Terminal. Si ya está utilizando Terminal, ejecutar un script de shell puede ser más conveniente que invocar un AppleScript. Por otro lado, muchos usuarios se desaniman al tener que escribir comandos en una ventana de Terminal, o incluso hacer clic en un archivo de script que abre una ventana de Terminal para hacer su magia. Personalmente, encuentro que la sintaxis de los scripts de shell es más legible que la de AppleScripts, pero sospecho que soy minoritario en ese sentido. Los scripts de shell son familiares para los usuarios de muchos sistemas diferentes tipo Unix.

En cualquier caso, ambas son herramientas poderosas para obtener un mejor control sobre su Mac.

Daniel
fuente
Gracias; Esto sin duda aclara el asunto y confirma algunas de mis sospechas.
Noldorin
Supongo que Tell Application Finderpara copiar archivos se abrirá una ventana con una barra de progreso visible, mientras cpque no. ¿Está bien?
TRiG
4

Las otras respuestas dan excelentes descripciones de alto nivel de la intención detrás de estas dos técnicas de secuencias de comandos. Tal vez solo te daré ejemplos de cómo los uso.

Con Applescript, hice reglas de procesamiento para Mail, conecté BBEdit a R para procesamiento estadístico, creé acciones complejas de carpeta y realicé una reorganización masiva basada en el tiempo de mis fotos en iPhoto y Aperture. También he creado mini aplicaciones con botones y pantallas de texto. Básicamente, esta es la manipulación automática de aplicaciones complejas con GUI.

Con las secuencias de comandos Bash, he creado rutinas automáticas de procesamiento de imágenes con Imagemagick, rutinas de procesamiento de PDF con Ghostscript, rutinas de hora y fecha, y mucho procesamiento de texto con Bash, sed / awk y Perl. Las utilidades de Unix tienden a ser esbeltas, rápidas y flexibles, y Bash es una excelente manera de combinarlas en herramientas muy potentes y fáciles.

A veces llamo a los scripts de Bash desde un Applescript, generalmente para fines de procesamiento de texto (GREP) o para buscar sitios web (curl). Casi siempre uso esta técnica para obtener un poco de datos o una variable para usar más en mi Applescript.

Ceniza
fuente
Ah, estos ejemplos específicos son bastante útiles. Gracias por esto. ¿Tiene algún recurso de aprendizaje sugerido para AppleScript por cierto? Para un principiante completo. (He usado un pequeño script de Bash en el pasado y probablemente pueda volver a aprenderlo yo mismo).
Noldorin
2
Sí, el libro del que más me beneficié fue "AppleScript: la guía definitiva" de Matt Neuberg. La documentación del desarrollador de Apple está bien, y vale la pena consultarla como referencia, pero el libro de Neuberg evalúa honestamente tanto las fortalezas como las debilidades del lenguaje. Encontrará que la insistencia de Applescript en la gramática "natural" no es muy natural, y en muchos casos será contradictoria. Neuberg aclara cuándo sucede eso y por qué.
Ash
Esa es exactamente la impresión que tuve al mirar inicialmente el idioma. Esta casa a medio camino entre la máquina y los lenguajes naturales parece bastante incómoda. Saludos por la recomendación!
Noldorin
3

Puede ser una simplificación excesiva, pero las secuencias de comandos de shell son para combinar programas existentes para realizar nuevas tareas, mientras que AppleScript es para controlar aplicaciones (principalmente GUI) de forma remota. Los programas clásicos de Unix generalmente leen alguna entrada y producen algo de salida y los scripts de shell le permiten combinarlos. AppleScript es para automatizar aplicaciones GUI.

lhf
fuente