Inicie um aplicativo no OS X com linha de comando

108

Quero lançar um aplicativo no OSX a partir de um script. Preciso passar argumentos de linha de comando. Infelizmente, opennão aceita argumentos de linha de comando.

A única opção que consigo pensar é usar nohup myApp > /dev/null &para iniciar meu aplicativo para que ele exista independentemente do script que o inicia.

Alguma sugestão melhor?

psicótico
fonte
Eu não consigo acompanhar a pergunta. "open" não aceita argumentos de linha de comando? O que é "aberto"? Este é o AppleScript aberto? Como nohup &resolver o problema?
S.Lott de
4
man open (1) - comando OS X para iniciar arquivos ou aplicativos
Ned Deily
3
Isso deve estar em superuser.com
Jeff Meatball Yang,

Respostas:

78

No OS X 10.6, o opencomando foi aprimorado para permitir a passagem de argumentos para o aplicativo:

open ./AppName.app --args -AppCommandLineArg

Mas para versões mais antigas do Mac OS X, e porque os pacotes de aplicativos não foram projetados para serem passados ​​com argumentos de linha de comando, o mecanismo convencional é usar Apple Events para arquivos como aqui para aplicativos Cocoa ou aqui para aplicativos Carbon. Você provavelmente também poderia fazer algo estranho passando parâmetros ao usar variáveis ​​de ambiente.

Ned Deily
fonte
Minha abordagem kludgey é invocar o executável diretamente com argumentos de linha de comando usando nohup - se o environment-vars-kludge less kludgey?
psychotik de
2
Provavelmente não. Se funcionar para você, vá em frente. O ponto principal é que open (1) é o equivalente cli do que acontece quando um usuário dá um clique duplo ou "Open" no Finder e nenhum desses mecanismos suporta argumentos convencionais de linha de comando.
Ned Deily de
+1: Você não deve usar argumentos de linha de comando para aplicativos Mac OS X GUI.
S.Lott
2
diga ao Google para não usar argumentos de linha de comando, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal
@Anurag Uniyal. "Por quê?" Você leu a resposta? "o mecanismo convencional é usar o Apple Events para arquivos como aqui para aplicativos Cocoa ou aqui para aplicativos Carbon." É assim que o Mac OS X foi projetado. Sim. O Chrome quebra as regras. O mesmo acontece com cada um dos utilitários de linha de comando do Linux. Mas os aplicativos GUI que são abertos open- como diz a resposta - não foram projetados para funcionar na linha de comando. "Por quê?" Porque é assim que o Mac OS X é.
S.Lott
105

Como foi mencionado na pergunta aqui , o opencomando em 10.6 agora tem um argssinalizador, então você pode chamar:

open -n ./AppName.app --args -AppCommandLineArg

John McDonnell
fonte
Trabalhando exatamente da maneira que era necessário. Obrigado
DTdev
Isso funcionou e me permitiu definir um alias zsh para o Chromium. Obrigado
jamescampbell
Essa resposta é ótima. Só queria acrescentar que, ao abrir o Terminal pela primeira vez, você estará em seu diretório inicial, então digite-o desta forma para não precisar mudar para o diretório de aplicativos. Eu queria executar o Gimp sem carregar as fontes, o que leva uma eternidade, então eu digito isso com a opção -f para omitir as fontes: open -n /Applications/GIMP.app --args -f
James Toomey
32

Um pacote de aplicativos (um .apparquivo) é, na verdade, um monte de diretórios. Em vez de usar opene o .appnome, você pode realmente ir até ele e iniciar o binário real. Por exemplo:

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

Esse é o binário real que pode aceitar argumentos (ou não, no LittleSnappercaso de).

NSSec
fonte
3
O binário aceita argumentos, tenho certeza. Eu escrevi. Invocar 'open' não permite a passagem de argumentos. Tenho certeza disso. E sim, meu script está chamando 'binário aberto' diretamente, não tentando abrir o pacote.
psychotik de
@psychotik: Ele não está dizendo para chamar "binário aberto". Ele está dizendo para executar diretamente o binário.
Chuck de
Isso não vai funcionar para mim. A execução direta do binário resulta em um processo filho do meu script, o que eu definitivamente não quero. Portanto, a necessidade de usar open / nohup
psychotik
1
Se for um script de shell, use 'exec' para substituir o processo de script pelo executável real.
Jonathan Leffler de
2
Esta abordagem tem uma grande desvantagem: se o pacote contém bibliotecas personalizadas e estruturas, você precisa mexer com DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

Caso seu aplicativo precise funcionar em arquivos (o que você normalmente esperaria passar por:) ./myApp *.jpg, você faria assim:

open *.jpg -a myApp
eshedg
fonte
Este é exatamente o que eu estava procurando! Minha instanciação, por exemplo: open something.py -a Eclipse.app
Eric
4

Eu recomendaria a técnica que MathieuK oferece. No meu caso, precisava tentar com o Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

Sei que isso não resolve o problema do OP, mas espero que economize o tempo de outra pessoa. :)

