Script AppleScript vs. Bash?

13

Sou um "usuário avançado" e desenvolvedor de longa data do Windows que decidiu recentemente migrar para o Mac OS X.

No OS X Lion e nas versões anteriores, parece haver duas opções principais de script e automação no OS X: AppleScript e Bash. O último é obviamente uma conseqüência direta do OS X usando o shell "bash" do Unix, enquanto o primeiro é a própria inovação da Apple. As sintaxes são claramente muito diferentes, com AppleScript tendo um estilo de linguagem pseudo-natural.

Minha pergunta é: os scripts AppleScript e Bash são comumente usados ​​(na verdade, eles devem ser usados) para tarefas e finalidades diferentes no OS X. Estou vagamente ciente da vasta gama de tarefas que posso realizar com o script Bash, embora, é claro, o código pois alguns mais avançados podem rapidamente tornar-se complicados. Essas duas linguagens têm casos de uso sobrepostos ou quase idênticos, apesar da invenção posterior do AppleScript da Apple - ou devem ser usados ​​com diferentes cenários em mente? Uma visão geral de alto nível, bem como alguns exemplos específicos, seriam apreciados.

Noldorin
fonte
Se você tiver tarefas relacionadas a arquivos e pastas, compre "Hazel", é uma ferramenta realmente poderosa, baseada em regras, muito útil. Também pode chutar scripts de shell e Applescripts com base em regras.
Stuart Woodward

Respostas:

17

Tanto o shell quanto o AppleScripts podem ser usados ​​em qualquer lugar que seja apropriado.

O AppleScripts funciona melhor ao conversar com aplicativos e instalações do sistema no nível do usuário. (Por exemplo, você pode dizer tell app "iTunes" to playe vai, ou tell app "Finder" to open the first file of the second window.)

Os scripts de shell (que você mencionou bash) funcionam melhor ao conversar com objetos do sistema de baixo nível e coisas do Unixy.

Os dois são interoperáveis: você pode chamar um comando de shell do AppleScript com do shell script "command here"e pode chamar o código AppleScript do shell com osascript -e "AppleScript". Além disso, há um pouco de sobreposição entre os dois (especialmente quando se trata de operações do sistema de arquivos).

Certamente, existem mais recursos para aprender scripts de shell on-line do que o AppleScript e não ajuda que o AppleScript tenha uma reputação de ser uma linguagem "somente leitura" (ou seja, mais difícil de escrever do que ler).

De qualquer forma, a maneira mais moderna de criar scripts é com o Automator, onde você pode usar o shell ou o AppleScripting (ou ambos) junto com módulos pré-criados de vários aplicativos que você instalou.

Cajunluke
fonte
Obrigado; essa é uma visão geral muito informativa. Você tem alguma recomendação para obter bons recursos de aprendizado no alcance AppleScript? (Bash roteiro também, embora eu poderia encontrar aqueles com bastante facilidade-me provavelmente.)
Noldorin
3
AppleScript tem uma reputação (um tanto conquistada) de ser somente leitura; Às vezes, os scripts do shell se inclinam para o final "somente gravação" do espectro.
Daniel
@Oldoldin Comprei um livro para aprender AppleScript, mas costumo usar o Google primeiro e o índice do livro depois, quando estou tentando lembrar a sintaxe de um comando específico.
Cajunluke
@CajunLuke: Ah, é justo. Como você aprendeu o AppleScript pela primeira vez?
Noldorin
@Noldorin Praticamente tentativa e erro e Google. Algumas coisas são difíceis de buscar no Google, por isso comprei o livro.
Cajunluke
8

Embora um dos contextos de script possa fazer qualquer coisa que o outro possa fazer (porque os scripts de shell podem chamar /usr/bin/osascriptpara invocar um AppleScript e o AppleScript possui o do shell scriptcomando), de fato existem contextos nos quais um é mais adequado que o outro.

Ambas as linguagens de script são linguagens de "cola" - elas próprias podem fazer o mínimo possível e, em vez disso, realizam a maioria de suas tarefas, invocando os recursos de outros programas. Os scripts de shell fazem uso de pipes Unix, enquanto o AppleScript possui a tell applicationsintaxe.

Onde eles divergem é que o AppleScripts se comunica diretamente com aplicativos de script (quase sempre aplicativos de GUI), enquanto os scripts de shell se comunicam principalmente com programas de linha de comando (alguns dos quais podem chamar interfaces gráficas de usuário, mas muitos não).

