मैं मैक ओएस में कमांड लाइन तर्क के साथ एक आवेदन कैसे चला सकता हूं


60

वहाँ एक मैक पर एक आवेदन के लिए कमांड लाइन तर्क को जोड़ने के लिए कोई आसान तरीका है? उदाहरण के लिए, ओपेरा को कियोस्क मोड में चलाने के लिए या फ़ायरफ़ॉक्स में एक अलग प्रोफ़ाइल का उपयोग करने के लिए, मैं टाइप कर सकता हूं

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

विंडोज में मैं शॉर्टकट गुणों के लिए दलीलें जोड़ सकता हूं, लेकिन चूंकि मैक प्रति से शॉर्टकट का उपयोग नहीं करते हैं और सीधे एप्लिकेशन चलाते हैं, इसलिए यह संभव नहीं है।

मैंने पाया है कि एप्लिकेशन को बैश या एप्सस्क्रिप्ट के माध्यम से लॉन्च करना आंशिक रूप से काम करता है:

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

मैं इन निष्पादन योग्य बना सकता हूं और एक आइकन असाइन कर सकता हूं और सब कुछ बहुत अच्छा काम करता है सिवाय इसके कि जब मैं या तो इन छद्म कार्यक्रमों को चलाता हूं, तो या तो एक टर्मिनल विंडो या एक एप्लेसस्क्रिप्ट आइकन तब तक खुला रहता है जब तक कि आवेदन खुला रहता है। मुमकिन है, Applescript कमांड का उपयोग करने openसे यह बच जाएगा, लेकिन चूंकि मैं एप्लिकेशन को नहीं चला रहा हूं क्योंकि यह पैक किया हुआ है (बस /Applications/Firefox), यह काम नहीं करता है।

तो, क्या कमांड लाइन तर्क के साथ आवेदन चलाने का एक बेहतर तरीका है? यदि नहीं, तो क्या एक सतत टर्मिनल सत्र या एप्सस्क्रिप्ट आइकन को रोकने का एक तरीका है, जबकि आवेदन खुला है?

संपादित करें

मोज़िला विकी पेज के अनुसार , एप्लिकेशन को तर्क के साथ चलाने के लिए स्क्रिप्ट का उपयोग करना सबसे अच्छा है। &स्क्रिप्ट के अंत में जोड़ना लगातार टर्मिनल विंडो को मारता है। अब केवल झुंझलाहट है कि यह एक मृत, लॉग आउट टर्मिनल विंडो को खोलता है (जो लगातार एक से बेहतर है, लेकिन अभी भी ...)

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

2
मैं अभी भी इस पर बेहतर जवाब की उम्मीद कर रहा हूँ ...
Cregox

जब आप &इसके साथ नौकरी चलाते हैं तब भी यह टर्मिनल के अंतर्गत आता है disown %/Applications/Firefox.app/Contents/MacOS/firefox , तो आप इसे चलाने के बाद लाइन को जोड़कर ठीक कर सकते हैं , फिर आप AppleScript का उपयोग करके सुरक्षित रूप से टर्मिनल को बंद कर सकते हैं।
ओसोडो

डैनियल के जवाब की तलाश करें - यह आज के लिए सबसे पूर्ण और सही है (OSX 10.6.2 +)।
cregox

जवाबों:


17

यहाँ मेरा सबसे अच्छा समाधान है: के साथ एक Applescript बनाएँ:

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

और इसे एक एप्लिकेशन के रूप में सहेजें

आप पहले भाग में जो भी आर्गन्स के साथ आवेदन कर सकते हैं। &जो कुछ भी आपने अपनी स्क्रिप्ट + .app का नाम दिया है, उसे मारने की आवश्यकता के बाद का हिस्सा । आप स्क्रिप्ट ऐप को गोदी में फ्लैश करते देखेंगे, लेकिन फिर यह गायब हो जाएगा।

नोट: स्क्रिप्ट एडिटर से रन करते समय स्क्रिप्ट ठीक से काम नहीं करेगी, केवल आपके द्वारा बनाए गए स्क्रिप्ट एप्लिकेशन से ही चले।


यह लगभग काम करता है। यह अभी भी फ़ायरफ़ॉक्स उदाहरण के लिए इंतजार कर रहा है जब तक कि यह हत्या नहीं करता है, इसलिए यह डीबगर को कॉल करता है जब मैं फ़ायरफ़ॉक्स बंद करता हूं, और स्क्रिप्ट ऐप अभी भी दूर नहीं जाता है। हम्म् ...
एंड्रयू

