2009-08-20 13 views
90

Chcę uruchomić aplikację na OSX ze skryptu. Muszę przekazać mu argumenty wiersza poleceń. Niestety, open nie akceptuje argumentów linii poleceń.Uruchom aplikację na OS X z linii poleceń

Jedyną opcją, o której mogę pomyśleć, to użycie aplikacji nohup myApp > /dev/null & do uruchomienia aplikacji, aby mogła istnieć niezależnie od skryptu, który ją uruchamia.

Jakieś lepsze sugestie?

+0

Nie mogę odpowiedzieć na pytanie. "open" nie akceptuje argumentów wiersza poleceń? Co to jest "otwarty"? Czy to jest AppleScript otwarty? W jaki sposób 'nohup &' rozwiązuje problem? –

+4

człowiek otwarty (1) - Polecenie OS X do uruchamiania plików lub aplikacji –

+3

To powinno być na superuser.com –

Odpowiedz

58

W OS X 10.6, komenda open została wzmocniona, aby umożliwić przekazywanie argumentów do wniosku:

open ./AppName.app --args -AppCommandLineArg 

ale dla starszych wersji systemu Mac OS X, a ponieważ pakiety aplikacji nie mają być przekazywane argumenty wiersza poleceń, konwencjonalnym mechanizmem jest użycie Apple Events dla plików takich jak here dla aplikacji Cocoa lub here dla aplikacji Carbon. Możesz też prawdopodobnie zrobić coś kludgey, przekazując parametry w zmiennych środowiskowych.

+0

Moje podejście kludgey polega na wywoływaniu pliku wykonywalnego bezpośrednio za pomocą argumentów linii poleceń za pomocą nohup - jeśli środowisko-vars-kludge mniej kludgey? – psychotik

+2

Prawdopodobnie nie. Jeśli to działa dla ciebie, idź z tym. Większy punkt jest taki, że open (1) jest odpowiednikiem cli tego, co dzieje się, gdy użytkownik wykonuje dwukrotne kliknięcie lub "Otwórz" w Finderze i żaden z tych mechanizmów nie obsługuje konwencjonalnych argumentów wiersza poleceń. –

+0

+1: Nie powinieneś używać argumentów wiersza poleceń dla aplikacji GUI systemu Mac OS X. –

29

Pakiet aplikacji (plik .app) jest w rzeczywistości zbiorem katalogów. Zamiast używać nazwy open i .app, możesz się do niej wprowadzić i uruchomić właściwy plik binarny. Na przykład:

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

To jest rzeczywisty binarnego, który może przyjąć argumentów (lub nie, w przypadku LittleSnapper „s).

+3

Binarny przyjmuje argumenty, jestem pewien. Napisałem to. Wywołanie "otwartego" nie pozwala na przekazywanie argumentów. Jestem tego całkiem pewien. I tak, mój skrypt nazywa bezpośrednio "open binary", nie próbując otworzyć pakietu. – psychotik

+0

@psychotik: On nie mówi, aby zadzwonić "otwarty plik binarny". Mówi, aby bezpośrednio wykonać plik binarny. – Chuck

+0

To nie zadziała dla mnie. Bezpośrednie wykonywanie binarnych wyników to proces potomny mojego skryptu, którego zdecydowanie nie chcę. Stąd potrzeba użycia open/nohup – psychotik

4

Polecam technikę, którą oferuje MathieuK. W moim przypadku musiałem spróbować z Chromium:

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

Zdaję sobie sprawę, to nie rozwiąże problemu PO, ale miejmy nadzieję, że oszczędza cudzego czasu. :)

+0

Ale musisz zachować Terminal otwarty ... – Pacerier

+0

@Pacerier Dodaj "&" na końcu tego polecenia. Uruchomi się w tle. Następnie możesz zamknąć okno terminala, a aplikacja prawdopodobnie pozostanie otwarta. –

98

Jak wspomniano w pytaniu here, komenda w 10,6 open ma teraz args flagę, więc można zadzwonić:

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

+0

Działa dokładnie tak, jak było to wymagane. Dzięki – Durgesh

+0

To zadziałało i pozwoliło mi ustawić alias zsh dla Chromium. Dzięki – jamescampbell

+0

Ta odpowiedź jest wspaniała. Chciałem tylko dodać, że kiedy po raz pierwszy otwierasz Terminal, będziesz w swoim katalogu domowym, więc wpisz go w ten sposób, aby nie musieć przełączać się do katalogu aplikacji. Chciałem uruchomić Gimpa bez ładowania czcionek, co trwa wiecznie, więc wpisuję to za pomocą przełącznika -f, aby pominąć czcionki: open -n /Aplikacje/GIMP.app --args -f –

