प्रोग्राम के तर्क को सही ढंग से पढ़ने के लिए लॉन्च करना


18

मेरे पास एक लॉन्च स्क्रिप्ट है जहां मैं जिस कमांड को चलाने का प्रयास कर रहा हूं वह गलत है (स्पष्ट रूप से यह एक शब्द नहीं है, यह अब है), अनुचित उपयोग की शिकायत।

विशिष्ट त्रुटि जो मुझे मिल रही है, वह सिस्टम लॉग में कमांड का उपयोग पाठ है। इससे मुझे पता चलता है कि प्लिस्ट में अन्य जानकारी (कमांड का रास्ता, टाइमिंग आदि) सही ढंग से पार्स की जा रही है, न कि कमांड के विकल्प।

कमांड के उपयोग के बाद मेरे पास एक अंतिम पंक्ति है:

18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1

लेकिन इसका मतलब है कि "मैं एक त्रुटि के साथ बाहर निकला"।

मुझे पता है कि Launchd अपने विकल्पों में से कमांड को विभाजित करता है और मैन पेज में आपको ProgramArguments के बारे में बताता है: "... कृपया ध्यान दें: कई लोग इस कुंजी से भ्रमित हैं। कृपया निष्पादन (3) को बहुत ध्यान से पढ़ें! .."

वैसे मैं एग्ज़ाम्पल (3) पढ़ता हूँ और मैं समझदार नहीं हूँ, इसलिए मैं आपसे बहुत प्यार कर रहा हूँ।

आम तौर पर, टर्मिनल से कमांड चलाना इसे इस तरह देखना होगा:

/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

यह एक इलाज का काम करता है।

और यह है कि मैं इसे अपने LaunchAgent plist के प्रोग्राम / ProgramArguments अनुभाग में विभाजित कर चुका हूं:

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host localhost</string>
        <string>--passwd gobbledygook</string>
        <string>--project http://setiathome.berkeley.edu/ update</string>
    </array>

(रिकॉर्ड के लिए, मेरे पास मूल रूप से boinccmd से बचने का रास्ता था, लेकिन यह काम नहीं करता है, लॉन्च आपके लिए पथ में रिक्त स्थान से बच जाता है)

मैंने तर्कों को और नीचे विभाजित करने की कोशिश की है:

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

लेकिन वह भी काम नहीं कर रहा था।

हमेशा की तरह, मुझे पूरा यकीन है कि मैं कुछ आसान कर रहा हूँ।

धन्यवाद।


उत्तर:

ProgramArguments की पहली पंक्ति को प्रोग्राम के लिए पथ होना चाहिए। यह वही है जो मुझे ऊपर उठा रहा था और वास्तव में "... कृपया बहुत ध्यान से पढ़ें!" टिप्पणी का मतलब था :) मैंने भी पाया कि मुझे उनके घटक भागों के तर्क को विभाजित करना था। जब मेरे पास वह सब था, तो सारी जगह एक आकर्षण का काम करती है। आपका बहुत बहुत धन्यवाद।

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

एक अंतिम विवरण के लिए एक आसान समझने के लिए कहने के लिए संपादित करें कि यह क्यों होना चाहिए, SirPavlova की व्याख्या देखें।

~ डब्ल्यू


प्रक्षेपण सूची com.label.plist का उपयोग करके मैं देख सकता हूं कि लॉन्च को कमांड के सही हिस्सों को एक साथ टुकड़े करने के लिए मिल रहा है। मैं सोच रहा था कि शायद यह - से संबंधित एक समस्या थी, लेकिन स्पष्ट रूप से नहीं।
वुडगी

1
मेरे पास आपकी समस्या का जवाब नहीं है, लेकिन आपका पहला उदाहरण <string>--host localhost</string>निश्चित रूप से काम नहीं करेगा । याद रखें, जब आप एक कमांड लाइन को शेल में लिखते हैं, तो यह पता नहीं होता है कि एक विकल्प का हिस्सा क्या है और एक नियमित तर्क क्या है - यह प्रोग्राम चलाने के लिए तर्कों को पारित करने से पहले रिक्त स्थान पर विभाजित होता है । इसके अलावा, यदि आपको सटीक त्रुटि दिखाई दे रही है, तो यह मदद कर सकता boinccmdहै।
केविन रीड ने

