Como executar um script de shell no OS X clicando duas vezes?


233

Eu tenho um script de shell que tem permissão de execução do usuário no OS X, mas quando clico duas vezes nele, ele é aberto em um editor de texto. Como posso executá-lo clicando duas vezes nele?

Respostas:


266
  • Primeiro no terminal, torne o script executável, digitando:

    chmod a+x (yourscriptname)
  • Em seguida, no Finder, clique com o botão direito do mouse no seu arquivo e selecione "Abrir com" e depois "Outros ...".

  • Aqui você seleciona o aplicativo no qual deseja executar o arquivo, nesse caso, seria Terminal. Para poder selecionar o terminal, você precisa mudar de "Aplicativos recomendados" para "Todos os aplicativos". (O aplicativo Terminal.app pode ser encontrado na pasta Utilitários)

  • OBSERVAÇÃO: a menos que você não queira associar todos os arquivos com esta extensão para rodar no terminal, você não deve ter "Always Open With" marcado.

  • Depois de clicar em OK, você poderá executar o script clicando duas vezes nele.

graças eu consegui, eu não sabia se associar com terminal, eu pensei necessidade de associar-se com / bin / sh
C2H2

22
Não consegui encontrar o Terminal.app na lista até perceber que precisava procurar na pasta "Utilitários". Espero que isso poupe a alguém algum tempo.
Glenn Lawrence

27
No OSX 10.8 e superior, um script executável cujos nomes tem ou não sufixo ou sufixo .commandé , por padrão executável a partir do Finder, sem a necessidade de instruir Localizador de como abri-lo.
mklement0

1
"Todas as aplicações" é a configuração que eu estava perdendo ... provavelmente o que Cheruvim também experimentou. Quanto ao comentário de Glenn: você pode simplesmente usar o recurso de pesquisa embutido no canto superior direito da janela; certifique-se de digitar o nome completo do aplicativo, ou seja, Terminal.app.
Elder Elder

3
Não é a maneira limpa de fazer isso. Renomeie seu script para a .commandextensão do arquivo.
Bachsau

227

Você já tentou usar a .commandextensão do nome do arquivo?


3
Isto é melhor. Na resposta @Lus, a pasta de trabalho não é a mesma que você abre o script.
Rodrigo

6
Existe uma maneira de iniciar tarefas "em segundo plano" sem janela do console?
Lapo

6
Por favor, note que o diretório atual pode não ser o único script localizado na Veja esta pergunta para configurá-lo direito:. Stackoverflow.com/questions/59895/...
Pavel Alexeev

14
Você ainda precisa ter permissão de execução ( chmod +x), mas a .commandextensão já está vinculada ao Terminal. Grande solução, obrigado
NorTicUs

Aparentemente, o usuário não pode interagir com o programa do terminal com esse método - a menos que eu esteja enganado?
Demis

153

