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

60

Existe alguma maneira fácil de acrescentar argumentos de linha de comando a um aplicativo em um Mac? Por exemplo, para executar o Opera no modo quiosque ou 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 anexar os argumentos às propriedades do atalho, mas como os Macs não usam o atalho por si só e executam os aplicativos diretamente, isso não é possível.

Eu descobri que iniciar os aplicativos através 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"

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

Portanto, existe uma maneira melhor de executar aplicativos com argumentos de linha de comando? Caso contrário, existe uma maneira de impedir que uma sessão de terminal persistente ou o ícone da Applescript permaneça aberto enquanto o aplicativo está aberto?

Editar

De acordo com uma página do Mozilla Wiki , é melhor usar um script para executar o aplicativo com argumentos. Adicionar um &ao final do script mata a janela persistente do Terminal. 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 &
Andrew
fonte
2
Eu ainda estou esperando por melhores respostas sobre este ...
cregox 30/10/10
Quando você executa um trabalho com &ele ainda pertencente ao Terminal, pode corrigi-lo adicionando a linha disown %/Applications/Firefox.app/Contents/MacOS/firefox depois de executá-lo e, em seguida, pode fechar o Terminal com segurança, usando AppleScript.
ocodo 22/01
procure a resposta de Daniel - é a mais completa e perfeita para hoje (OSX 10.6.2 +).
cregox

Respostas:

17

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 quaisquer argumentos na primeira parte. A parte após as &necessidades de matar o que você nomeou como seu script + .app. Você verá o aplicativo de script piscando no banco dos réus, mas depois desaparecerá.

Nota: O script não funcionará corretamente quando executado no Editor de scripts, somente quando executado no aplicativo de script que você criou.

MJeffryes
fonte
Isso quase funciona. Ainda aguarda a conclusão da instância do Firefox até que seja executada killall, por isso chama o depurador quando fecho o Firefox, e o aplicativo de script ainda não desaparece. Hmmm ...
Andrew
Isso é estranho. Você está salvando-o como um aplicativo e clicando duas vezes no aplicativo? Não funcionará quando executado no Editor de scripts.
MJeffryes 01/08/2009
Além disso, notei que coloquei uma nova linha antes do &. Retire a nova linha Se você tem isso
MJeffryes
não há necessidade de & killall aqui no Snow Leopard 10.6.x - mas também não encontrou nenhuma maneira de fazer com que o aplicativo se matasse assim que foi executado.
Cregox 30/10/10
11
@Pacerier Verifique as datas nesta resposta.
MJeffryes
28

A partir do OS X 10.6.2, o comando open pode passar argumentos para o aplicativo que ele abre por meio do sinalizador --args. Um AppleScript para usá-lo se parece com isso:

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

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

Prumo
fonte
"homem aberto", e aí está! funcionou como um encanto. --args flag e, em seguida, seus argumentos.
Michael Dimmitt
11
Eu tentei --argscom o Chrome e não funciona. Ele funcionará apenas para a primeira instância . Se você tentar executar dois --user-data-dirsimultaneamente, não poderá fazê-lo, openmas deverá executá-lo pelo /applications...método antigo . Alguém sabe por que diabos --args não funciona?
Pacerier
11
@Pacerier, "open -n"
Simon Wright
Para adicionar isso, você pode criar o script no Editor de scripts e salvar como aplicativo.
Kevin C.
11

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

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

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


Como alternativa, crie um aplicativo usando o AppleScript Editor 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. Usando o Automator, você pode até criar um Serviço, se assim o desejar.

Daniel Beck
fonte
11
Lembre-se de que open --argsfoi implementado na 10.6.2, como Bob já mencionou.
precisa saber é
Utilizando-o para: open eclipse.app -nabrir um segundo espaço de trabalho do Eclipse. Muito conveniente. Obrigado!
jonalv
Não foi possível fazê-lo funcionar no Automator com a ação "Executar script de shell" no MacOS 10.14. Acabei tendo sucesso com o AppleScript, no entanto.
Kevin C.
8

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

