Executando scripts de shell no OS X Dock?

160

Como configuro um script de shell para executar a partir do dock do Mac OSX? Parece que simplesmente criar um atalho abrirá o arquivo no meu editor. Existe um sinalizador que eu preciso definir em algum lugar para dizer para executar, em vez de abri-lo para edição?

Wilco
fonte
2
deve marcar com +1 apenas para o avatar, embora eu também goste do tópico.
precisa saber é o seguinte
Você pode considerar mudar as respostas aceitas para o segundo @Wilco. Eu acho que é uma resposta melhor.
Gray

Respostas:

190

Você pode criar um fluxo de trabalho do Automator com uma única etapa - "Executar script do shell"

Em seguida File > Save As, altere o formato do arquivo para "aplicativo". Quando você abre o aplicativo, ele executa a etapa Shell Script, executando o comando, saindo após a conclusão.

O benefício disso é que é realmente simples de fazer, e você pode facilmente obter a entrada do usuário (por exemplo, selecionando um monte de arquivos) e depois passá-la para a entrada do script do shell (para stdin ou como argumentos).

(O Automator está na sua /Applicationspasta!)

Exemplo de fluxo de trabalho

dbr
fonte
6
@dbr, empurrador de botão da GUI! :) Brincadeirinha, é uma boa sugestão!
willasaywhat
Sim, foi uma excelente sugestão :) Eu mesmo escrito ações do Automator para alguns dos meus aplicativos e ainda esquecê-la em momentos como este :)
Jason Coco
Não consigo fazer isso funcionar com nohup, como "nohup / usr / bin / myscript &; disown -a && exit 0". Eu preciso do aplicativo / fluxo de trabalho para executar um script e sair imediatamente. Alguma ideia? :-)
hourback
3
@martineau Se você abrir o aplicativo, open -a SomeAppThing.app --args --etc=2ele deve se concentrar. Como alternativa, você pode focalizá-lo usando o Applescript (por exemplo osascript -e 'tell application "Google Chrome" to activate')
dbr 8/14
1
Nota: se o seu script estiver iniciando um aplicativo GUI que permanecerá aberto por um tempo, isso mostrará um ícone de engrenagem girando constantemente na barra de tarefas até que o aplicativo seja fechado. Uma solução alternativa é adicionar `&> / dev / null &` à linha de inicialização do script para que o Automator não espere.
eWall
50

Se você não precisar de uma janela do Terminal, poderá transformar qualquer arquivo executável em um Aplicativo apenas criando um shell script Examplee movendo-o para o nome do arquivo Example.app/Contents/MacOS/Example. Você pode colocar esse novo aplicativo no seu dock como qualquer outro e executá-lo com um clique.

NOTA: o nome do aplicativo deve corresponder exatamente ao nome do script. Portanto, o diretório de nível superior deve ser Example.appe o script no Contents/MacOSsubdiretório deve ser nomeado Examplee o script deve ser executável.

Se você precisa exibir a janela do terminal, não tenho uma solução simples. Você provavelmente poderia fazer algo com o Applescript, mas isso não é muito limpo.

Jeremy Banks
fonte
1
Você não sabe se existe uma maneira fácil de passar arquivos como argumentos para o shell script? Para arquivos abertos usando "abrir com ...".
Fuzzy76
9
Para quem tenta fazer isso - o nome do aplicativo deve corresponder exatamente ao nome do script. Então realmente tem que ser example.sh.app, não apenas example.app. Você receberá um aviso sobre aplicativo danificado se estes não corresponderem
Kip
1
Para esclarecer - eu sou um noob OSX - você quer dizer apenas criar uma estrutura de pastas como a mostrada no seu exemplo, com o arquivo de script colocado nela, como mostrado?
27614 martineau
2
@martineau Sim, está correto. Se você criar uma pasta cujo nome termine .appnessa estrutura, ela será tratada como um Aplicativo executável. Se você quiser ver o conteúdo dessa pasta no Finder, clique com o botão direito do mouse nela e selecione "exibir o conteúdo do pacote" (porque clicar duas vezes nela executaria o aplicativo). No terminal, parecerá apenas uma pasta. (Eu não tenho certeza se do Finder permite-lhe mudar o nome da pasta para .app, por si só, você pode precisar de fazer a renomeação no Terminal.)
Jeremy Banks
1
Eu apenas tentei isso e recebi um erro no El Capitan (10.11) de: "Você não pode abrir .... porque os aplicativos powerpc não são mais suportados." : D Isso é bem interessante!
AllenH
26

No OSX Mavericks:

  1. Crie seu script de shell.
  2. Torne seu script de shell executável:

    chmod +x your-shell-script.sh
  3. Renomeie seu script para ter um .appsufixo:

    mv your-shell-script.sh your-shell-script.app
  4. Arraste o script para a estação OSX.
  5. Renomeie seu script de volta para um .shsufixo:

    mv your-shell-script.app your-shell-script.sh
  6. Clique com o botão direito do mouse no arquivo no Finder e clique na opção "Obter informações".
  7. Na parte inferior da janela, defina o script de shell para abrir com o terminal.

Agora, quando você clica no script no dock, uma janela do terminal será exibida e o executará.

Bônus: para que o terminal feche quando o script for concluído, adicione exit 0no final e altere as configurações do terminal para "fechar o shell se for encerrado corretamente", como diz nesta resposta do SO .

