होम फ़ोल्डर में संग्रहीत लॉगिन पर बैश स्क्रिप्ट चलाएँ?


19

जब मैं एक LaunchAgent plist को लोड करने की कोशिश करता हूं, तो मुझे launchctlयह पता नहीं चल सकता है कि होम डायरेक्टरी में स्क्रिप्ट कैसे चलाएं।

मेरा कोड है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

मैंने बैश के साथ और बिना दोनों की कोशिश की है और ~साथ में जगह भी ले रहा है $HOME। मैंने भी bash -cइसके बिना काम करने की कोशिश की है ।

त्रुटि कोड है:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

पूरा रास्ता डालने का प्रयास करें जैसे /User/name/script.sh (इसके अलावा मैं स्क्रिप्ट को निष्पादन योग्य बनाऊंगा और पहली पंक्ति के साथ #! / Bin / bash और इसे सीधे
चलाऊंगा

मैं पूर्ण पथ का उपयोग नहीं कर सकता क्योंकि इसका उपयोग कई खातों और कंप्यूटरों पर किया जाना है।
टायिलो

1
यदि इसे मेरे कई खातों का उपयोग करना है तो आपको इसे प्रत्येक उपयोगकर्ता के $ HOME में / usr / local / bin / के स्थान पर रखना चाहिए। यह जानना उपयोगी होगा कि आप इस स्क्रिप्ट को पूरा करने के लिए क्या प्रयास कर रहे हैं। यह एक LoginHook, IMO के लिए एक नौकरी की तरह लगता है।
टीजे लुओमा

जवाबों:


14

EnableGlobbingके लिए टिल्ड और वाइल्डकार्ड विस्तार सक्षम करता है ProgramArguments:

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

यह प्रभावित नहीं करता है Programया WatchPathsफिर भी, WatchPathsडिफ़ॉल्ट रूप से टिल्ड विस्तार कार्य करता है ।


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


1
इससे मुझे भी मदद मिली। निम्नलिखित मैक ओएस एक्स संस्करणों में कोशिश की: 10.7, 10.8, और 10.9।
डीजे एस

6
कृपया ध्यान दें: यह सुविधा योसेमाइट ( Mac OS X 10.10+) में हटा दी गई है ।
एलेक्स ग्रे

ऐसा लगता है कि यह 10.9.5 में भी नहीं है
ओडोको

18

EnableGlobbing OS X Yosemite 10.10 पर काम नहीं करता है । इसे अपदस्थ ( रेफ )किया गया है।

आप लॉग में देख सकते हैं The EnableGlobbing key is no longer respected. Please remove it.(से /var/log/system.log)

समस्या यह है कि launchdcwd (करंट वर्किंग डायरेक्टरी) है /, इसलिए आप ./कुछ लोगों की तरह इस्तेमाल नहीं कर सकते हैं ।

अपने घर से एक स्क्रिप्ट चलाने के लिए सरल तरीका उपयोग करना है (bash|zsh|sh) -c। विकल्प। इस तरह आपके पास टिल्ड ~या $HOMEवैरिएबल का उपयोग करने की क्षमता होगी ।

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
मुझे नहीं लगता कि आप टिल्ड का उपयोग कर सकते हैं sh; जब बैश के रूप में शामिल किया जाता है sh, तो यह पॉसिक्स संगतता मोड में चलता है, जो कई बैश एक्सटेंशन को निष्क्रिय कर देता है।
ट्रिपल जू

~/gobbling है इसलिए समर्थित नहीं है। ./जब तक डेमॉन होम लाइब्रेरी में सहेजा जाता है तब तक आप इसका उपयोग कर सकते हैं । ( ~/Library/LaunchAgents)
ब्रूनो

9

सबसे विश्वसनीय जो मुझे ऐसा करने से मिला, वह था उपयोग shऔर HOMEपर्यावरण चर:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

नोट: उद्धरण आवश्यक हैं।


2

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

user=`whoami`

फिर $userस्क्रिप्ट में उपयोग करें ।

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

लॉन्च किए गए प्लिस्ट के लिए आपको पूर्ण पथ का उपयोग करना होगा। इसके अलावा, आपके लॉन्च प्लिस्ट में आपको यह निर्दिष्ट करने की आवश्यकता नहीं होगी <string>bash</string>कि आपके पास स्क्रिप्ट में शेबंग होना चाहिए और यह निष्पादन योग्य होना चाहिए।


bashवास्तव में निष्पादित करने के लिए कमांड के रूप में निर्दिष्ट करना वास्तविक गिरावट के साथ एक अच्छी गिरावट है। यदि उसके पास शेबंग नहीं है, या स्क्रिप्ट को निष्पादन योग्य (ओ = आरडब्ल्यूएक्स) बनाने के लिए भूल जाता है, तो बैश अभी भी स्क्रिप्ट को लागू / निष्पादित करेगा।
जेसन सलज

1
उपयोगकर्ता नाम के लिए पहले से ही एक चर होना चाहिए, जैसे $ USER या $ LOGNAME। इसके अलावा, साझा यूनिक्स लिपियों के लिए सामान्य स्थान / usr / स्थानीय / बिन / होगा (यह नहीं कि आप उन्हें कहीं और नहीं डाल सकते, लेकिन / usr / स्थानीय / बिन / सबसे अधिक संभावना आपके $ PATH में पहले से ही होगी)।
टीजे लुओमा

$ USER या $ LOGNAME के ​​समान जानकारी प्राप्त करने के लिए whoami का उपयोग करना एक और तरीका है। मैंने उपरोक्त स्थानों का सुझाव दिया क्योंकि मैं प्रश्नकर्ता के कुछ भी नहीं मानना ​​चाहता था। इसके अलावा, लॉन्चड प्लिस्ट काम करने की कोशिश करने से पहले, स्क्रिप्ट को वास्तव में सीएलआई से चलाने में सक्षम होना चाहिए।
अफ्रीकी जनता

1

क्या यह निष्पादन योग्य है?

chmod 700 ~/script.sh

टर्मिनल में। इसके अलावा, मैं $ HOME या ~ का उपयोग नहीं करूंगा, बल्कि फ़ाइल के लिए वास्तविक पथ का उपयोग करूंगा।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

पतन का कारण क्या है?
टीजे लुओमा

1

यदि आपकी स्क्रिप्ट उपयोगकर्ता एजेंट है (और इस तरह होम फ़ोल्डर की लाइब्रेरी में स्थित है), तो launchdवर्तमान कार्यशील निर्देशिका होम फ़ोल्डर है। UNIX मार्ग में एक अवधि के साथ घर निर्देशिका को संदर्भित करता है।

तो मूल रूप से, के ./script.shबजाय का उपयोग करें ~/script.sh। ;-)


3
नहींं, लॉन्च की कार्यशील निर्देशिका वास्तव /में '~' नहीं है।
टायिलो

@ टायलो मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि आपका मतलब है "लॉन्चिंग वर्किंग डायरेक्टरी मूल है, तो सभी मामलों में- यहां तक ​​कि उपयोगकर्ता मोड में", कृपया एक संदर्भ प्रदान करें। यदि आपका मतलब है "लॉन्चड टिल्ड के बजाय स्लैश का उपयोग करता है", तो मेरी पोस्ट को फिर से पढ़ें। वैसे, लॉन्च में मेरे पास कई स्क्रिप्ट्स निर्धारित हैं और वे मेरे द्वारा बताए गए व्यवहार का पालन करते हैं। ;-)
कॉन्स्टैंटिनो त्सारोहस

1
@RandyMarch मैं में एक प्रक्षेपण एजेंट बनाया ~/Library/LaunchAgentsतर्क के साथ: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt। जब फ़ाइल /Users/Tyilo/launchd_home.txtसम्‍मिलित है /, नहीं /Users/Tyilo
टायिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.