Mac OS'de bir uygulamayı komut satırı bağımsız değişkenleriyle nasıl çalıştırabilirim?


60

Mac'teki bir uygulamaya komut satırı argümanları eklemenin kolay bir yolu var mı? Örneğin, Opera'yı kiosk modunda çalıştırmak veya Firefox'ta farklı bir profil kullanmak için yazabilirim.

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

Windows'ta, argümanları kısayol özelliklerine ekleyebilirim, ancak Mac'ler kısayol kullanmıyor ve uygulamaları doğrudan çalıştırıyorlar, bu mümkün değil.

Uygulamaların bash veya Applescript ile başlatılmasının kısmen işe yaradığını buldum:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Bunları çalıştırılabilir hale getirip bir simge atayabilirim ve bu sözde programlardan birini çalıştırdığımda, bir terminal penceresi veya bir Applescript simgesinin uygulama açık olduğu sürece açık kalması dışında her şey harika çalışıyor. Muhtemelen, Applescript komutunu kullanmak openbundan kaçınır, ancak uygulamayı paketlendiği gibi çalıştırmadığımdan (sadece /Applications/Firefox) çalışmaz.

Peki, uygulamaları komut satırı argümanları ile çalıştırmanın daha iyi bir yolu var mı? Değilse, uygulama açıkken kalıcı bir terminal oturumunun veya Applescript simgesinin açık kalmasını önlemenin bir yolu var mı?

Düzenle

