Como posso executar um aplicativo com argumentos de linha de comando no Mac OS

55

Existe alguma maneira fácil de adicionar argumentos de linha de comando a um aplicativo em um Mac? Por exemplo, para executar o Opera no modo de quiosque ou para usar um perfil diferente no Firefox, posso digitar

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

No Windows, posso adicionar os argumentos às propriedades do atalho, mas como os Macs não usam atalhos por si só e executam os aplicativos diretamente, isso não é possível.

Descobri que o lançamento dos aplicativos por meio do bash ou do Applescript funciona parcialmente:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Eu posso torná-los executáveis e atribuir um ícone e tudo funciona muito bem, exceto que quando eu executo um desses pseudo programas, uma janela do terminal ou um ícone do Applescript permanece aberto enquanto o aplicativo estiver aberto. Presumivelmente, usar o comando Applescript open evitaria isso, mas como não estou executando o aplicativo como está empacotado (apenas /Applications/Firefox ), ele não funciona.

Existe uma maneira melhor de executar aplicativos com argumentos de linha de comando? Se não, existe uma maneira de evitar que uma sessão de terminal persistente ou ícone do Applescript permaneça aberto enquanto o aplicativo estiver aberto?

Editar

De acordo com uma página do Mozilla Wiki , é melhor usar um script para executar o aplicativo com argumentos. Adicionar & ao final do script mata a janela do Terminal persistente. O único aborrecimento agora é que ele abre uma janela do Terminal morta e desconectada (que é melhor que a persistente, mas ainda assim ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
    
por Andrew 01.08.2009 / 11:24

9 respostas

15

Aqui está minha melhor solução: Crie um Applescript com:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

E salve-o como um aplicativo .

Você pode colocar qualquer aplicativo com qualquer args na primeira parte. A parte após o & precisa matar o que você nomeou seu script + .app. Você verá o aplicativo de script aparecer no banco dos réus, mas ele desaparecerá.

Observação: o script não funcionará corretamente quando executado no Editor de scripts, somente quando executado a partir do aplicativo de script criado.

    
por 01.08.2009 / 13:56
21

A partir do OS X 10.6.2, o comando open pode passar argumentos para o aplicativo que é aberto por meio do sinalizador --args. Um AppleScript para usá-lo é assim:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Isso deve lhe dar todo o comportamento que você deseja.

    
por 04.03.2010 / 21:13
11

Abra o Automator e crie um Aplicativo com uma única ação Executar Script Shell :

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Esta aplicação irá iniciar o Firefox e sair instantaneamente, deixando apenas o Firefox rodando.

Como alternativa, crie um aplicativo usando o Editor AppleScript com o seguinte código AppleScript:

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

Ambos funcionam bem e não mantêm o Terminal ou um aplicativo de script em execução por mais de um segundo ou mais. Usando o Automator, você pode até criar um Serviço se você quiser.

    
por 22.01.2011 / 14:04
7

Esta é uma discussão antiga, mas ainda aparece nas pesquisas do Google, então eu pensei em adicionar alguns ¢.

Provavelmente, é melhor usar um "identificador de pacote" em vez de um caminho absoluto para o executável:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Ou em um script da Apple:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

O que eu ainda não descobri é como abrir uma nova instância / janela com um perfil diferente quando o primeiro já estiver aberto. (Se eu executar o AppleScript acima, depois outro com o "Perfil 2", o Chrome ainda abrirá outra janela como "Perfil 1"). : (

    
por 22.08.2014 / 22:50
7

Não é necessário (como algumas outras respostas sugeriram) usar killall (ou similar) para matar o processo de aplicativo AppleScript ("applet") neste cenário. Ele pode até ter efeitos colaterais desagradáveis se o nome / padrão dado a killall corresponder a mais do que apenas o processo de applet pai (por exemplo, outros aplicativos AppleScript concorrentes (se estiver usando “applet” como padrão)).

Algo como kill $PPID pode ser mais razoável, mas podemos não querer supor que o applet de um aplicativo AppleScript seja sempre o pai imediato do shell iniciado por do shell script . Felizmente, existe uma maneira perfeitamente razoável de fazer o que você precisa.

Por TN2065 (em “Desejo iniciar um processo do servidor de segundo plano; como faço o shell script não espera até que o comando seja concluído? ”), o método apropriado é redirecionar stdout e stderr e fazer com que o shell execute o programa em segundo plano.

Use o Editor de scripts para salvar o seguinte programa como um aplicativo AppleScript:

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \
        -P default -no-remote \
        >/dev/null 2>&1 &"

(quebras de linha funcionais adicionadas para mantê-lo "estreito"; excluir o ¬ e \ e colocar tudo em uma linha longa, se quiser)

Ele será executado por tempo suficiente para iniciar o Firefox e sairá corretamente enquanto o Firefox continuar em execução.

O redirecionamento é necessário porque o script não apenas espera que seu filho imediato (o shell) saia, mas também aguarda (todas as instâncias) as extremidades graváveis dos canais cria para que a stdout e stderr do shell sejam fechadas. Os stdout e stderr do shell (os pipes do script de shell ) são herdados pelos programas que são executados sem redirecionamento (mesmo os executados em segundo plano com & ); o redirecionamento garante que o shell seja o último a manter as extremidades graváveis dos pipes. Assim, o shell script retornará imediatamente após o shell sair, permitindo que o próprio aplicativo AppleScript saia (já que do shell script é a última expressão do programa AppleScript).

As outras respostas que usam abertas dentro do script shell funcionam porque aberto (na verdade, LaunchServices) faz o trabalho equivalente de fazer o programa resultante e enviando sua stdout e stderr em outro lugar.

    
por 13.03.2011 / 04:59
3

AppleScript

do shell script "/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --incognito & killall applet"

Dois pontos lá.

  1. O espaço é escapado por uma barra invertida que é escapada pela barra invertida novamente
  2. miniaplicativo killall pode causar problemas, porque pode haver outros applets em execução
  3. Salvar como programa

No entanto, funciona bem em 10.6.5

    
por 22.01.2011 / 13:48
2

O seguinte deve permitir que você especifique argumentos de linha de comando para o próprio .app:

Clique com o botão direito do mouse em .app bundle, selecione "Show Package Contents", navegue até Info.plist, clique duas vezes nele, encontre a tecla Args, edite.

Eu não tenho uma máquina OS X à mão no momento, então não posso verificar se você também pode fazer isso em um alias (se você quiser manter o original .app livre de argumentos, etc.) .

    
por 01.08.2009 / 12:30
2

Por que você não usa:

#!/bin/sh
open /Applications/Firefox.app

Simples, mas funciona.

    
por 01.08.2009 / 13:52
2

Quebra seu aplicativo dentro de um lançador AppleScript.

Aqui estão os passos.

  1. Crie um AppleScript com o seguinte conteúdo e salve-o como um aplicativo (neste exemplo, ele é denominado "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Chegue até o aplicativo no Finder, clique nele com o botão direito, mostre o conteúdo do pacote.

  3. Coloque seu aplicativo na raiz do conteúdo do pacote. (Neste exemplo, seria "Firefox 3.app")

    Resultado: / Applications / Firefox 3 launcher.app/Firefox 3.app

  4. Agora você pode abrir o iniciador de aplicativos.

Notas:

  • As atualizações automáticas do aplicativo empacotado devem funcionar na maioria dos casos.
  • Deve ser possível fazer qualquer arrastar e soltar para o lançador redirecionado automaticamente para o aplicativo empacotado (com um pouco mais de script).
  • O ativador sai automaticamente depois que o aplicativo empacotado é iniciado.
  • Uma vantagem desse método é que há poucos riscos de abrir o aplicativo envolvido diretamente.
por 22.03.2011 / 20:32