stiemannkj1
fonte
Bom, isso funcionou para mim, de qualquer maneira para arriscar o ícone que me pergunto. FYI: Também passo 7 está se referindo ao arquivo e não o item de menu ...
Mike Q
do jeito legal! apenas todos .sh com terminal aberto.
IHTCboy # 15/17
@ stiemannkj1, isso mostra o ícone enquanto o aplicativo está sendo executado? Existe alguma maneira de escondê-lo?
Pacerier 15/12
@ Pacerier, desculpe, não estou mais no OSX (mudei para o Linux :)). Você pode tentar a resposta do Jeremy Bank . Eu não tenho quaisquer outras idéias e desde que eu não tenho OSX, eu não posso teste ou mexer com qualquer coisa para tentar mostrar / ocultar o ícone ..
stiemannkj1
17

Eu sei que isso é antigo, mas no caso de ser útil para outras pessoas:

Se você precisar executar um script e desejar que o terminal apareça, poderá ver os resultados que pode fazer como Abyss Knight disse e alterar a extensão para .command. Se você clicar duas vezes nele, abrirá uma janela do terminal e será executada.

No entanto, eu precisava disso para executar a partir do automator ou appleScript. Portanto, para abrir um novo terminal, o comando que eu executei em "executar script de shell" foi "abrir myShellScript.command" e foi aberto em um novo terminal.

Jason Tholstrup
fonte
maravilhoso, obrigado! Agora, todos precisam fazer da solução perfeita uma maneira de fechar a janela do terminal quando o script for concluído.
Peter M
1
bem, se você tiver selecionado fechar a janela na saída nas preferências do terminal, poderá adicionar o comando exit ao seu script e terá o que deseja.
Jason Tholstrup
7

Contanto que seu script seja executável e não tenha nenhuma extensão, você pode arrastá-lo para o lado direito (lado do documento) do Dock e ele será executado em uma janela de terminal quando clicado em vez de abrir um editor.

Se você deseja ter uma extensão (como foo.sh), pode ir para a janela de informações do arquivo no Finder e alterar o aplicativo padrão para esse script específico, independentemente do que seja (TextEdit, TextMate, qualquer padrão definido no seu computador para arquivos .sh) para o Terminal. Ele será executado apenas em vez de abrir em um editor de texto. Novamente, você precisará arrastá-lo para o lado direito do Dock.

Jason Coco
fonte
1
NOTA : Isso funciona como um campeão no OS X 10.10 Yosemite. Não posso comentar sobre 10.9 #
Bryan Ash
1
Funciona em 10.11. Obrigado!
Yassine Imounachen
Funciona em 10.12 também! Talvez meu comentário sobre 10.9 esteja incorreto, mas notei que você precisa arrastá-lo para a parte do encaixe abaixo do separador. Infelizmente, não tenho como testar novamente o 10.9.
precisa saber é o seguinte
Não é necessário adicioná-lo ao Dock. Pode ser executado a partir da área de trabalho. Mas não pode haver extensão. Torne-o executável e você pode apenas clicar duas vezes. Esta é a opção mais simples que eu já vi.
Rich Apodaca
5

Acho que esse tópico pode ser útil: http://forums.macosxhints.com/archive/index.php/t-70973.html

Parafraseando, você pode renomeá-lo com a extensão .command ou criar um AppleScript para executar o shell.

willasaywhat
fonte
No Snow Leopard, pelo menos, adicionar uma extensão .command a um script faz com que seja executado no terminal se você clicar duas vezes nele, mas por algum motivo você ainda não pode arrastá-lo para o dock. As sugestões de dbr e Jeremy funcionaram para mim, no entanto.
quer
5

Como Joe mencionou, a criação do shell script e, em seguida, a criação de um script applecript para chamar o shell script, fará isso e é bastante útil.

Shell Script

  1. Crie seu script de shell no seu editor de texto favorito, por exemplo:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (isso executa o executável w32, usando a estrutura mono)

  2. Salvar script de shell, para o meu exemplo "StartKeepass.sh"

Apple Script

  1. Abra o AppleScript Editor e chame o shell script

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script - Comando AppleScriptcript para chamar comandos externos do shell
    • "sh ...." - este é seu script de shell (caminho completo) criado na etapa um (você também pode executar comandos diretos, eu poderia omitir o script de shell e apenas executar meu comando mono aqui)
    • user name - declara para AppleScript que você deseja executar o comando como um usuário específico
    • "<enter username here> - substitua pelo seu nome de usuário (mantendo aspas) ex "josh"
    • password - declara para AppleScript sua senha
    • "<enter password here>" - substitua por sua senha (mantendo aspas) ex "mypass"
    • with administrative privileges - declara que deseja executar como administrador

Crie seu .APP

  1. salve seu AppleScript como filename.scpt, no meu caso RunKeepass.scpt

  2. salve como ... seu AppleScript e altere o formato do arquivo para o aplicativo, resultando em RunKeepass.app no ​​meu caso

  3. Copie seu arquivo de aplicativo para a pasta de aplicativos

CJoshDoll
fonte
5

No Editor de scripts:

do shell script "/full/path/to/your/script -with 'all desired args'"

Salve como um pacote de aplicativos.

Contanto que tudo que você deseja fazer seja obter o efeito do script, isso funcionará bem. Você não verá STDOUT ou STDERR.

Joe McMahon
fonte
2
Eu sugeriria: "Salvar como um aplicativo PACOTE". Os pacotes são lançados muito mais rápido que os aplicativos.
e.James
-3

Alguém escreveu ...

Acabei de definir todos os arquivos que terminam em ".sh" para abrir com o Terminal. Funciona bem e você não precisa alterar o nome de cada script de shell que deseja executar.

Jonny
fonte