Provavelmente é melhor usar um "identificador de pacote configurável" em vez de 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 ainda não descobri é como abrir uma nova instância / janela com um perfil diferente assim que o primeiro já estiver aberto. (Se eu executar o AppleScript acima, outro com o "Perfil 2", o Chrome ainda abrirá outra janela como "Perfil 1"). :(

user1722483
fonte
-B é funcionalmente igual a -a? Como eles são diferentes?
Pacerier
7

Não é necessário (como algumas outras respostas sugeriram) usar killall (ou similar) para matar o processo de aplicativo AppleScript pai ("applet") nesse cenário. Pode até ter efeitos colaterais indesejáveis ​​se o nome / padrão atribuído ao killall corresponder mais do que apenas o processo do applet pai (por exemplo, outros aplicativos AppleScript em execução simultânea (se estiver usando "applet" como padrão)).

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

De acordo com o TN2065 (em "Desejo iniciar um processo do servidor em segundo plano; como faço para que o shell script não espere até que o comando seja concluído?"), O método adequado é 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 funcional adicionado para mantê-lo “estreita”; excluir o ¬e \\e colocar tudo em uma linha longa, se quiser)

Ele será executado o tempo suficiente para iniciar o Firefox e sairá corretamente, enquanto o Firefox continuar sendo executado.

O redirecionamento é necessário porque o script shell não apenas espera que seu filho imediato (o shell) saia, mas também espera (todas as instâncias) as extremidades graváveis ​​dos pipes criados para que o stdout e o stderr do shell sejam fechados . O stdout e o stderr do shell ( fazem os pipes do script de shell ) são herdados pelos programas executados sem redirecionamento (mesmo os executados em segundo plano &); o redirecionamento garante que o shell seja o último a conter as extremidades graváveis ​​dos tubos. Portanto, o script do shell retornará imediatamente após a saída do shell, permitindo que o próprio aplicativo AppleScript saia (já que o script do shell é a última expressão no programa AppleScript).

As outras respostas que usam open inside funcionam como shell script, porque open (na verdade, LaunchServices) faz o trabalho equivalente de colocar em segundo plano o programa resultante e enviar seu stdout e stderr para outro lugar.

Chris Johnsen
fonte
isto é muito interessante. Gostaria de saber se funciona antes da 10.6.2 ... mas ainda acho que o uso open --argsparece mais limpo. existe alguma desvantagem em usar algum deles?
Cregox # 14/11
11
Eu sei que esse método funciona na 10.4. Minha impressão é que o shell script sempre funcionou assim (foi adicionado ao Standard Additions OSAX no AppleScript 1.7 , que acompanha o Mac OS X 10.1). Se você está disposto a assumir 10.6, open --argsprovavelmente está bem.
precisa
@ChrisJohnsen, Link down ........
Pacerier
4

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 por barra invertida novamente
  2. O applet killall pode causar problemas, porque pode haver outros applets em execução
  3. Salve-o como programa

No entanto, funciona bem em 10.6.5

anônimo
fonte
appletrefere-se a?
Pacerier
3

A seguir, você deve especificar argumentos da linha de comando para o próprio .app:

Clique com o botão direito do mouse no pacote .app, selecione "Mostrar conteúdo do pacote", navegue até Info.plist, clique duas vezes nele, localize a chave 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 com um alias (se você quiser manter o arquivo .app original sem argumentos etc.).

Dav
fonte
Infelizmente, não há chave de args na lista. De acordo com a Mozilla, você deveria usar um script - wiki.mozilla.org/MailNews:Logging#Mac
Andrew
Observe também que a alteração do conteúdo do pacote (como Info.plist) pode causar problemas com a assinatura do código: bridge.grumpy-troll.org/2011/01/…
drevicko
2

Enrole seu aplicativo dentro de um iniciador AppleScript.

Aqui estão os passos.

  1. Crie um AppleScript com o seguinte conteúdo e salve-o como um aplicativo (neste exemplo, ele é chamado "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. Acesse esse aplicativo no Finder, clique com o botão direito do mouse e mostre o conteúdo da embalagem.

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

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

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

Notas:

  • As atualizações automáticas do aplicativo agrupado devem funcionar na maioria dos casos.
  • Deve ser possível arrastar e soltar o lançador redirecionado automaticamente para o aplicativo agrupado (com um pouco mais de script).
  • O iniciador sai automaticamente após o lançamento do aplicativo agrupado.
  • Uma vantagem desse método é que há poucos riscos de abrir o aplicativo empacotado diretamente.
jlgrall
fonte
1

Por que você não usa:

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

Simples, mas funciona.


fonte
2
O terminal abrirá se você fizer isso.
MJeffryes 01/08/2009
0

O opencomando tem um --argsargumento opcional cujo valor será passado para o aplicativo aberto como argumentos. Por exemplo:

open /Applications/TextEdit.app --args example.txt
ecnepsnai
fonte