2009-08-20 15 views
90

के साथ ओएस एक्स पर एक ऐप लॉन्च करें मैं एक स्क्रिप्ट से ओएसएक्स पर एक ऐप लॉन्च करना चाहता हूं। मुझे इसे कमांड लाइन तर्क पास करने की आवश्यकता है। दुर्भाग्यवश, open कमांड लाइन तर्क स्वीकार नहीं करता है।कमांड लाइन

मेरा ऐप लॉन्च करने के लिए nohup myApp > /dev/null & का उपयोग करने का एकमात्र विकल्प यह है कि यह इसे लॉन्च करने वाली स्क्रिप्ट से स्वतंत्र रूप से मौजूद हो सकता है।

कोई बेहतर सुझाव?

+0

मैं इस प्रश्न का पालन नहीं कर सकता। "खुला" कमांड लाइन तर्क स्वीकार नहीं करता है? "खुला" क्या है? क्या यह ऐप्पलस्क्रिप्ट खुला है? 'नोहुप' और समस्या को हल कैसे करता है? –

+4

मैन ओपन (1) - ओएस एक्स कमांड लॉन्च करने के लिए ओएस एक्स कमांड –

+3

यह superuser.com –

उत्तर

58

ओएस एक्स 10.6 में, open आदेश आवेदन करने के लिए तर्क के निधन अनुमति देने के लिए बढ़ाया गया था:

open ./AppName.app --args -AppCommandLineArg 

लेकिन मैक ओएस एक्स के पुराने संस्करणों के लिए, और पारित होने के लिए, क्योंकि ऐप्लिकेशन बंडलों नहीं बनाया गया है कमांड लाइन तर्क, कार्बन ऐप्स के लिए कोको ऐप्स या here के लिए here जैसी फ़ाइलों के लिए Apple Events का उपयोग करने के लिए पारंपरिक तंत्र का उपयोग करना है। आप पर्यावरण चर का उपयोग करने में पैरामीटर पास करके शायद कुछ भी कर सकते हैं।

+0

मेरा क्लेजगी दृष्टिकोण निष्पादन योग्य को कमांड लाइन तर्कों के साथ सीधे नोहप का उपयोग करने का आह्वान करना है - अगर पर्यावरण-वर्स-क्लुज कम क्लेजगी? – psychotik

+2

शायद नहीं। यदि यह आपके लिए काम करता है, तो इसके साथ जाओ। बड़ा मुद्दा यह है कि खुले (1) क्ली समकक्ष होता है जब कोई उपयोगकर्ता डबल-क्लिक करता है या खोजक में "ओपन" करता है और इनमें से कोई भी तंत्र परंपरागत कमांड लाइन तर्कों का समर्थन नहीं करता है। –

+0

+1: आपको मैक ओएस एक्स जीयूआई अनुप्रयोगों के लिए कमांड लाइन तर्क का उपयोग नहीं करना चाहिए। –

29

एक एप्लिकेशन बंडल (.app फ़ाइल) वास्तव में निर्देशिकाओं का एक समूह है। open और .app नाम का उपयोग करने के बजाय, आप वास्तव में इसमें जा सकते हैं और वास्तविक बाइनरी शुरू कर सकते हैं। उदाहरण के लिए:

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

वास्तविक द्विआधारी कि तर्क को स्वीकार कर सकते हैं (या नहीं, LittleSnapper के मामले में) है।

+3

पर होना चाहिए बाइनरी तर्क स्वीकार करता है, मुझे यकीन है। मैने यह लिखा। 'ओपन' का आह्वान करने से तर्क गुजरने की अनुमति नहीं मिलती है। मुझे इसके बारे में बहुत यकीन है। और हाँ, मेरी स्क्रिप्ट सीधे 'खुली बाइनरी' कह रही है, बंडल खोलने की कोशिश नहीं कर रही है। – psychotik

+0

@psychotik: वह "खुली बाइनरी" कहने के लिए नहीं कह रहा है। वह बाइनरी को सीधे निष्पादित करने के लिए कह रहा है। – Chuck

+0

