ओएस एक्स पर कमांड लाइन के साथ एक ऐप लॉन्च करें


108

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

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

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


मैं सवाल का पालन नहीं कर सकता। "ओपन" कमांड-लाइन आर्गन्स स्वीकार नहीं करता है? "खुला" क्या है? क्या यह AppleScript खुला है? nohup &समस्या का समाधान कैसे होता है?
एस.लॉट

4
मैन ओपन (1) - ओएस एक्स कमांड फाइल या ऐप लॉन्च करने के लिए
नेड डीली

3
यह superuser.com पर होना चाहिए
जेफ मीटबॉल यांग

जवाबों:


78

OS X 10.6 में, openकमांड को एप्लिकेशन में तर्क पारित करने की अनुमति देने के लिए बढ़ाया गया था:

open ./AppName.app --args -AppCommandLineArg

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


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

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

+1: आपको Mac OS X GUI अनुप्रयोगों के लिए कमांड-लाइन तर्क का उपयोग नहीं करना चाहिए।
एस.लॉट

2
बताएं कि Google कमांड लाइन के आर्गन्स, एप्लिकेशन / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome हेल्पर --type-lang = en-US का उपयोग न करें -फोर्स-फिल्डेस्ट
अनुराग उनियाल

@ अनुराग उनियाल "क्यों?" क्या आपने जवाब पढ़ा? "पारंपरिक तंत्रा कोकोआ ऐप्स के लिए या कार्बन ऐप्स के लिए यहाँ की फ़ाइलों के लिए ऐप्पल इवेंट्स का उपयोग करना है।" मैक ओएस एक्स जिस तरह से डिज़ाइन किया गया है। हाँ। क्रोम नियमों को तोड़ता है। तो क्या हर एक लिनक्स कमांड-लाइन उपयोगिताओं में से एक है। लेकिन जीयूआई अनुप्रयोग जो खुलते हैं, openवे हैं - जैसा कि उत्तर कहता है - कमांड लाइन से काम करने के लिए डिज़ाइन नहीं किया गया है। "क्यों?" क्योंकि मैक ओएस एक्स जिस तरह से है।
S.Lott

105

जैसा कि यहां प्रश्न में उल्लेख किया गया था , open10.6 में अब एक argsध्वज है, तो आप कॉल कर सकते हैं:

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


ठीक उसी तरह से काम करना जिसकी आवश्यकता थी। धन्यवाद
DTdev

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

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

32

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

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

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


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

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

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

1
यदि यह एक शेल स्क्रिप्ट है, तो स्क्रिप्ट की प्रक्रिया को वास्तविक निष्पादन योग्य से बदलने के लिए 'निष्पादन' का उपयोग करें।
जोनाथन लेफ़लर

2
अगर बंडल कस्टम पुस्तकालयों और चौखटे में शामिल है, तो आप के साथ बेला करना होगा: यह दृष्टिकोण एक बड़ी खामी है DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH
ulidtko

14

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

open *.jpg -a myApp

यह वही है जो मैं देख रहा था! मेरी तात्कालिकता, उदाहरण के लिए: open something.py -a Eclipse.app
एरिक

4

मैं उस तकनीक की सिफारिश करूंगा जो मैथ्यूके प्रदान करता है। मेरे मामले में, मुझे इसे क्रोमियम के साथ आज़माना था:

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

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


@Pacerier इस कमांड के अंत में एक `और` जोड़ें। यह बैकग्राउंड में लॉन्च होगा। आप तब अपनी टर्मिनल विंडो बंद कर सकते हैं और एप्लिकेशन संभवतः खुला रहेगा।
पॉल आयरिश

2

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

open -a APP_NAME --args ARGS

वीएलसी प्लेयर में एक वीडियो को खोलने के लिए जिसे एक कारक 2x और लूप के साथ स्केल किया जाना चाहिए, उदाहरण के लिए

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

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


क्या आपने open -aजानबूझकर दोहराया है ?? किसी भी मामले में, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllमेरे लिए काम नहीं करता है।
पचेरियर

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

2

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

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

मैंने जो समाप्त किया वह दो AppleScript अनुप्रयोगों के साथ था जिसमें दो कमांड थे। यहाँ एक के लिए है 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 &"

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

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


2

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

यह पृष्ठ एक अच्छा उदाहरण उदाहरण स्क्रिप्ट देता है जिसे कमांड लाइन पर बैश और ऑस्स्क्रिप्ट इंटरेक्टिव मोड का उपयोग करके लिखा जा सकता है । यह एक सफारी टैब खोलता है और इसे नेविगेट करता है 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;

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

अधिक जटिलता ftw!
पचेरियर

1

Applescript के साथ:

tell application "Firefox" to activate

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

मेरा मानना ​​है कि आप एक AppleScript निर्देश का उल्लेख कर रहे हैं, लेकिन सवाल कमांड लाइन से खुलने का है ...
Cony

0

क्यों न केवल ऐप के बिन में पथ जोड़ें। मैकविम के लिए, मैंने निम्नलिखित कार्य किया।

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

एक उपनाम, एक और विकल्प है जो मैंने कोशिश की।

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

निर्यात पथ के साथ मैं एप्लिकेशन में सभी कमांड को कॉल कर सकता हूं। मैकविम के साथ मेरे परीक्षण के लिए तर्क अच्छी तरह से पारित हुए। जबकि उपनाम, मुझे बिन में प्रत्येक कमांड को उर्फ ​​करना था।

mvim README.txt
gvim Anotherfile.txt

उपनाम और पथ की शक्ति का आनंद लें। हालाँकि, OS के अपग्रेड होने पर आपको परिवर्तनों पर नज़र रखने की आवश्यकता है।


"याद रखें कि MacOS लिनक्स आधारित है"। नहीं, नहीं, यह नहीं है, macOS और लिनक्स कोड की एक भी पंक्ति साझा नहीं करते हैं। MacOS एक UNIX है जिसमें FreeBSD पर आधारित कर्नेल है।
थॉमस

बदल जाएगा। मैं धार्मिक युद्ध नहीं बनाना चाहता। लक्ष्य यह था कि समुदाय को यह बताए कि कुछ शक्तिशाली विकल्प हैं जिन्हें MacOS उपयोगकर्ता उपयोग कर सकते हैं।
ज़ेरोकॉग

बिलकुल कोई परेशानी नही! :)
थॉमस

0

सरल, यहां उस एप्लिकेशन के नाम से "एपीपी" को बदलें जिसे आप लॉन्च करना चाहते हैं।

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

बाद में धन्यवाद।


0

आप एप्लिकेशन का उपयोग करके लॉन्च कर सकते हैं open:

open -a APP_YOU_WANT

यह वह एप्लिकेशन खोलना चाहिए जो आप चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.