Mozilla Wiki sayfasına göre , uygulamayı bağımsız değişkenlerle çalıştırmak için bir komut dosyası kullanmak en iyisidir. &Komut dosyasının sonuna bir a eklemek kalıcı Terminal penceresini öldürür. Şu andaki tek sıkıntı ölü, oturumu kapatılmış bir Terminal penceresi açmasıdır (kalıcı olandan daha iyidir, ama yine de ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &

2
Hala
bununla

&Bununla birlikte bir işi çalıştırdığınızda hala Terminal'e aittir, disown %/Applications/Firefox.app/Contents/MacOS/firefox onu çalıştırdıktan sonra satır ekleyerek düzeltebilirsiniz , sonra AppleScript kullanarak Terminal'i güvenle kapatabilirsiniz.
ocodo

Daniel'in cevabını arayın - bugün için en eksiksiz ve mükemmel (OSX 10.6.2 +).
cregox

Yanıtlar:


17

İşte en iyi çözümüm: Şunlarla bir Applescript oluşturun:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

Ve bir uygulama olarak kaydedin .

İlk bölümde ne olursa olsun ne olursa olsun uygulama koyabilirsiniz. &Komut dosyanızı + .app olarak adlandırdığınız her şeyi öldürmeniz gerektiğinden sonraki bölüm . Komut dosyası uygulamasının yuvada yanıp söndüğünü göreceksiniz, ancak daha sonra kaybolacak.

Not: Komut Dosyası, Komut Dosyası Düzenleyicisi'nden çalıştırıldığında, yalnızca oluşturduğunuz komut dosyası uygulamasından çalıştırıldığında düzgün çalışmaz.


Neredeyse çalışıyor. Hala Firefox örneğinin killall çalışana kadar yapılmasını bekliyor, Firefox'u kapattığımda hata ayıklayıcıyı çağırıyor ve komut dosyası uygulaması hala kaybolmuyor. Hmmm ...
Andrew

Bu tuhaf. Bir Uygulama olarak kaydediyor ve ardından Uygulamaya çift mi tıklıyorsunuz? Script Editor'dan çalıştırıldığında çalışmaz.
MJeffryes

Ayrıca, & 'nin önüne yeni bir satır yazdığımı farkettim. Varsa yeni satırı kaldırın
MJeffryes

Snow Leopard 10.6.x'te burada & killall'a gerek yok - ancak uygulamanın en kısa sürede kendini öldürmesini sağlamak için hiçbir yol bulamadı.
cregox

1
@Pacerier Bu cevaptaki tarihleri ​​kontrol edin.
MJeffryes

28

OS X 10.6.2'den başlayarak, open komutu --args bayrağı aracılığıyla açtığı uygulamaya argümanları iletebilir. Kullanmak için bir AppleScript şöyle görünür:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Bu size istediğiniz tüm davranışları vermelidir.


"adam aç" ve işte orada! bir cazibe gibi çalıştı. --args bayrağı ve sonra argümanlarınız.
Michael Dimmitt

1
--argsChrome ile denedim ve işe yaramadı. Sadece ilk örnek için işe yarayacak . --user-data-dirAynı anda iki tane çalıştırmayı denerseniz , bunu yapamazsınız openancak eski /applications...yöntemle çalıştırmanız gerekir . Neden --args işe yaramadığını bilen var mı?
Pacerier

1
@Pacerier, "open -n"
Simon Wright,

Buna eklemek için, komut dosyasını Komut Dosyası Düzenleyicisi'nde oluşturabilir ve ardından uygulama olarak kaydedebilirsiniz.
Kevin C.

11

Automator'ı açın ve tek bir Run Shell Script Komutu eylemiyle bir Uygulama oluşturun :

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Bu uygulama Firefox’u başlatır ve anında kapanır ve yalnızca Firefox çalışır durumda kalır.


Alternatif olarak, aşağıdaki AppleScript koduyla AppleScript Editor'ı kullanarak bir uygulama oluşturun :

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

Her ikisi de iyi çalışır ve Terminal veya bir komut dosyası uygulamasını bir saniyeden daha uzun süre çalışır durumda tutmaz. Automator kullanarak, isterseniz bir Servis bile oluşturabilirsiniz .


1
open --argsBob'un daha önce de belirtildiği gibi, bunun 10.6.2'de uygulandığını unutmayın .
cregox

Bunun için: open eclipse.app -nikinci bir Eclipse çalışma alanı açmak için. Çok kullanışlı. Teşekkürler!
jonalv

MacOS 10.14'te "Çalıştır Komut Dosyasını Çalıştır" eylemiyle Automator'da çalışamadı. Yine de AppleScript ile başarılı oldum.
Kevin C.

8

Bu eski bir tartışma, ancak yine de Google aramalarında karşımıza çıkıyor, bu yüzden birkaç tane add ekleyeceğimi düşündüm.

Yürütülebilir dosyanın mutlak yolundan ziyade "paket tanımlayıcısı" kullanmak daha iyidir:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Veya bir Apple Scriptinde:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Henüz anlamadığım şey, birincisi zaten açıldığında, farklı bir profile sahip yeni bir örnek / pencerenin nasıl açılacağı. (Eğer AppleScript'i yukarıda, sonra "Profil 2" olan bir başkası çalıştırırsam, Chrome yine de "Profil 1" olarak başka bir pencere açacaktır). :(


-B işlevsel olarak -a'ya eşit mi? Nasıl farklılar?
Pacerier

7

Bu senaryoda ana AppleScript uygulama işlemini (“applet”) öldürmek için killall (veya benzeri) kullanmak gerekli değildir (diğer bazı yanıtların önerdiği gibi) . Killall'a verilen ad / desen , yalnızca üst uygulama işleminden daha fazla eşleşirse (örneğin, aynı anda çalışan AppleScript uygulamalarını (model olarak “applet” kullanıyorsanız)) daha fazla eşleşirse , istenmeyen yan etkileri bile olabilir .

Gibi bir şey kill $PPIDdaha makul olabilir, ancak bir AppleScript uygulamasının uygulamasının her zaman kabuk komut dosyası tarafından başlatılan kabuğun hemen ebeveyni olduğunu varsaymak istemeyebiliriz . Neyse ki, ihtiyacınız olanı yapmak için mükemmel bir yol var.

Başına TN2065 ( “Ben bir arka plan sunucu işlemini başlatmak istiyor; ben kabuk komut dosyası komut tamamlanıncaya kadar beklemezler yapabilirim nasıl” altında), uygun yöntem stdout ve stderr yönlendirmek ve kabuk arka planda programı çalıştırmak sahip olmaktır .

Aşağıdaki programı bir AppleScript uygulaması olarak kaydetmek için Komut Dosyası Düzenleyici'yi kullanın :

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

("dar" tutmak için eklenmiş fonksiyonel satır sonları; isterseniz sil ¬ve \\hepsini bir uzun satıra koy)

Firefox'u başlatmak için yeterince uzun çalışacak ve Firefox çalışmaya devam ederken temiz bir şekilde çıkacaktır .

Yeniden yönlendirme gereklidir, çünkü sadece kabuk betiği hemen alt çocuğunun (kabuk) çıkmasını beklemekle kalmaz, aynı zamanda kabuğun stdout ve stderr için oluşturduğu boruların yazılabilir uçlarının (tüm örneklerini) bekler. . Kabuğun stdout ve stderr ( kabuk betiğinin borularını yapar), yeniden yönlendirme olmadan çalıştırdığı programlar tarafından miras alınır (arka planda çalışanlar bile &); Yeniden yönlendirme, kabuğun, boruların yazılabilir uçlarını tutan son kişi olmasını sağlar. Böylece, kabuk komut dosyası kabuk çıktıktan hemen sonra geri dönerek AppleScript uygulamasının kendisinin çıkmasına izin verir ( do kabuk komut dosyası AppleScript programındaki son ifade olduğu için).

Kullanan diğer cevaplar açıkkabuk komut dosyası yapmak için çalışmalarını açık (aslında LaunchServices) çıkan programı arkatasar ve başka yerlerde de stdout ve stderr gönderme eşdeğer çalışır.


bu çok ilginç. 10.6.2'den önce işe yarayıp yaramadığını merak ediyorum ... ama yine de kullanımı open --argsdaha temiz görünüyor. bunlardan herhangi birini kullanmanın bir sakıncası var mı?
cregox

1
Bu yöntemin 10.4'te işe yaradığını biliyorum. Benim izlenim benim kabuk komut dosyası her zaman böyle çalıştı ( Mac OS X 10.1 ile gelen AppleScript 1.7'deki Standart İlaveler OSAX'a eklendi ). 10.6 kabul etmeye istekli iseniz , muhtemelen iyi. open --args
Chris Johnsen

@ChrisJohnsen, Link down ........
Pacerier

4

AppleScript

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Orada iki puan.

  1. Uzay, tekrar ters eğik çizgiden kaçan ters eğik çizgiden kaçar
  2. killall uygulaması sorunlara neden olabilir, çünkü çalışan diğer uygulamalar olabilir
  3. Program olarak kaydet

Ancak 10.6.5'te iyi çalışıyor


appletifade eder?
Pacerier

3

Aşağıdakiler, .app'ın kendisi için komut satırı argümanlarını belirtmenize izin vermelidir:

.App paketini sağ tıklayın, "Paket İçeriğini Göster" i seçin, Info.plist'e gidin, çift tıklayın, Args anahtarını bulun, düzenleyin.

Şu anda kullanışlı bir OS X makinem yok, bu yüzden bunu başka bir takma adla da yapıp yapamayacağınızı kontrol edemiyorum (orijinal .app argümansız, et cetera'yı saklamak istiyorsanız).


Ne yazık ki pistte hiçbir kilit anahtarı yok. Mozilla’ya göre, bir komut dosyası kullanmanız gerekiyor - wiki.mozilla.org/MailNews:Logging#Mac
Andrew

Ayrıca, paket içeriğinin (Info.plist gibi) değiştirilmesinin kod imzasıyla ilgili sorunlara neden olabileceğini unutmayın
drevicko

2

Uygulamanızı bir AppleScript başlatıcısının içine sarın.

İşte adımlar.

  1. Aşağıdaki içeriğe sahip bir AppleScript oluşturun ve bunu bir uygulama olarak kaydedin (bu örnekte "Firefox 3 launcher.app" olarak adlandırılmıştır).

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Finder'daki uygulamaya geçtiniz, sağ tıklayın, paket içeriğini gösterin.

  3. Uygulamanızı paket içeriğinin kök dizinine yerleştirin. (Bu örnekte "Firefox 3.app" olur)

    Sonuç: / Uygulamalar / Firefox 3 launcher.app/Firefox 3.app

  4. Şimdi uygulama başlatıcınızı açabilirsiniz.

Notlar:

  • Sarılmış uygulamanın otomatik güncellemeleri çoğu durumda çalışmalıdır.
  • Kaydırılan uygulamaya otomatik olarak yönlendirilen (biraz daha fazla komut dosyasıyla) başlatıcıya herhangi bir sürükle ve bırak işlemi yapmak mümkün olmalıdır.
  • Sarılmış uygulama başlatıldıktan sonra başlatıcı otomatik olarak çıkar.
  • Bu yöntemin bir avantajı, sarılmış uygulamayı doğrudan açma riskinin az olmasıdır.

1

Neden kullanmıyorsun:

#!/bin/sh
open /Applications/Firefox.app

Basit ama işe yarıyor.


2
Bunu yaparsanız terminal açılacaktır.
MJeffryes

0

openKomut isteğe bağlı sahiptir --argsdeğer bağımsız değişkenleri olarak açılan uygulamaya geçirilir var argüman. Örneğin:

open /Applications/TextEdit.app --args example.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.