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?


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.


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


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).


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

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


@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ć)


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.


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;

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

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.


„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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.