OS X'te komut satırıyla bir uygulama başlatın


110

Bir komut dosyasından OSX'te bir uygulama başlatmak istiyorum. Komut satırı argümanlarını iletmem gerekiyor. Maalesef openkomut satırı değiştirgelerini kabul etmiyor.

Aklıma gelen tek seçenek, nohup myApp > /dev/null &uygulamamı başlatmak için kullanmaktır , böylece onu başlatan komut dosyasından bağımsız olarak var olabilir.

Daha iyi bir öneriniz var mı?


Soruyu takip edemiyorum. "open" komut satırı değiştirgelerini kabul etmiyor mu? "Açık" nedir? Bu AppleScript açık mı? nohup &Problemi nasıl çözer?
S.Lott

4
man open (1) - dosyaları veya uygulamaları başlatmak için OS X komutu
Ned Deily

3
Bu superuser.com'da olmalı
Jeff Meatball Yang

Yanıtlar:


79

OS X 10.6'da openkomut, argümanların uygulamaya aktarılmasına izin verecek şekilde geliştirildi:

open ./AppName.app --args -AppCommandLineArg

Ama Mac OS X eski sürümleri için, uygulama paketleri komut satırı argümanları geçirilecek tasarlanmamıştır ve çünkü geleneksel mekanizma kullanmaktır Elma Olaylar dosyaları gibi için buraya Kakao uygulamaları veya için buraya Karbon uygulamalar için. Ayrıca, ortam değişkenlerini kullanarak parametreleri ileterek de kludgey bir şeyler yapabilirsiniz.


Benim kludgey yaklaşımım, çalıştırılabilir dosyayı nohup kullanarak doğrudan komut satırı argümanlarıyla çağırmaktır - eğer ortam-vars-kludge daha az kludgey ise?
psychotik

2
Muhtemelen değil. Sizin için çalışıyorsa, onunla gidin. Daha büyük olan nokta, open (1) 'in, bir kullanıcı Finder'da bir çift tıklama veya "Open" yaptığında ve bu mekanizmalardan hiçbiri geleneksel komut satırı argümanlarını desteklemediğinde olanın cli eşdeğeridir.
Ned Deily

+1: Mac OS X GUI uygulamaları için komut satırı bağımsız değişkenleri kullanmamalısınız.
S.Lott

2
google'a komut satırı bağımsız değişkenlerini, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - kullanmamasını söyleyin -force-fieldtest
Anurag Uniyal

@Anurag Üniyal. "Neden?" Cevabı okudun mu "geleneksel mekanizma, Cocoa uygulamaları için buradaki veya Carbon uygulamaları için buradaki gibi dosyalar için Apple Events'i kullanmaktır." Mac OS X'in tasarlanma şekli budur. Evet. Chrome, kuralları çiğniyor. Linux komut satırı araçlarının her biri de öyle. Ancak, birlikte açılan GUI uygulamaları open- yanıtın da söylediği gibi - komut satırından çalışmak üzere tasarlanmamıştır. "Neden?" Çünkü Mac OS X böyle.
S.Lott

105

Söz konusu bahsedildiği gibi burada , open10.6 komut artık sahip argsArayabileceğin böylece, bayrak:

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


Tam olarak gerektiği gibi çalışıyor. Teşekkürler
DTdev

Bu işe yaradı ve Chromium için bir zsh takma adı belirlememe izin verdi. Teşekkürler
jamescampbell

Bu cevap harika. Terminal'i ilk açtığınızda ana dizininizde olacağınızı eklemek istedim, bu nedenle bu şekilde yazın, böylece Uygulama dizinine geçmenize gerek kalmaz. Gimp'i yazı tiplerini yüklemeden çalıştırmak istedim, bu sonsuza kadar sürer, bu yüzden yazı tiplerini atlamak için bunu -f anahtarıyla yazıyorum: open -n /Applications/GIMP.app --args -f
James Toomey

32

Bir uygulama paketi (bir .appdosya) aslında bir grup dizindir. openVe .appadını kullanmak yerine, aslında ona geçebilir ve gerçek ikiliyi başlatabilirsiniz. Örneğin:

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

Bu, argümanları kabul edebilen (veya LittleSnapperdurumunda kabul etmeyen) gerçek ikili dosyadır .


3
İkili argümanları kabul eder, eminim. Ben yazdım. 'Açık'ı çağırmak, değişkenlerin iletilmesine izin vermez. Bundan oldukça eminim. Ve evet, betiğim paketi açmaya çalışmadan doğrudan 'ikili aç' çağırıyor.
psychotik

@psychotik: "Açık ikili" diyelim demiyor. Doğrudan ikili çalıştırmayı söylüyor.
Chuck

Bu benim için işe yaramaz. İkili sonuçları doğrudan yürütmek, betiğimin alt süreci olmasına neden oluyor ki bu kesinlikle istemiyorum. Bu nedenle open / nohup kullanma ihtiyacı
psychotik

1
Bu bir kabuk betiğiyse, betik sürecini gerçek yürütülebilir dosya ile değiştirmek için 'exec' kullanın.
Jonathan Leffler

2
Bu yaklaşım önemli bir dezavantajı var: bohça özel kütüphaneler ve çerçeveler içeriyorsa, keman gerekir DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko

14

Uygulamanızın dosyalar üzerinde çalışması gerektiğinde (normalde geçmesini beklediğiniz şey:) ./myApp *.jpg, bunu şu şekilde yaparsınız:

open *.jpg -a myApp

Bu tam olarak aradığım şeydi! Örneğim, örneğin: open something.py -a Eclipse.app
Eric

4

MathieuK'nin sunduğu tekniği tavsiye ederim. Benim durumumda, Chromium ile denemem gerekiyordu:

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

