it-swarm-pt.tech

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

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 anexar os argumentos às propriedades de atalho, mas como os Macs não usam atalhos por si só e executam os aplicativos diretamente, isso não é possível.

Eu descobri que o lançamento dos 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"

Eu posso fazer isso executável e atribuir um ícone e tudo funciona muito bem, exceto que quando eu executo um desses pseudo programas, uma janela de 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.

Então, 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 ícone do Applescript permaneça aberto enquanto o aplicativo estiver aberto?

Editar

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

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

Aqui está a 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 como um aplicativo.

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

Nota: O script não funcionará corretamente quando executado a partir do Editor de Script, somente quando executado a partir do aplicativo de script criado.

16
MJeffryes

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ê quer.

25
Bob

Abra Automator e crie um Aplicativo com um único script Executar Shell action:

 /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 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ê escolher.

11
Daniel Beck

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"). :(

8
user1722483

Não é necessário (como algumas outras respostas sugeriram) usar killall (ou similar) para eliminar o processo de aplicação AppleScript (“applet”) em esse cenário. Ele pode até mesmo 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, executando aplicativos AppleScript simultaneamente ( se estiver usando “applet” como o 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 o script Shell . Felizmente, existe uma maneira perfeitamente razoável de fazer o que você precisa.

Per TN2065 (em “Desejo iniciar um processo do servidor de segundo plano; como faço para que o script Shell não aguarde até que o comando seja concluído?”), O método apropriado é redirecionar stdout e stderr e ter o Shell executa o programa em segundo plano.

Use 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 irá rodar o suficiente para iniciar o Firefox e irá sair corretamente enquanto Firefox continua a correr.

O redirecionamento é necessário porque não apenas o script Shell espera que seu filho imediato (o Shell) saia, mas também aguarda (todas as instâncias de ) as extremidades graváveis ​​dos canais que cria para o stdout e o stderr da Shell serem fechados. O stdout e stderr do Shell ( do script Shell 's pipes) são herdados pelos programas que ele executa sem redirecionamento (mesmo aqueles executados em background com &) ; o redirecionamento garante que o Shell seja o último a manter as extremidades graváveis ​​dos pipes. Assim, o script Shell retornará imediatamente após a saída do Shell, permitindo que o próprio aplicativo AppleScript saia (já que o O script Shell é a última expressão no programa AppleScript).

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

7
Chris Johnsen

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

No entanto, funciona bem em 10.6.5

4
anonymous

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 eu não posso verificar se você também pode fazer isso para um alias (se você quiser manter o original .app livre de argumento, et cetera).

2
Dav

Enrole sua aplicação 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. Cheguei a esse aplicativo no Finder, clique 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 lançador de aplicativos.

Notas:

  • 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 empacotado diretamente.
2
jlgrall

O comando open possui um argumento opcional --args que será transmitido para o aplicativo aberto como argumentos. Por exemplo:

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