Paul irlandês
fonte
@Pacerier Adicione um `&` ao final deste comando. Ele será iniciado em segundo plano. Você pode então fechar a janela do terminal e o aplicativo provavelmente ainda permanecerá aberto.
Paul Irish
2

opentambém tem um sinalizador -a, que você pode usar para abrir um aplicativo de dentro da pasta Aplicativos por seu nome (ou pelo identificador de pacote com sinalizador -b). Você pode combinar isso com a opção --args para obter o resultado que deseja:

open -a APP_NAME --args ARGS

Para abrir um vídeo no player VLC que deve ser dimensionado com um fator 2x e loop, você executaria, por exemplo:

open -a VLC --args -L --fullscreen

Observe que não consegui obter a saída dos comandos para o terminal. (embora eu não tenha tentado nada para resolver isso)

rien333
fonte
Você repetiu o open -aintencionalmente ?? Em qualquer caso, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllnão funciona para mim.
Pacerier
Perdoe-me, minha sintaxe está completamente errada por algum motivo. Vou atualizar agora.
rien333
2

Eu queria ter duas instâncias separadas do Chrome rodando, cada uma usando seu próprio perfil. Eu queria ser capaz de iniciá-los no Spotlight , como é meu hábito para iniciar aplicativos Mac. Em outras palavras, eu precisava de dois aplicativos regulares do Mac, regChromepara navegação normal ealtChrome para usar o perfil especial, para serem iniciados facilmente digitando ⌘-espaço para abrir o Spotlight, então 'reg' ou 'alt' e, em seguida, Enter.

Suponho que a forma de força bruta de atingir o objetivo acima seria fazer duas cópias do pacote de aplicativos do Google Chrome com os respectivos nomes. Mas isso é feio e complica a atualização.

Acabei com dois aplicativos AppleScript contendo dois comandos cada. Aqui está aquele para altChrome:

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

A segunda linha inicia o Chrome com o perfil alternativo (o --user-data-dir parâmetro).

A primeira linha é uma tentativa malsucedida de dar aos dois aplicativos ícones distintos. Inicialmente, parece funcionar bem. No entanto, mais cedo ou mais tarde, o Chrome relê seu arquivo de ícone e obtém o correspondente ao que quer que seja o último dos dois aplicativos que foi iniciado, resultando em dois aplicativos em execução com o mesmo ícone. Mas não me preocupei em tentar consertá-lo - mantenho os dois navegadores em desktops separados e navegar entre eles não tem sido um problema.

George
fonte
2

Começando com o OS X Yosemite , agora podemos usar AppleScript e Automator para automatizar tarefas complexas. JavaScript para automação agora pode ser usado como linguagem de script.

Esta página fornece um bom exemplo de script que pode ser escrito na linha de comando usando bash e modo interativo osascript . Ele abre uma guia Safari e navega para example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;
Mowzer
fonte
verifique o Editor / Janela / Biblioteca de Script para obter uma lista de aplicativos que possuem automação de applecript disponível. Estava procurando o Vysor, baseado no Chrome, e acho que preciso de um jeito diferente.
AnneTheAgile
Mais complexidade ftw!
Pacerier de
1

Com applecript:

tell application "Firefox" to activate
Keith
fonte
Como você passa argumentos para o Firefox? Por exemplo, -no-remote -P "Outro Perfil". Ao desenvolver add-ons e similares, é conveniente ter dois processos separados do Firefox usando dois perfis separados. Seu perfil normal e uma caixa de proteção para depurar sua extensão.
George
Acredito que você esteja se referindo a uma diretiva AppleScript, mas a questão é sobre como abrir a partir da linha de comando ...
conny
0

Por que não apenas definir o caminho de adição para o compartimento do aplicativo. Para MacVim, fiz o seguinte.

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

Um alias é outra opção que tentei.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

Com o PATH de exportação, posso chamar todos os comandos do aplicativo. Os argumentos passaram bem no meu teste com MacVim. Considerando o alias, tive que criar um alias para cada comando na caixa.

mvim README.txt
gvim Anotherfile.txt

Aproveite o poder do alias e do PATH. No entanto, você precisa monitorar as alterações quando o sistema operacional é atualizado.

zerocog
fonte
"Lembre-se de que o MacOS é baseado em Linux". Não, não é, o macOS e o Linux não compartilham uma única linha de código. MacOS é um UNIX com kernel baseado no FreeBSD.
Thomas de
Vai mudar. Não quero criar uma guerra religiosa. O objetivo era informar à comunidade que existem algumas opções poderosas que os usuários do MacOS podem utilizar.
zerocog
Claro, sem problemas! :)
Thomas
0

Simples, aqui substitua o "APP" pelo nome do aplicativo que deseja lançar.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

Me agradeça mais tarde.

Kiran Sk
fonte
0

Você pode iniciar aplicativos usando open:

open -a APP_YOU_WANT

Isso deve abrir o aplicativo que você deseja.

user13549667
fonte