यह मेरे लिए काम नहीं करेगा। सीधे मेरी स्क्रिप्ट की बाल प्रक्रिया होने के बाइनरी परिणामों को निष्पादित करना, जिसे मैं निश्चित रूप से नहीं चाहता हूं। इसलिए, ओपन/नोहप – psychotik

4

मैथ्यूक ऑफर की तकनीक की सिफारिश करता हूं। मेरे मामले में, मैं क्रोमियम के साथ प्रयास करने की जरूरत:

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

मुझे पता है इस ओपी के समस्या का समाधान नहीं है, लेकिन उम्मीद है कि यह किसी और का समय बचाता है। :)

+0

पढ़ना चाहिए लेकिन आपको टर्मिनल को खोलने की आवश्यकता है ... – Pacerier

+0

@Pacerier इस कमांड के अंत में '&' जोड़ें। यह पृष्ठभूमि में लॉन्च होगा। फिर आप अपनी टर्मिनल विंडो बंद कर सकते हैं और एप्लिकेशन अभी भी खुला रहेगा। –

98

के रूप में सवाल here में उल्लेख किया गया था, 10.6 में open आदेश अब एक args झंडा, है तो आप कॉल कर सकते हैं:

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

+0

वैसे ही काम करना जिस तरह से आवश्यक था। धन्यवाद – Durgesh

+0

यह काम करता है और मुझे क्रोमियम के लिए एक zsh उपनाम सेट करने की अनुमति दी। धन्यवाद – jamescampbell

+0

यह उत्तर बहुत अच्छा है। बस यह जोड़ना चाहता था कि जब आप पहली बार टर्मिनल खोलेंगे तो आप अपनी होम निर्देशिका में होंगे, इसलिए इसे इस तरह टाइप करें ताकि आपको एप्लिकेशन निर्देशिका में स्विच करने की आवश्यकता न हो। मैं फोंट को लोड किए बिना गिंप को चलाने के लिए चाहता था, जो हमेशा के लिए लेता है, इसलिए मैं इसे फोंट को छोड़ने के लिए -f स्विच के साथ टाइप करता हूं: open -n/अनुप्रयोग /GIMP.app --args -f –

1
applescript साथ

:

tell application "Firefox" to activate 
+0

फ़ायरफ़ॉक्स में तर्क कैसे पारित करते हैं ? उदा।, -no-remote -P "एक और प्रोफ़ाइल"। ऐड-ऑन विकसित करते समय, दो अलग-अलग प्रोफाइल का उपयोग करके दो अलग फ़ायरफ़ॉक्स प्रक्रियाओं के लिए सुविधाजनक है। आपकी सामान्य प्रोफ़ाइल और एक सैंडबॉक्स जिसमें आपके एक्सटेंशन को डीबग करना है। – George

+0

मेरा मानना ​​है कि आप ऐप्पलस्क्रिप्ट निर्देश का जिक्र कर रहे हैं, लेकिन सवाल कमांड लाइन से खोलने के बारे में है ... – conny

13

में अगर आपके ऐप को फाइलों पर काम करने की ज़रूरत है (जो आप आमतौर पर ./myApp *.jpg के रूप में पास करने की अपेक्षा करते हैं), तो आप इसे ऐसा करेंगे:

open *.jpg -a myApp 
+0

यह वही है जो मैं ढूंढ रहा था! मेरा तात्कालिकता, उदाहरण के लिए: 'खोलें कुछ.py_a Eclipse.app' – Eric

1

मैं क्रोम चलाने के दो अलग-अलग उदाहरण रखना चाहता था, प्रत्येक अपनी प्रोफ़ाइल का उपयोग कर रहा था। मैं उन्हें मैक ऐप्स शुरू करने की आदत के रूप में Spotlight से शुरू करने में सक्षम होना चाहता था। दूसरे शब्दों में, मुझे विशिष्ट ब्राउज़िंग के लिए दो नियमित मैक अनुप्रयोगों, regChrome और विशेष प्रोफ़ाइल का उपयोग करने के लिए altChrome की आवश्यकता होती है, जिसे स्पॉटलाइट लाने के लिए ⌘-space कुंजी, फिर 'reg' या 'alt', फिर एंटर करें।