Desde o OSX 10.10 (Yosemite) e desde pelo menos OS X 10.8 (Mountain Lion) , o comportamento é o seguinte quando você abre (clique duas vezes) scripts executáveis do Finder :

  • Scripts executáveis [1] com NO ou sufixo.command :
    • são executados por padrão - nenhuma configuração é necessária :
      • uma nova janela do Terminal é aberta, na qual o script é executado.
      • por padrão, a janela permanecerá aberta após o término do script para que você possa inspecionar a saída (embora nesse momento o shell que executou o script tenha saído e você não possa mais interagir com ele ).
        No entanto, através do Terminal, Preferences... > Profilesvocê pode optar por fechar automaticamente a janela quando o script sair.
    • Advertência : a pasta de trabalho é invariavelmente a pasta inicial do usuário atual , NÃO a pasta na qual o script está localizado.
      • Para fazer um script de shell mudar para a pasta em que está localizado, coloque
        • cd -- "$(dirname "$BASH_SOURCE")" logo após a linha shebang
        • ou, se você precisar permanecer em conformidade com POSIX, cd -- "$(dirname "$0")" ,.
        • Para casos extremos , como encontrar o diretório de origem verdadeiro de um script com link simbólico , consulte esta resposta minha.
    • Se o script inesperadamente não for executável :
      • Torne-o executável executando chmod +x <script>no Terminal; caso contrário, você verá os seguintes sintomas:
      • .command: O Finder exibe uma mensagem de erro enganosa que sugere que o problema pode ser corrigido via File > Get Info, o que não é verdade - use ochmod +x método sugerido acima.
      • sem sufixo:
        • com uma linha shebang (por exemplo, #!/bin/bash): o comportamento é como se o sufixo fosse .sh- veja abaixo.
        • com nenhuma linha de shebang: abre em seu editor de texto padrão (que é TextEdit, por padrão).
  • Scripts com sufixo.sh , executáveis ​​ou não:
    • são abertos para edição no TextEdit.appou, se instalado, com Xcode.app.
  • Scripts com sufixo.scpt ou .applescript(mesmo se eles próprios estiverem marcados como executáveis, o que normalmente não é o caso):
    • aberto para edição em[Apple]Script Editor
    • Observe que os arquivos de código-fonte JXA parecem não ter sufixo distinto (ainda).
  • Scripts com um sufixo personalizado (um sufixo ainda não conhecido pelo sistema), executável ou não (de fato, se aplica a qualquer tipo de arquivo):
    • solicitar que o aplicativo os abra quando você os abrir pela primeira vez e lembre-se dessa opção .

[1] Executável significa: um script com o (s) bit (s) de permissão executável (s) definido (s) e o usuário que está chamando - em relação à propriedade do arquivo - potencialmente sendo permitido executá-lo.
Se você chmod a+xdefinir todos os bits de permissão (o que é típico), qualquer pessoa poderá invocá-lo (supondo que eles também tenham permissão para ler o arquivo com base nos bits de permissão de leitura e na propriedade do arquivo).


1
É possível fechar a janela do Terminal aberta quando o script sair com um simples que osascriptvocê pode incluir no .commandarquivo, em vez de mexer manualmente com o perfil.
l'L'l

@ I'L'I: Você quer dizer adicionar um osascript -e '...'comando ao final do script? Qual é o comando específico e garante que a guia direita seja fechada mesmo quando o script não estiver em execução na guia mais à frente?
usar o seguinte comando

5
@ mklement0: Sim, não testei por mais de alguns minutos, mas a idéia básica é incluir na última linha do script .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Pode não funcionar em todos os cenários, embora o redirecionamento no end é realmente a chave - o osascript pode ser adaptado facilmente (por exemplo, a janela pode precisar ser alterada para tab se esse for o seu comportamento padrão do terminal, etc.).
1

É possível não deixar a janela / guia do Terminal fechar após a .commandexecução do arquivo de script, apesar da configuração do perfil?
CyberMew

@ CyberMew: Se você pode modificar o script, adicione um comando que aguarda o pressionamento de tecla no final; por exemplo, se for um bashscript, adicione read -p 'Press Return to close this window.'como a última declaração.
usar o seguinte comando

38

Como alternativa, você pode criar um aplicativo Mac OS X comum a partir do seu script usando Platypus


Este é realmente um ótimo aplicativo. Mas eu tenho algum problema aqui. Eu tenho um script python que quero converter em um arquivo .app. Meu script inclui uma linha em que o usuário precisa digitar alguma entrada (raw_input ()), quando o .app atinge essa linha de código, gera um erro de EOF (final do arquivo). O que posso fazer sobre isso?

1
Não é um terminal interativo. O ornitorrinco apenas apresenta a saída do script. Não há comunicação bidirecional.
svth

4
Ou crie um aplicativo OS X com o Automator usando a ação Executar Shell Script.
Rangi Keen

15

A maneira mais fácil é alterar a extensão para .command ou nenhuma extensão.

Mas isso abrirá o Terminal e você terá que fechá-lo. Se você não quiser ver nenhuma saída, use o Automator para criar um aplicativo para Mac, clique duas vezes, adicione à estação, etc.

  1. Abrir Automatoraplicação
  2. Escolha o tipo "Aplicativo"
  3. Digite "run" na caixa de pesquisa Actions
  4. Clique duas vezes em "Executar script de shell"
  5. Clique no Runbotão no canto superior direito para testá-lo.
  6. File > Save para criar o aplicativo.

insira a descrição da imagem aqui


Ótimo ! Como podemos automatizar esse fluxo de trabalho para ser executado diariamente às 13h?
IAkshay

9

Não há necessidade de usar aplicativos de terceiros, como o Platypus.

Basta criar um Apple Script com o Editor de scripts e usar o comando do shell script "shell commands"para chamadas de comando diretas ou arquivos de script de shell executável, manter o arquivo de script editável seguro em algum lugar e exportá-lo para criar um script de aplicativo. o script do aplicativo pode ser iniciado com um clique duplo ou a seleção na pasta da barra.


3
Melhor ainda, use o Automator e use a ação Executar Script do Shell diretamente, em vez de passar pelo Apple Script.
Rangi Keen

0

Você também pode definir padrões por extensão de arquivo usando RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

potencialmente você pode configurar .sh para abrir no iTerm / Terminal etc., precisaria de permissões de execução do usuário, por exemplo

chmod u+x filename.sh

Painel de preferências do RCDefaultApp


0

chmod 774 filename

Nota : O arquivo com o nome 'filename' que possui o script bash não possui extensão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.