वह अजीब है। क्या आप इसे ऐप के रूप में सहेज रहे हैं और फिर ऐप पर डबल क्लिक कर रहे हैं? स्क्रिप्ट एडिटर से रन करने पर यह काम नहीं करेगा।
MJeffryes

इसके अलावा, मुझे लगता है कि मैंने पहले एक नई पंक्ति लगाई थी। यदि आपके पास नई लाइन निकालें
MJeffryes

स्नो लेपर्ड 10.6.x पर यहाँ & किलर की कोई आवश्यकता नहीं है - लेकिन यह भी एप्लिकेशन को निष्पादित करते हुए इसे आत्म-हत्या करने का कोई तरीका नहीं मिल सका।
cregox

1
@ स्पेसर इस उत्तर पर तारीखों की जाँच करें।
MJeffryes

28

OS X 10.6.2 में शुरू, ओपन कमांड --args फ्लैग के माध्यम से खुलने वाले एप्लिकेशन के लिए तर्क पारित कर सकता है। AppleScript का उपयोग करने के लिए यह इस तरह दिखता है:

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

जो आपको वह सब व्यवहार देना चाहिए जो आप चाहते हैं।


"आदमी खुला", और वहाँ यह है! एक जादू की तरह काम किया। - झंडे और फिर आपके तर्क।
माइकल डिमिट

1
मैंने --argsक्रोम के साथ प्रयास किया और यह काम नहीं करता है। यह केवल पहली बार के लिए काम करेगा । यदि आप दो --user-data-dirसमवर्ती चलाने की कोशिश करते हैं, तो आप इसे नहीं कर सकते, openलेकिन इसे पुराने /applications...तरीके से चलाना चाहिए । किसी को पता है कि बकवास क्यों --args काम नहीं करता है?
पेसियर

1
@ पेसरियर, "ओपन-एन"
साइमन राइट

इसे जोड़ने के लिए, आप स्क्रिप्ट एडिटर में स्क्रिप्ट बना सकते हैं और फिर एप्लिकेशन के रूप में सहेज सकते हैं।
केविन सी।

11

ऑटोमेटर खोलें और एक एकल रन शैल स्क्रिप्ट कार्रवाई के साथ एक एप्लिकेशन बनाएं :

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

यह एप्लिकेशन फ़ायरफ़ॉक्स को लॉन्च करेगा और तुरंत छोड़ देगा, जिससे केवल फ़ायरफ़ॉक्स चल रहा है।


वैकल्पिक रूप से, निम्नलिखित AppleScript कोड के साथ AppleScript Editor का उपयोग करके एक एप्लिकेशन बनाएं :

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

दोनों ठीक काम करते हैं और या तो टर्मिनल या स्क्रिप्ट एप्लिकेशन को एक या दो से अधिक समय तक चालू नहीं रखते हैं। यदि आप ऐसा चुनते हैं, तो आप ऑटोमेटर का उपयोग करके सेवा भी बना सकते हैं।


1
बस ध्यान रखें कि open --args10.6.2 में लागू किया गया था, जैसा कि बॉब ने पहले ही उल्लेख किया है।
Cregox

इसका उपयोग करने के लिए: open eclipse.app -nदूसरा ग्रहण कार्यक्षेत्र खोलने के लिए। बेहद सुविधाजनक। धन्यवाद!
जोनलव

MacOS 10.14 में "रन शैल स्क्रिप्ट" कार्रवाई के साथ ऑटोमेकर में काम करने के लिए इसे नहीं मिला। मैंने AppleScript के साथ सफलता प्राप्त की, हालाँकि।
केविन सी।

8

यह एक पुरानी चर्चा है, लेकिन फिर भी यह Google खोजों पर आता है, इसलिए मैंने सोचा कि मैं कुछ जोड़ेगा।

संभवतः निष्पादन योग्य पथ के बजाय "बंडल पहचानकर्ता" का उपयोग करना बेहतर है:

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

या एक Apple स्क्रिप्ट में:

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