1

Z AppleScript:

tell application "Firefox" to activate 
+0

W jaki sposób przekazujesz argumenty do Firefoksa ? Np. -no-remote -P "Inny profil". Podczas opracowywania dodatków i podobnych, wygodne jest posiadanie dwóch oddzielnych procesów Firefoksa z wykorzystaniem dwóch osobnych profili. Twój normalny profil i piaskownica do debugowania rozszerzenia. – George

+0

Wydaje mi się, że odnosisz się do dyrektywy AppleScript, ale pytanie dotyczy otwierania z wiersza poleceń ... – conny

13

W Jeśli twoja aplikacja musi pracować nad plikami (to, co normalnie spodziewałbyś się przekazać jako: ./myApp *.jpg), zrobiłbyś to tak:

open *.jpg -a myApp 
+0

To jest dokładnie to, czego szukałem! Moja instancja, na przykład: 'open something.py -a Eclipse.app' – Eric

1

Chciałem mieć uruchomione dwa oddzielne wystąpienia przeglądarki Chrome, z których każda korzysta z własnego profilu. Chciałem zacząć je od Spotlight, tak jak mam zwyczaj uruchamiania aplikacji na Maca. Innymi słowy, potrzebowałem dwóch zwykłych aplikacji na Macintosha, regChrome do normalnego przeglądania i altChrome, aby użyć specjalnego profilu, aby łatwo rozpocząć od naciśnięcia klawisza ⌘, aby wywołać Spotlight, następnie "reg" lub "alt", a następnie Enter.

Przypuszczam, że brutalnym sposobem na osiągnięcie powyższego celu byłoby utworzenie dwóch kopii pakietu aplikacji Google Chrome pod odpowiednimi nazwami. Ale to jest brzydkie i komplikuje aktualizację.

W rezultacie otrzymałem dwie aplikacje: AppleScript zawierające po dwa polecenia.Oto jeden dla 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 &" 

Druga linia zaczyna Chrome z alternatywnego profilu (parametr --user-data-dir).

Pierwsza linia to nieudana próba nadania dwóm aplikacjom różnych ikon. Początkowo wydaje się działać dobrze. Jednak prędzej czy później Chrome ponownie odczytuje swój plik z ikoną i pobiera ten odpowiadający tej ostatniej z dwóch aplikacji, w wyniku czego powstają dwie uruchomione aplikacje z tą samą ikoną. Ale nie zadałem sobie trudu, aby to naprawić - dwie przeglądarki trzymam na osobnych pulpitach, a nawigacja między nimi nie stanowiła problemu.

+0

Mac jest spieprzony. Izolacja i sandboxing to podstawowe zasady Użyteczności, Bezpieczeństwa i Solidności. W każdym razie dlaczego nie działa 'open --args'? Czy używanie 'do powłoki powłoki' jest jedyną metodą? – Pacerier

2

Począwszy od OS X Yosemite, możemy teraz używać AppleScript i Automator do automatyzacji złożonych zadań. JavaScript do automatyzacji może być teraz używany jako język skryptowy.

This page gives a good example example script, które można zapisać w wierszu poleceń, używając trybu interaktywnego bash i osascript. Otwiera zakładkę Safari i przechodzi do 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; 
+0

sprawdź Edytor skryptów/okno/biblioteka, aby wyświetlić listę aplikacji, które mają dostępną automatyzację skryptów. Szukałem Vysora, opartego na Chrome, i myślę, że potrzebuję innego sposobu. – AnneTheAgile

+0

Większa złożoność! – Pacerier

1

open posiada również -a flag, które można użyć, aby otworzyć aplikację od wewnątrz folder Aplikacje według jego nazwy (lub przez identyfikator pakietu z flagą -b). Można połączyć to z opcją --args do osiągnięcia rezultatu chcesz:

open -a APP_NAME --args ARGS 

Aby otworzyć film w odtwarzaczu VLC, które powinny skalę z 2x czynników i pętli byś na przykład exectute:

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

Zauważ, że nie mogłem uzyskać wyjścia poleceń do terminala. (chociaż nie próbowałem niczego, aby rozwiązać ten problem)

+0

Czy powtórzyłeś celowo "otwarty -a"? W każdym razie 'open -a/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --args --user-data-dir =/Users/an/userll' nie działa dla mnie. – Pacerier

+0

Przepraszam, moja składnia jest całkowicie wyłączona z jakiegoś powodu. Zaktualizuję teraz. – rien333

Powiązane problemy