Bunun OP'nin sorununu çözmediğinin farkındayım, ancak umarım başkasının zamanından tasarruf sağlar. :)


@Pacerier Bu komutun sonuna bir & `ekleyin. Arka planda başlayacak. Daha sonra terminal pencerenizi kapatabilirsiniz ve uygulama muhtemelen hala açık kalacaktır.
Paul Irish

2

openAyrıca bir uygulamayı Uygulamalar klasöründen adına göre (veya -b işaretli paket tanımlayıcısına göre) açmak için kullanabileceğiniz bir -a bayrağı da vardır. İstediğiniz sonucu elde etmek için bunu --args seçeneğiyle birleştirebilirsiniz:

open -a APP_NAME --args ARGS

VLC oynatıcıda 2x faktör ve döngü ile ölçeklenmesi gereken bir videoyu açmak için, örneğin şunları yapmalısınız:

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

Komutların çıktısını terminale alamadığımı unutmayın. (bunu çözmek için hiçbir şey denememiş olsam da)


Bunu open -akasıtlı olarak tekrarladınız mı ? Her durumda open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllbenim için çalışmıyor.
Pacerier

Affedersiniz, sözdizimim bazı nedenlerden dolayı tamamen kapalı. Şimdi güncelleyeceğim.
rien333

2

Her biri kendi profilini kullanan iki ayrı Chrome örneğini çalıştırmak istedim. Mac uygulamalarını başlatma alışkanlığım gibi onları Spotlight'tan başlatabilmek istedim . Diğer bir deyişle, Spotlight'ı açmak için ⌘-boşluk tuşunu, ardından 'reg' veya 'alt' ve ardından Enter tuşunu basılarak kolayca başlatılması regChromeiçin normal tarama ve altChromeözel profili kullanmak için iki normal Mac uygulamasına ihtiyacım vardı .

Sanırım yukarıdaki hedefi gerçekleştirmenin kaba kuvvet yolu, ilgili isimler altında Google Chrome uygulama paketinin iki kopyasını oluşturmak olacaktır. Ancak bu çirkin ve güncellemeyi zorlaştırıyor.

Elde ettiğim şey, her biri iki komut içeren iki AppleScript uygulamasıydı. İşte bunlardan biri 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 &"

İkinci satır, Chrome'u alternatif profille ( --user-data-dirparametre) başlatır .

İlk satır, iki uygulamaya ayrı simgeler vermek için başarısız bir girişimdir. Başlangıçta iyi çalışıyor gibi görünüyor. Ancak, er ya da geç Chrome, simge dosyasını yeniden okur ve iki uygulamadan hangisinin en son başlatıldığına karşılık gelen dosyayı alır ve sonuçta aynı simgeye sahip iki çalışan uygulama ortaya çıkar. Ancak bunu düzeltmeye çalışmadım - iki tarayıcıyı ayrı masaüstlerinde tutuyorum ve aralarında gezinmek bir sorun olmadı.


2

OS X Yosemite ile başlayarak, karmaşık görevleri otomatikleştirmek için artık AppleScript ve Automator'ı kullanabiliriz. Otomasyon için JavaScript artık komut dosyası dili olarak kullanılabilir.

Bu sayfa, bash ve osascript etkileşimli modu kullanılarak komut satırında yazılabilen iyi bir örnek komut dosyası sunar . Bir Safari sekmesi açar ve adresine gider 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;

El yazısı otomasyonuna sahip uygulamaların bir listesi için Komut Dosyası Düzenleyicisi / Pencere / Kitaplık'a bakın. Chrome'a ​​dayalı Vysor'u arıyordum ve sanırım farklı bir yola ihtiyacım var.
AnneTheAgile

Daha karmaşıklık ftw!
Pacerier

1

El yazısı ile:

tell application "Firefox" to activate

Firefox'a nasıl argüman iletirsiniz? Örneğin, -no-uzak -P "Başka Bir Profil". Eklentiler ve benzerlerini geliştirirken, iki ayrı profil kullanan iki ayrı Firefox işlemine sahip olmak uygundur. Normal profiliniz ve uzantınızda hata ayıklayacağınız bir sanal alan.
George

Sanırım bir AppleScript direktifinden bahsediyorsunuz, ancak soru komut satırından açmakla ilgili ...
conny

0

Neden sadece uygulamanın bölmesinin yolunu eklemiyorsunuz? MacVim için aşağıdakileri yaptım.

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

Takma ad, denediğim başka bir seçenektir.

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

Export PATH ile uygulamadaki tüm komutları çağırabilirim. MacVim ile yaptığım test için argümanlar iyi geçti. Oysa takma ad, bölmedeki her bir komutun adını değiştirmem gerekiyordu.

mvim README.txt
gvim Anotherfile.txt

Takma ad ve YOL'un gücünün tadını çıkarın. Ancak, işletim sistemi yükseltildiğinde değişiklikleri izlemeniz gerekir.


"MacOS'un linux tabanlı olduğunu unutmayın". Hayır, hayır değil, macOS ve Linux tek bir kod satırını paylaşmaz. MacOS, FreeBSD tabanlı bir çekirdeğe sahip bir UNIX'tir.
Thomas

Değişecek. Dini bir savaş yaratmak istemiyorum. Amaç, topluluğun MacOS kullanıcılarının yararlanabileceği bazı güçlü seçenekler olduğunu bilmesini sağlamaktı.
zerocog

Elbette, hiç sorun değil! :)
Thomas

0

Basit, burada "APP" yi başlatmak istediğiniz uygulamanın adıyla değiştirin.

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

Sonra teşekkürler.


0

Uygulamaları şu şekilde başlatabilirsiniz open:

open -a APP_YOU_WANT

Bu, istediğiniz uygulamayı açmalıdır.

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.