जो मुझे अभी तक पता नहीं चला है वह यह है कि पहले से पहले से ही खुला एक बार एक अलग प्रोफ़ाइल के साथ एक नया उदाहरण / विंडो कैसे खोलें। (यदि मैं ऊपर AppleScript चलाता हूं, तो "प्रोफ़ाइल 2" के साथ एक और, फिर क्रोम अभी भी "प्रोफ़ाइल 1" के रूप में एक और विंडो खोलेगा)। :(


क्या -b कार्यात्मक रूप से -a के बराबर है? वे कैसे अलग हैं?
पचेरी

7

यह आवश्यक नहीं है (जैसा कि कुछ अन्य उत्तरों ने सुझाव दिया है) इस परिदृश्य में माता-पिता AppleScript एप्लिकेशन प्रक्रिया ("एप्लेट") को मारने के लिए किलॉल (या समान) का उपयोग करें। यहां तक ​​कि इसका दुष्प्रभाव भी हो सकता है, अगर किलर को दिया गया नाम / पैटर्न सिर्फ पेरेंट एप्लेट प्रक्रिया (उदाहरण के लिए, समवर्ती रूप से चल रहे AppleScript एप्लिकेशन (यदि पैटर्न के रूप में "एप्लेट" का उपयोग करके)) से अधिक मेल खाता है।

ऐसा कुछ kill $PPIDअधिक उचित हो सकता है, लेकिन हम यह नहीं मान सकते हैं कि AppleScript एप्लिकेशन का एप्लेट हमेशा शेल का तत्काल अभिभावक होता है जो शेल स्क्रिप्ट द्वारा शुरू किया जाता है । सौभाग्य से, वहाँ एक पूरी तरह से उचित तरीका है कि आप क्या जरूरत है।

प्रति TN2065 (के तहत "मैं एक पृष्ठभूमि सर्वर प्रक्रिया शुरू करने के लिए चाहते हैं;? कैसे मैं खोल स्क्रिप्ट आदेश कम्प्लिट्स तक इंतजार नहीं कर सकता हूँ"), उचित विधि stdout और stderr अनुप्रेषित और खोल पृष्ठभूमि में कार्यक्रम चलाने के लिए है ।

AppleScript एप्लिकेशन के रूप में निम्न प्रोग्राम को सहेजने के लिए स्क्रिप्ट एडिटर का उपयोग करें :

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

(कार्यात्मक लाइन ब्रेक को "संकीर्ण" रखने के लिए जोड़ा गया है; हटाएं ¬और \\यदि आप चाहें तो इसे एक लंबी लाइन पर डाल दें)

फ़ायरफ़ॉक्स को शुरू करने के लिए यह काफी लंबा चलेगा और फ़ायरफ़ॉक्स के चलने के दौरान सफाई से बाहर निकल जाएगा ।

पुनर्निर्देशन की आवश्यकता है क्योंकि न केवल शेल स्क्रिप्ट अपने तत्काल बच्चे (शेल) के बाहर निकलने की प्रतीक्षा करता है, बल्कि यह पाइप के कुंडली के सिरे के सभी छोरों (सभी उदाहरणों) का भी इंतजार करता है जो शेल के स्टडआउट और स्टडर के बंद होने के लिए बनाता है। । शेल के स्टडआउट और स्टडर ( शेल स्क्रिप्ट के पाइप हैं) को उन कार्यक्रमों द्वारा विरासत में मिला है जो इसे पुनर्निर्देशन के बिना चलाता है (यहां तक ​​कि पृष्ठभूमि में चलने वाले भी &); पुनर्निर्देशन यह सुनिश्चित करता है कि खोल पाइपों के लिखने योग्य सिरों को पकड़ने के लिए अंतिम है। इस प्रकार, शेल स्क्रिप्ट शेल से बाहर निकलने के तुरंत बाद वापस आ जाएगी, जिससे AppleScript एप्लिकेशन को स्वयं से बाहर निकलने की अनुमति मिलती है (चूंकि शेल स्क्रिप्ट AppleScript प्रोग्राम में अंतिम अभिव्यक्ति है)।

अन्य उत्तर जो खोल के अंदर का उपयोग करते हैं, शेल स्क्रिप्ट का काम करते हैं क्योंकि ओपन (वास्तव में लॉन्चसर्विस) परिणामी कार्यक्रम को पृष्ठभूमि देने और इसके स्टडआउट और स्टेडर को कहीं और भेजने के बराबर काम करता है।


यह बहुत दिलचस्प है। मुझे आश्चर्य है कि अगर यह 10.6.2 से पहले काम करता है ... लेकिन मुझे अभी भी लगता है कि open --argsक्लीनर दिखता है। क्या उनमें से किसी का उपयोग करने में कोई कमी है?
cregox

1
मुझे पता है कि यह विधि 10.4 में काम करती है। मेरी धारणा यह है कि शेल स्क्रिप्ट हमेशा इस तरह से काम करती है (इसे AppleScript 1.7 में मानक अतिरिक्त OSAX में जोड़ा गया था , जो मैक ओएस एक्स 10.1 के साथ आया था)। यदि आप 10.6 मानने को तैयार हैं, तो शायद ठीक है। open --args
क्रिस जॉन्सन

@ क्रिसहॉन्सेन, नीचे लिंक ........
पचेरियर

4

AppleScript

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

वहां दो अंक।

  1. स्पेस बैकस्लैश से बच जाता है जो फिर से बैकलैश से बच जाता है
  2. किललेट एप्लेट परेशानी पैदा कर सकता है, क्योंकि अन्य एप्लेट चल सकते हैं
  3. इसे प्रोग्राम के रूप में सेव करें

हालाँकि यह 10.6.5 पर अच्छा काम करता है


appletको संदर्भित करता है?
पचेरियर

3

निम्नलिखित को आपको .app ही के लिए कमांड-लाइन तर्क निर्दिष्ट करने देना चाहिए:

राइट क्लिक .app बंडल, "पैकेज कंटेंट दिखाएं" चुनें, Info.plist पर जाएं, इसे डबल क्लिक करें, Args कुंजी ढूंढें, संपादित करें।

मेरे पास इस समय OS X मशीन सही नहीं है, इसलिए मैं यह नहीं जांच सकता कि क्या आप किसी अन्य व्यक्ति के साथ भी ऐसा कर सकते हैं (यदि आप मूल .app तर्क-मुक्त, वगैरह रखना चाहते हैं)।


दुर्दशा में कोई भी कुंजी नहीं है। मोज़िला के अनुसार, आपको एक स्क्रिप्ट का उपयोग करना चाहिए - wiki.mozilla.org/MailNews:Logging#Mac
एंड्रयू

यह भी ध्यान दें कि पैकेज की सामग्री को बदलना (जैसे कि Info.plist) कोड साइनिंग के साथ समस्याएँ पैदा कर सकता है: Bridge.grumpy-troll.org/2011/01/…
drevicko

2

एक AppleScript लांचर के अंदर अपने आवेदन लपेटें।

यहाँ कदम हैं।

  1. निम्नलिखित सामग्री के साथ एक AppleScript बनाएँ, और इसे एक एप्लिकेशन के रूप में सहेजें (इस उदाहरण में इसे "फ़ायरफ़ॉक्स 3 लॉन्चर .app" नाम दिया गया है)।

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. फाइंडर में उस ऐप के लिए मिला, राइट क्लिक करें, पैकेज कंटेंट दिखाएं।

  3. पैकेज सामग्री की जड़ में अपना आवेदन डालें। (इस उदाहरण में यह "फ़ायरफ़ॉक्स 3.app" होगा)

    परिणाम: / अनुप्रयोग / फ़ायरफ़ॉक्स 3 लांचर ।app/Firefox 3.app

  4. अब आप अपना एप्लिकेशन लॉन्चर खोल सकते हैं।

टिप्पणियाँ:

  • लिपटे आवेदन के स्वत: अद्यतन ज्यादातर मामलों में काम करना चाहिए।
  • लॉन्चर में लिपटे हुए एप्लिकेशन (थोड़ा और स्क्रिप्टिंग के साथ) पर स्वचालित रूप से रीडायरेक्ट करने के लिए किसी भी ड्रैग और ड्रॉप को बनाना संभव होना चाहिए।
  • लिपटे हुए एप्लिकेशन को लॉन्च करने के बाद लांचर स्वचालित रूप से बाहर निकल जाता है।
  • इस पद्धति का एक फायदा यह है कि सीधे लिपटे आवेदन को खोलने के कुछ जोखिम हैं।

1

आप उपयोग क्यों नहीं करते हैं:

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

सरल लेकिन यह काम करता है।


2
यदि आप ऐसा करेंगे तो टर्मिनल खुल जाएगा।
MJeffryes

0

openआदेश एक वैकल्पिक है --argsतर्क है कि वह मान तर्क के रूप में खोला आवेदन करने के लिए पर पारित हो जाएगा। उदाहरण के लिए:

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