Quando se trata de tarefas de gerenciamento de arquivos, ambas as abordagens podem funcionar. Pode- Tell Application Finderse copiar arquivos ou executar o cpcomando em um script de shell. Então, por que usar um sobre o outro? Certamente alguns roteiristas estão mais familiarizados com um idioma que o outro e, portanto, preferem usar essa ferramenta. Mas uma consideração melhor é do usuário do script. Muitas vezes, o AppleScript pode ser chamado a partir da GUI do Mac: clicando duas vezes em um aplicativo AppleScript, ou soltando arquivos em um, ou usando um menu AppleScript em todo o sistema ou em um programa específico. Programas como o Mail podem ser configurados para executar um AppleScript nas mensagens recebidas para filtrá-los. Para usuários acostumados a usar Macs de maneira "semelhante a Mac" (ou seja, na GUI), os AppleScripts geralmente são mais acessíveis.

Os scripts de shell geralmente (mas nem sempre) vivem no Terminal. Se alguém já estiver usando o Terminal, executar um script de shell pode ser mais conveniente do que chamar um AppleScript. Por outro lado, muitos usuários ficam desanimados ao digitar comandos em uma janela do Terminal ou até clicar em um arquivo de script que abre uma janela do Terminal para fazer sua mágica. Pessoalmente, acho a sintaxe dos scripts de shell mais legível que a do AppleScripts, mas suspeito que eu seja uma minoria nisso. Os scripts de shell são familiares aos usuários de muitos sistemas diferentes do Unix.

De qualquer forma, ambas são ferramentas poderosas para obter melhor controle sobre o seu Mac.

Daniel
fonte
Obrigado; isso certamente esclarece o assunto e confirma algumas das minhas suspeitas.
Noldorin
Suponho que Tell Application Findercopiar arquivos abrirá uma janela com uma barra de progresso visível, enquanto cpnão. Isso está certo?
TRiG 25/09
4

As outras respostas fornecem excelentes visões gerais de alto nível da intenção por trás dessas duas técnicas de script. Talvez eu só dê exemplos de como os uso.

Com a Applescript, eu criei regras de processamento para o Mail, conectei o BBEdit ao R para processamento estatístico, criei Ações de Pasta complexas e fiz uma reorganização massiva baseada em tempo de minhas fotos no iPhoto e Aperture. Também criei miniaplicativos com botões e exibições de texto. Basicamente, isso é manipulação automática de aplicativos complexos com GUIs.

Com o script Bash, criei rotinas automáticas de processamento de imagens com o Imagemagick, rotinas de processamento de PDF com Ghostscript, rotinas de hora e data e muito processamento de texto com Bash, sed / awk e Perl. Os utilitários Unix tendem a ser enxutos, rápidos e flexíveis, e o Bash é uma ótima maneira de combiná-los em ferramentas fáceis e muito poderosas.

Às vezes, chamo scripts Bash de dentro de um Applescript, geralmente para fins de processamento de texto (GREP) ou para busca leve em sites (curl). Eu quase sempre uso essa técnica para obter um pouco de dados ou uma variável para usar mais no meu Applescript.

Cinza
fonte
Ah, esses exemplos específicos são bastante úteis. Obrigado por isso. A propósito, você tem algum recurso de aprendizado sugerido para AppleScript? Para um iniciante completo. (Eu usei um pequeno script Bash no passado e provavelmente pode reaprender-lo eu mesmo.)
Noldorin
2
Sim, o livro de que mais me beneficiei foi "AppleScript: The Definitive Guide", de Matt Neuberg. A documentação do desenvolvedor da Apple está ok e vale a pena consultar como referência, mas o livro de Neuberg avalia honestamente os pontos fortes e fracos do idioma. Você verá que a insistência da Applescript na gramática "natural" não é muito natural e, em muitos casos, será contra-intuitiva. Neuberg esclarece quando isso acontece e por quê.
Ash
Essa é exatamente a impressão que tive ao olhar inicialmente para o idioma. Essa casa a meio caminho entre a máquina e as línguas naturais parece um pouco estranha. Felicidades pela recomendação!
Noldorin
3

Pode ser uma simplificação excessiva, mas o script de shell serve para combinar os programas existentes para executar novas tarefas, enquanto o AppleScript é para controlar (principalmente a GUI) os aplicativos remotamente. Os programas clássicos do Unix geralmente leem alguma entrada e produzem alguma saída e scripts de shell permitem combiná-los. AppleScript é automatizar aplicativos GUI.

lhf
fonte