Executa um script de shell no OS X sem que uma janela de terminal apareça?

17

Estou tentando configurar alguns atalhos de teclado que abrem sessões específicas do iTerm, o que eu consegui fazer com o BetterTouchTool e um pouco de mágica do AppleScript. O problema é que o OS X insiste em abrir uma janela do Terminal para qualquer script de shell que você executa através da GUI (ou seja, a partir do Finder, ou como um atalho de teclado da BetterTouchTool). A janela do terminal não aparece se eu executar o script diretamente de outro terminal.

Uma solução que eu encontrei foi embrulhar o script em um diretório .app, que resolve o problema da janela do terminal supérfluo, mas tem alguns outros problemas (por exemplo, o OS X parece tratar cada janela iTerm resultante como um aplicativo separado, desordenando minha doca). (EDIT: esse comportamento foi causado por um bug no meu script, veja abaixo)

Eu também tentei atribuir o aplicativo Terminal a outra área de trabalho virtual nas configurações do Spaces, em uma tentativa de movê-lo para fora do campo de visão, mas ele simplesmente mudará para a área de trabalho antes de executar o script.

Existe uma maneira de desabilitar esse comportamento completamente? Eu já encontrei a configuração nas preferências do Terminal para fechar a janela após o script ter terminado, mas ainda é chato ter a janela do Terminal aberta por um segundo.

    
por toupeira 22.11.2011 / 13:08

7 respostas

17

Abra o Automator , escolha Aplicativo , adicione uma ação Executar Script Shell e coloque seu comando do Shell entre aspas (se você tiver um arquivo, basta arrastar e soltar ).

Além de reproduzi-lo, agora você pode salvar ele (como um aplicativo em qualquer lugar) e até defina o ícone .

    
por 26.06.2013 / 02:50
3

Aqui está uma pequena solução, caso você goste de lançadores de aplicativos como Alfred . Eu uso todos os dias e comprei o Powerpack , que permite executar scripts de shell silenciosos.

Estesnãoabremumterminalquandoestãoemexecuçãoepodemservinculadosaqualquersequênciadepalavras-chave.Elespodematéincluirparâmetroseteropçõesadicionais:

Eu uso isso para alguns pequenos trechos e é muito flexível.

    
por 22.11.2011 / 16:03
3

Você pode querer conferir o Platypus , que cria aplicativos para Mac OS X a partir de scripts de shell e outros scripts interpretados.

    
por 05.12.2011 / 22:25
1

Aqui está um exemplo rápido e sujo com quase nenhum esforço (para um aplicativo chamado "myapp"):

  1. Crie uma hierarquia parcial de aplicativos:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. Certifique-se de que a primeira linha do seu script tenha o caminho completo para o programa necessário, por exemplo,

    #!/bin/bash
    
  3. Nomeie seu script de shell "myapp" (sem aspas, sem extensão), dê permissões de execução e coloque-o no subdiretório MacOS. Para dar permissões de execução:

    chmod ugo+x myapp
    
  4. Vá para o subdiretório Contents e crie um arquivo PkgInfo contendo o string: APPL ???? [sem terminador de linha no final da string!] Use o utilitário cat (1) para criar o arquivo:

    cat > PkgInfo
    APPL????
    

    Depois de ter digitado a string (não pressione Enter!), insira dois control-D's, que serão fechados. o arquivo sem terminador de linha e retorná-lo ao prompt do shell.)

  5. Clique duas vezes no novo "aplicativo" no localizador. Ele será executado sem janela.

por 02.09.2018 / 09:57
0

Se você adicionar a chave LSUIElement e defini-la como 1 in Info.plist do seu aplicativo, ela não criará um ícone no Dock.

Aqui está Info.plist do meu aplicativo de script de shell pequeno:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>
    
por 22.11.2011 / 13:26
0

Aqui está uma solução alternativa:

Compile um applescript que chama um script de shell:)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

O osacompile irá compilar o fragmento 'do shell script "XXX"' applescript. Seu script de shell é o XXX.

Cuidado com as citações, o script de shell precisa ser citado corretamente para passar do shell que você está usando para compilá-lo ainda intacto.

Mas isso pode ser executado a partir do BetterTouchTool sem qualquer insegurança.

    
por 29.08.2012 / 22:27
0

Existe outro treino possível. Proteja seu script de shell em um fluxo de trabalho de automação. Invoque o fluxo de trabalho com launchd. O código é:

/usr/bin/automator /path/to/the/file.workflow

Isso não iniciará nenhum programa nem aparecerá na barra de menus e ficará mais silencioso do que um aplicativo do Platypus.

Uma maneira ainda melhor de executar scripts shell é direta no launchd.

/bin/bash /path/to/shellScript.command

executará o comando ultra silenciosamente em segundo plano.

    
por 29.03.2018 / 12:12