मुझे लगता है कि उपर्युक्त लक्ष्य को पूरा करने के लिए ब्रूट-फोर्स तरीका संबंधित नामों के तहत Google क्रोम एप्लिकेशन बंडल की दो प्रतियां बनाना होगा। लेकिन यह बदसूरत है और अद्यतन करने में जटिल है।

जो मैंने समाप्त किया वह दो AppleScript अनुप्रयोगों में से दो आदेश थे।

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 &" 

दूसरी पंक्ति वैकल्पिक प्रोफ़ाइल (--user-data-dir पैरामीटर) के साथ शुरू होता है क्रोम: यहाँ altChrome के लिए एक है।

पहली पंक्ति दो अनुप्रयोगों को अलग-अलग आइकन देने का एक असफल प्रयास है। प्रारंभ में, यह ठीक काम करता प्रतीत होता है। हालांकि, जल्दी या बाद में, क्रोम अपनी आइकन फ़ाइल को दोबारा पढ़ता है और जो भी दो ऐप्स के अंत में शुरू होता है, उसके अनुरूप होता है, जिसके परिणामस्वरूप एक ही आइकन के साथ दो चल रहे अनुप्रयोग होते हैं। लेकिन मुझे इसे ठीक करने की कोशिश करने के लिए परेशान नहीं है - मैं दो ब्राउज़रों को अलग डेस्कटॉप पर रखता हूं, और उनके बीच नेविगेट करना कोई समस्या नहीं है।

+0

मैक गड़बड़ हो गया है। अलगाव और सैंडबॉक्सिंग बुनियादी उपयोगिता, सुरक्षा, और मजबूती सिद्धांत है। किसी भी मामले में 'ओपन -args' काम का उपयोग क्यों नहीं किया जाता है? 'डू शैल स्क्रिप्ट' का उपयोग एकमात्र तरीका है? – Pacerier

2

OS X Yosemite के साथ शुरुआत, अब हम जटिल कार्यों को स्वचालित करने के लिए AppleScript और Automator का उपयोग कर सकते हैं। स्वचालन के लिए जावास्क्रिप्ट अब स्क्रिप्टिंग भाषा के रूप में उपयोग किया जा सकता है।

This page gives a good example example script जिसे बैश और osascript इंटरैक्टिव मोड का उपयोग करके कमांड लाइन पर लिखा जा सकता है। यह एक सफारी टैब खोलता है और 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; 
+0

एप्सस्क्रिप्ट ऑटोमेशन उपलब्ध ऐप्स की सूची के लिए स्क्रिप्ट संपादक/विंडो/लाइब्रेरी की जांच करें। मैं क्रोम पर आधारित व्हायर की तलाश में था, और मुझे लगता है कि मुझे एक अलग तरीके की जरूरत है। – AnneTheAgile

+0

अधिक जटिलता ftw! – Pacerier

1

open भी एक-एक ध्वज है, कि आप के भीतर से किसी एप्लिकेशन को खोलने के लिए उपयोग कर सकते हैं इसके नाम से एप्लिकेशन फ़ोल्डर (या -b ध्वज के साथ बंडल पहचानकर्ता द्वारा)। आप परिणाम प्राप्त करने के --args विकल्प के साथ इस गठजोड़ कर सकते हैं आप चाहते हैं:

:

open -a APP_NAME --args ARGS 

वीएलसी प्लेयर में एक वीडियो है कि एक कारक 2x और पाश आप उदाहरण exectute के लिए होगा के साथ पैमाने पर करना चाहिए ऊपर खोलने के लिए

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

ध्यान दें कि मुझे टर्मिनल पर आदेशों का आउटपुट नहीं मिल सका। (हालांकि मैंने इसे हल करने के लिए कुछ भी कोशिश नहीं की थी)

+0

क्या आपने जानबूझकर 'ओपन-ए' दोहराया था ?? किसी भी मामले में, 'ओपन-ए/एप्लीकेशन/Google \ Chrome.app/Contents/MacOS/Google \ क्रोम --args --user-data-dir =/उपयोगकर्ता/an/userll' मेरे लिए काम नहीं करता है। – Pacerier

+0

मुझे माफ़ कर दो, मेरा वाक्यविन्यास किसी कारण से पूरी तरह से बंद है। मैं अब अपडेट करूंगा। – rien333