Jak przekazać argumenty wiersza polecenia do elementów Docku?

Odpowiedzi:

96

Masz w zasadzie dwie opcje:

Opcja 1 : użyj Automatora, aby utworzyć aplikację, która w rzeczywistości uruchamia Chrome z argumentami wiersza poleceń.

Uruchom Automator i wybierz, aby utworzyć aplikację . Kliknij dwukrotnie opcję Uruchom skrypt powłoki w folderze Biblioteka / Narzędzia i zamień zawartość tekstową - cat- na:

open -a "Google Chrome.app" --args -pinned-tab-count=4
# keep the .app suffix or will break with Parallels

Zapisz gdziekolwiek chcesz.

Aby zastąpić ikonę tej aplikacji, uzyskaj informacje o swojej prawdziwej przeglądarce Google Chrome, kliknij ikonę w lewym górnym rogu, naciśnij Cmd-C, Uzyskaj informacje o aplikacji Chrome Automator, kliknij ikonę i naciśnij Cmd-V.

Ponieważ jest to inna aplikacja, Dock wyświetli dwie uruchomione aplikacje Chrome: Chrome i program uruchamiający Chrome.


Opcja 2 : Edytuj pakiet aplikacji, aby zamiast tego uruchomić skrypt. Ten skrypt uruchomi rzeczywistą aplikację, dodając argument wiersza poleceń.

Kliknij prawym przyciskiem myszy Google Chrome.appi wybierz opcję Pokaż zawartość opakowania . Przejdź do Contents/i otwórz Info.plistw edytorze list właściwości / Xcode (narzędzia programistyczne Apple) lub plistedytorze innej firmy .

Poszukaj wpisu CFBundleExecutablelub Executable File. Zapamiętaj jego wartość (np. firefox-binDla Firefoksa). Zamień na parameterized-app.sh.

Otwórz terminal i wprowadź następujące dane:

touch /Applications/Firefox.app/Contents/MacOS/parameterized-app.sh
open /Applications/Firefox.app/Contents/MacOS/parameterized-app.sh

.shOtworzy się edytor pliku. Ustaw zawartość pliku na:

#!/usr/bin/env bash
exec /Applications/Firefox.app/Contents/MacOS/firefox-bin -ProfileManager

(używając rzeczywistej nazwy pliku wykonywalnego, z którego usunięto Info.plist, dodając żądane argumenty wiersza poleceń)

Zapisz i zamknij. W terminalu wprowadź następujące dane:

chmod +x /Applications/Firefox.app/Contents/MacOS/parameterized-app.sh

Teraz zamknij Terminal i przenieś aplikację (która nie może być teraz uruchomiona) do innego folderu i ponownie. Spowoduje to zaktualizowanie usług uruchamiania , w przeciwnym razie twoje zmiany zostaną zignorowane i irytują cię bardzo.

Teraz, kiedy otworzysz aplikację, faktycznie wykona ona .shplik, co z kolei uruchomi plik wykonywalny, wysyłając argumenty wiersza poleceń.

Będzie wyglądał i zachowywał się tak, jak się tego spodziewasz, ale będziesz musiał powtórzyć to przy każdej aktualizacji aplikacji, ponieważ zasadniczo zastąpi to pakiet aplikacji i wszystkie wprowadzone zmiany.

Daniel Beck
źródło
Z jakiegoś powodu mój Chrome 10 ignoruje argument wiersza poleceń i automatycznie przypina karty, które zostały przypięte w poprzedniej sesji. Nie wiem, co tu jest nie tak, ponieważ nie jestem użytkownikiem Chrome i nie wiem, jak ma się zachowywać.
Daniel Beck
6
„przenieś aplikację do innego folderu i wróć z powrotem” powinno być pogrubione - całkowicie pominięte przy pierwszym czytaniu :)
stephanos
1
Czy istnieje sposób na aktualizację / zresetowanie / ponowne uruchomienie usług uruchamiania za pomocą polecenia powłoki, abyś nie musiał przenosić aplikacji z powrotem? tzn. aby ten krok był łatwo skryptowalny?
Jordan Brough
1
@Jordan Brough Możesz użyć narzędzia lsregister, aby wymusić aktualizację LaunchServices:/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Hello\ World.app
Czy Ross
1
Oczywiście opcja 2 działa tylko w aplikacjach innych niż CodeSign. Jeśli pochodzi z Apple lub App Store, jest podpisany przeciwko zmianom. Zatrzyma to nawet zmiana Info.plist. W takim przypadku pomogłaby prosta aplikacja stub / wrapper.
cde
10

Możesz napisać skrypt, który uruchamia Chrome, ale nie byłaby to ikona aplikacji w doku i spowodowałaby wyświetlenie oddzielnej ikony Chrome. Musisz więc stworzyć pakiet aplikacji.

Najpierw zrób kopię swojej aplikacji Chrome. Istnieją dwa podejścia, które mogą zadziałać; Nie jestem pewien, która gra lepiej w Mac OS X i / lub w automatycznej aktualizacji Chrome.

  1. Zrób „program uruchamiający”, który po prostu wywołuje Chrome z argumentami.

    • Otwórz pakiet aplikacji (kliknij prawym przyciskiem myszy → Pokaż zawartość pakietu w Finderze) i wyrzuć wszystko oprócz Info.plist, PkgInfo i MacOS.
    • W folderze MacOS usuń plik wykonywalny „Google Chrome” i zastąp go skryptem powłoki, który wywołuje prawdziwego Chrome:

      #!/bin/sh
      exec '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' -pinned-tab-count=4
      

      Nie zapomnij o chmod +xskrypcie.
       

  2. Zmodyfikuj faktycznie uruchomiony pakiet Chrome.

    • W folderze MacOS zmień nazwę „Google Chrome” i napisz skrypt powłoki, który wywołuje rzeczywistość z dodatkowymi argumentami:

      #!/bin/sh
      exec '/Applications/My Modified Google Chrome.app/Contents/MacOS/Google Chrome-real' -pinned-tab-count=4
      
    • Widzę, że pakiet Chrome ma coś do podpisania kodu; może być konieczne usunięcie CodeResourcesi / lub _CodeSignatureuruchomienie go z tymi zmianami.

Wszystko to opiera się na mojej wiedzy na temat pakietów aplikacji dla komputerów Mac; W szczególności nie testowałem tych zmian w Chrome. Możliwe jest nawet, że plik wykonywalny Chrome na Macu nie obsługuje tej opcji, ponieważ generalnie nie oczekuje się, że aplikacje Mac będą działać z kontrolowanymi opcjami wiersza poleceń (w przeciwieństwie do, na przykład, systemu Windows, w którym aplikacje są zwykle uruchamiane za pomocą skrótów, które mogą mają osadzone opcje).

Kevin Reid
źródło
Parametry obsługi Chrome, właśnie zautomatyzowałem moje zgodnie z instrukcją nr 2. Rzeczywiście musisz podać pełną ścieżkę do pliku binarnego i nie zapomnij chmod 755 Google\ Chrome(swojego skryptu) po zakończeniu. Właściwie nazwałem swój skrypt launch.sh i dowiązałem go symbolicznie do Google \ Chrome, aby ułatwić aktualizację.
Orwellophile,
Należy pamiętać, że modyfikowanie zawartości pakietu powoduje problemy z podpisywaniem kodu, co powoduje dziwne problemy, takie jak https, które nie działają poprawnie: bridge.grumpy-troll.org/2011/01/…
drevicko