मेरी पोस्ट को यह कहने के लिए संपादित किया कि मैं क्या देख रहा हूँ। ऐसा नहीं है कि यह किसी भी मदद का हो जाएगा! इसके अलावा, अगर मैं उनके व्हाट्सएप पर विकल्पों को विभाजित करता हूं तो मुझे वही त्रुटि मिल रही है। मुझे लगता है कि यह है - कि किसी तरह समस्या पैदा कर रहा है।
वुडगी

1
मैं सिर्फ प्रोग्राम या ProgramArguments दोनों का उपयोग करने की कोशिश नहीं
करूँगा

जवाबों:


19

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

आपका पहला उदाहरण boinccmd शुरू करता है और यह तर्क देता है कि टर्मिनल कमांड के बराबर होगा

--host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update

जो कि boinccmd को बताता है कि आपने इसे "--host लोकलहोस्ट" के रूप में लागू किया है और केवल इसे दो अजीब तर्क दिए हैं।

आपका दूसरा उदाहरण तर्कों को सही ढंग से अलग करता है, लेकिन जैसा कि एडी केली ने सुझाव दिया था कि इसे सामने की तरफ डाला जाना चाहिए। यह boinccmd को बताता है कि आपने इसे "--host" के रूप में लागू किया है, फिर एक और छह तर्क पारित किए। boinccmd अंतिम पांच को दो विकल्पों के रूप में पहचान सकता है, लेकिन "लोकलहोस्ट" व्यवसाय के बारे में कोई पता नहीं है। जहां तक ​​बोनीकेमड बता सकता है, इसे टर्मिनल से मंगाया गया था

/Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

(ध्यान दें "-" गायब ")।

boinccmd शायद उन अधिकांश कार्यक्रमों में से एक है जो परवाह नहीं करते हैं कि उनका पहला तर्क क्या है, इसलिए आप शायद वास्तव में सिर्फ सरणी <string>HELLO</string>के प्रमुख पर चिल्ला सकते हैं ProgramArguments, लेकिन यह Programकुंजी को पूरी तरह से हटाने के लिए क्लीनर है और बस इस का उपयोग करें:

<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

यह एक अर्थहीन अतिरेक की तरह लग सकता है, लेकिन कुछ कार्यक्रम इसका उपयोग अच्छे प्रभाव के लिए करते हैं: बैश एट अल। यदि उनका पहला तर्क शुरू होता है -, तो लॉगिन गोले के रूप में कार्य करें , और यदि इसका पहला तर्क है edया viइसके बजाय विम विभिन्न उत्सर्जन मोड में प्रवेश करता है vim


1
आपने पोस्ट किया जैसे मैं अपना मुख्य पोस्ट संपादित कर रहा था! यह एक महान व्याख्या है। धन्यवाद।
वुडगि नोव

1
खुशी की बात है मदद के लिए :)
SirPavlova

@SirPavlova, बहुत मदद! हालांकि, क्या कोई उपकरण है जो कंसोल इन्वोकेशन को प्लिस्ट फॉर्मेट में बदलने में व्यक्ति की मदद करता है?
गौसब्लार्की

6

निष्पादन के लिए मैन पेज (3) के आधार पर, ऐसा लगता है कि पहला प्रोग्राम तर्क निष्पादन योग्य के लिए रास्ता होना चाहिए:

The execv(), execvp(), and execvP() functions provide an array of pointers to null-terminated strings
 that represent the argument list available to the new program.  The first argument, by convention,
 should point to the file name associated with the file being executed. The array of pointers must be
 terminated by a NULL pointer.

यदि आप इंडेक्स 0 पर तर्क के रूप में निष्पादन योग्य के लिए पथ निर्दिष्ट कर सकते हैं, तो यह मदद कर सकता है ...


जैसा कि मैंने पोस्ट को दिखाने के लिए संपादित किया है, boinccmd को ढूंढा जा रहा है और चलाया जा रहा है, इसके लिए दिए जा रहे विकल्प किसी तरह मंगवाए जा रहे हैं। जब तक मुझे याद नहीं आ रहा कि आप क्या कह रहे हैं।
वुडगी

1
@Woodgie हाँ जो प्रोग्राम में पाया गया था - आपके ProgramArguments में यह सही है कि इसे निष्पादन योग्य के नाम की आवश्यकता है
user151019

ओह। ओह! मुझे लगता है कि अब मैं देख रहा हूं। रुको, नींबू का परीक्षण है कि।
वुडगि

बिंगो, ऐसा करने और प्रत्येक कमांड के प्रत्येक हिस्से को अपने <string> </ string> कंटेनर में डालने का काम किया। धन्यवाद। मैं तुम्हें यह आसान था!
वुडगि नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.