Uruchom aplikację na OS X za pomocą wiersza poleceń

109

Chcę uruchomić aplikację na OSX ze skryptu. Muszę przekazać to argumenty wiersza poleceń. Niestety, opennie akceptuje argumentów wiersza poleceń.

Jedyną opcją, o nohup myApp > /dev/null &której przychodzi mi do głowy, jest uruchomienie mojej aplikacji, aby mogła istnieć niezależnie od skryptu, który ją uruchamia.

Jakieś lepsze sugestie?

psychotyków
źródło
Nie mogę odpowiedzieć na pytanie. „open” nie akceptuje argumentów wiersza poleceń? Co jest „otwarte”? Czy to jest otwarty AppleScript? Jak nohup &rozwiązuje problem?
S.Lott,
4
man open (1) - polecenie OS X do uruchamiania plików lub aplikacji
Ned Deily
3
To powinno być na superuser.com
Jeff Meatball Yang

Odpowiedzi:

78

W systemie OS X 10.6 openpolecenie zostało rozszerzone, aby umożliwić przekazywanie argumentów do aplikacji:

open ./AppName.app --args -AppCommandLineArg

Ale w przypadku starszych wersji systemu Mac OS X i ponieważ pakiety aplikacji nie są zaprojektowane do przekazywania argumentów wiersza poleceń, konwencjonalnym mechanizmem jest użycie zdarzeń Apple dla plików, takich jak tutaj dla aplikacji Cocoa lub tutaj dla aplikacji Carbon. Możesz też prawdopodobnie zrobić coś niezręcznego, przekazując parametry przy użyciu zmiennych środowiskowych.

Ned Deily
źródło
Moje podejście polega na wywołaniu pliku wykonywalnego bezpośrednio za pomocą argumentów wiersza poleceń przy użyciu nohup - jeśli environment-vars-kludge jest 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 się dzieje, gdy użytkownik kliknie dwukrotnie lub „Otwórz” w Finderze i żaden z tych mechanizmów nie obsługuje konwencjonalnych argumentów wiersza poleceń.
Ned Deily
+1: Nie powinieneś używać argumentów wiersza poleceń dla aplikacji GUI systemu Mac OS X.
S.Lott,
2
powiedz Google, aby nie używał argumentów wiersza poleceń, 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. "Czemu?" Czy przeczytałeś odpowiedź? „Konwencjonalny mechanizm polega na korzystaniu z Apple Events w przypadku plików takich jak tutaj dla aplikacji Cocoa lub tutaj dla aplikacji Carbon”. Tak zaprojektowano Mac OS X. Tak. Chrome łamie zasady. Tak samo jest z każdym narzędziem wiersza poleceń Linuksa. Ale aplikacje GUI otwierane za pomocą open- jak mówi odpowiedź - nie są zaprojektowane do pracy z wiersza poleceń. "Czemu?" Ponieważ taki właśnie jest Mac OS X.
S.Lott,
105

Jak wspomniano w pytaniu tutaj The openpolecenie 10.6 ma teraz argsflagę, więc można zadzwonić:

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

John McDonnell
źródło
Działa dokładnie tak, jak było to wymagane. Dzięki
DTdev
To zadziałało i pozwoliło mi ustawić alias zsh dla Chromium. Dzięki
jamescampbell
Ta odpowiedź jest świetna. Chciałem tylko dodać, że kiedy po raz pierwszy otworzysz Terminal, będziesz w swoim katalogu domowym, więc wpisz to 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 z przełącznikiem -f, aby pominąć czcionki: open -n /Applications/GIMP.app --args -f
James Toomey
32

Pakiet aplikacji ( .appplik) to w rzeczywistości zbiór katalogów. Zamiast używać openi .appnazwy, możesz do niego wejść i uruchomić właściwy plik binarny. Na przykład:

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

To jest rzeczywisty plik binarny, który może akceptować argumenty (lub nie, w LittleSnapperprzypadku).

NSSec
źródło
3
Jestem pewien, że plik binarny akceptuje argumenty. Napisałem to. Wywołanie „open” nie pozwala na przekazywanie argumentów. Jestem tego całkiem pewien. I tak, mój skrypt bezpośrednio wywołuje „otwarty plik binarny”, nie próbując otworzyć pakietu.
psychotik
@psychotik: Nie mówi, żeby nazywać „otwarty plik binarny”. Mówi, aby bezpośrednio uruchomić plik binarny.
Chuck
To nie zadziała dla mnie. Bezpośrednie wykonanie pliku binarnego powoduje, że jest to proces potomny mojego skryptu, czego zdecydowanie nie chcę. Stąd potrzeba użycia open / nohup
psychotik
1
Jeśli jest to skrypt powłoki, użyj polecenia „exec”, aby zastąpić proces skryptu rzeczywistym plikiem wykonywalnym.
Jonathan Leffler
2
Takie podejście ma poważną wadę: jeśli pakiet zawiera biblioteki niestandardowych i ram, trzeba pobawić się DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

W przypadku, gdy Twoja aplikacja musi działać na plikach (co normalnie powinien być przekazane jako:) ./myApp *.jpg, możesz to zrobić w następujący sposób:

open *.jpg -a myApp
89%
źródło
To jest dokładnie to, czego szukałem! Moja instancja, na przykład: open something.py -a Eclipse.app
Eric
4

Poleciłbym technikę, którą oferuje MathieuK. W moim przypadku musiałem wypróbować to z Chromium:

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

Zdaję sobie sprawę, że to nie rozwiązuje problemu OP, ale mam nadzieję, że oszczędza to czas kogoś innego. :)

Paul Irish
źródło
@Pacerier Dodaj `&` na końcu tego polecenia. Uruchomi się w tle. Następnie możesz zamknąć okno terminala, a aplikacja prawdopodobnie pozostanie otwarta.
Paul Irish,
2

openma również flagę -a, której można użyć do otwarcia aplikacji z folderu Aplikacje według jej nazwy (lub według identyfikatora pakietu z flagą -b). Możesz to połączyć z opcją --args, aby osiągnąć żądany wynik:

open -a APP_NAME --args ARGS

Aby otworzyć wideo w odtwarzaczu VLC, które powinno skalować się ze współczynnikiem 2x i zapętlić, możesz na przykład wykonać:

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

Zauważ, że nie mogłem uzyskać danych wyjściowych poleceń na terminalu. (chociaż nie próbowałem niczego, aby to rozwiązać)

rien333
źródło
Czy open -acelowo powtórzyłeś ?? W każdym razie open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userlldla mnie nie działa.
Pacerier,
Przepraszam, moja składnia jest z jakiegoś powodu całkowicie wyłączona. Zaktualizuję teraz.
rien333
2

Chciałem mieć uruchomione dwie oddzielne instancje Chrome, każda z własnym profilem. Chciałem móc je uruchamiać ze Spotlight , tak jak mam zwyczaj uruchamiania aplikacji na Maca. Innymi słowy, potrzebowałem dwóch zwykłych aplikacji na Maca, regChromedo normalnego przeglądania i altChromekorzystania ze specjalnego profilu, aby móc je łatwo uruchomić, naciskając klawisz-spacji, aby wywołać Spotlight, a następnie „reg” lub „alt”, a następnie Enter.

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

Skończyło się na dwóch aplikacjach AppleScript zawierających 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 uruchamia Chrome z alternatywnym profilem ( --user-data-dirparametrem).

Pierwsza linia to nieudana próba nadania obu aplikacjom odrębnych ikon. Początkowo wydaje się, że działa dobrze. Jednak prędzej czy później Chrome ponownie odczytuje plik ikony i pobiera plik odpowiadający tej, która z dwóch aplikacji została uruchomiona jako ostatnia, w wyniku czego dwie uruchomione aplikacje mają tę samą ikonę. Ale nie zadałem sobie trudu, aby to naprawić - trzymam dwie przeglądarki na osobnych pulpitach, a nawigacja między nimi nie stanowi problemu.

George
źródło
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.

Ta strona zawiera dobry przykładowy skrypt, który można napisać w wierszu poleceń przy użyciu trybów interaktywnych bash i osascript . Otwiera kartę 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;
Mowzer
źródło
sprawdź Script Editor / Window / Library, aby zobaczyć listę aplikacji, które mają dostępną automatyzację applecript. Szukałem Vysora opartego na Chrome i myślę, że potrzebuję innego sposobu.
AnneTheAgile
Większa złożoność ftw!
Pacerier,
1

Ze skryptem jabłkowym:

tell application "Firefox" to activate
Keith
źródło
Jak przekazuje się argumenty do przeglądarki Firefox? Np. -No-remote -P "Inny profil". Podczas tworzenia dodatków itp. Wygodnie jest mieć dwa oddzielne procesy Firefoksa korzystające z dwóch oddzielnych profili. Twój normalny profil i piaskownica, w której możesz debugować rozszerzenie.
George
Wydaje mi się, że odnosisz się do dyrektywy AppleScript, ale pytanie dotyczy otwierania z wiersza poleceń ...
conny
0

Dlaczego nie ustawić ścieżki dodawania do kosza aplikacji. W przypadku MacVima wykonałem następujące czynności.

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

Alias ​​to kolejna opcja, którą wypróbowałem.

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

Dzięki PATH eksportu mogę wywoływać wszystkie polecenia w aplikacji. Argumenty przeszły pomyślnie mój test z MacVimem. Podczas gdy alias, musiałem aliasować każde polecenie w koszu.

mvim README.txt
gvim Anotherfile.txt

Ciesz się mocą aliasów i PATH. Jednak musisz monitorować zmiany po uaktualnieniu systemu operacyjnego.

zerocog
źródło
„Pamiętaj, że MacOS jest oparty na systemie Linux”. Nie, nie, macOS i Linux nie współdzielą ani jednej linii kodu. MacOS to UNIX z jądrem opartym na FreeBSD.
Thomas
Ulegnie zmianie. Nie chcę tworzyć wojny religijnej. Celem było poinformowanie społeczności, że istnieją potężne opcje, z których mogą korzystać użytkownicy MacOS.
zerocog
Pewnie nie ma problemu! :)
Thomas,
0

Proste, tutaj zastąp „APP” nazwą aplikacji, którą chcesz uruchomić.

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

Dzięki mi później.

Kiran Sk
źródło
0

Możesz uruchamiać aplikacje za pomocą open:

open -a APP_YOU_WANT

Powinno to otworzyć żądaną aplikację.

użytkownik13549667
źródło