एक बैश स्क्रिप्ट को प्रोग्रामेटिक रूप से निष्पादित करना


12

मुझे ड्राइव बनाने और माउंट करने के लिए बैश स्क्रिप्ट बनाने की आवश्यकता है। तो, दो सरल आदेश। दोनों "काम" जब कमांड लाइन में प्रवेश किया।

स्क्रिप्ट हर बार एक सामान्य उपयोगकर्ता लॉग इन करता है और बनाया जाता है, इसलिए मुझे उस समय इस स्क्रिप्ट को निष्पादन योग्य बनाने के लिए एक विधि की आवश्यकता होती है। अब तक, मुझे यह काम करने के लिए नहीं मिला। उदाहरण के लिए, पहला भाग mkdir /vvv/ggggआगे नहीं बढ़ता क्योंकि स्क्रिप्ट निष्पादन योग्य नहीं है (मैं अनुमान लगा रहा हूं)।

आशा है कि यह समझ में आता है। क्या यह संभव है? इस काम को करने के किसी भी विचार की सराहना की जाएगी।

अपडेट :

आपकी प्रतिक्रियाओं के लिए धन्यवाद। मुझे संभवतः कुछ अतिरिक्त जानकारी जोड़नी चाहिए, इसके अलावा मैं लिनक्स पर नया हूं।

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

तो, वहाँ अनुप्रयोग एक लॉगिन स्क्रिप्ट प्रबंधन समारोह है जहाँ मैं एक उपयोगकर्ता के लिए एक स्क्रिप्ट टाई कर सकते हैं। शुद्ध उपयोग के साथ एक सरल विंडोज़ स्क्रिप्ट पूरी तरह से ठीक काम करती है। हालाँकि, जब मैं लिनक्स बैश स्क्रिप्ट को लागू करने की कोशिश करता हूं तो कुछ भी नहीं होता है।

मैं सोच रहा हूं कि क्योंकि chmod +xस्क्रिप्ट को निष्पादन योग्य बनाने के लिए मुझे पहले स्क्रिप्ट के खिलाफ प्रदर्शन करना होगा, यही कारण है कि इसकी असफलता। वैसे, उल्टे चेरो जेल में चलता है। मैंने एक स्क्रिप्ट बनाई है, इसे सहेजा और स्क्रिप्ट नहीं मिली। मैंने चुरोट जेल के अंदर और बाहर दोनों जगह खोज की।

मुझे प्रारंभिक स्क्रिप्ट संदर्भ के लिए dan08 द्वारा दृष्टिकोण पसंद है, एक और स्क्रिप्ट जिसे मैं पा सकता हूं और मैन्युअल रूप से निष्पादन योग्य बना सकता हूं। क्या मैं उसी समस्या में भाग जाऊंगा?

क्या यह अतिरिक्त जानकारी स्थिति को स्पष्ट करती है? अग्रिम में धन्यवाद।

तस्वीरें संलग्न

[[लॉगिन प्रबंधन प्रबंधन कंसोल] [१]

[[विंडोज़ स्क्रिप्ट जो काम करती है] [2]

[[सरल लिनक्स स्क्रिप्ट जो काम नहीं करती है] [3]

क्षमा करें, मैं अभी तक चित्र पोस्ट नहीं कर सकता


क्या आप किसी उपयोगकर्ता द्वारा लॉग इन करने पर स्क्रिप्ट चलाने के लिए क्रॉन जॉब लिखने जा रहे हैं? यह मार्गदर्शिका आपको उन्हें निष्पादन योग्य बनाने में भी मदद करनी चाहिए
स्लीप डिपेंडेड बुलबसौर

1
"स्क्रिप्ट हर बार एक सामान्य उपयोगकर्ता के लॉग को बनाया और निष्पादित किया जाता है" क्यों? मैं इसे ठीक कर दूंगा क्योंकि यह मुझे अनैतिक लगता है। मैं स्क्रिप्ट को एक पैरामीटर के रूप में उपयोगकर्ता को खिलाऊंगा और बनाई गई स्क्रिप्ट को अछूता छोड़ दूंगा।
रिन्जविंड

1
इस सवाल में एक अजीब सा मिश्रण है जो मुझे भ्रम में छोड़ देता है कि वर्तमान में क्या होता है और आप क्या करना चाहते हैं। यदि आप वर्तमान स्थिति क्या है इसके बारे में थोड़ा और विशिष्ट हो सकते हैं तो यह मदद करेगा।
ओली

कृपया अपने प्रश्न को संपादित करें और हमें स्क्रिप्ट दिखाएं। हमें इसका उत्पादन भी दिखाओ ls -l scriptname। आपको यह भी स्पष्ट करना चाहिए कि स्क्रिप्ट वास्तव में कैसे बनाई गई है और आप इसे केवल एक बार क्यों नहीं बनाते हैं और इसे अकेले छोड़ देते हैं। अंत में, आपके सामान्य उपयोगकर्ता को लिखना /varनहीं चाहिए और इसलिए वहां निर्देशिका बनाने में सक्षम नहीं होना चाहिए।
टेराडन

1
टिप्पणियों में छवि लिंक पोस्ट करें। हम उन्हें (सुझाए गए) संपादन के माध्यम से आयात करेंगे।
मूरू

जवाबों:


19

आपको दो काम करने होंगे:

  1. स्क्रिप्ट की शुरुआत में स्क्रिप्ट दुभाषिया का संदर्भ:

    #!/bin/bash
  2. निष्पादन योग्य बनाने के लिए अनुमतियाँ सेट करें:

    chmod +x myscript.sh

3

अपनी स्क्रिप्ट को निष्पादन योग्य बनाने के बजाय, आप एक अलग तरीका अपना सकते हैं और स्क्रिप्ट को कॉल करने के तरीके को बदल सकते हैं।

script.sh एक निष्पादन योग्य स्क्रिप्ट चलाने के लिए पर्याप्त है।

तथापि

यदि आप इसे चलाने के लिए प्रोग्राम निर्दिष्ट करते हैं, तो एक गैर-एक्सपेक्टेबल स्क्रिप्ट को चलाना संभव है।

तो /bin/bash script.shया bash script.shया python script.pyसभी गैर-निष्पादन स्क्रिप्ट चलेंगे।

इसलिए मेरा सुझाव यह होगा कि स्क्रिप्ट को जिस तरह से संपादित किया जाए, उसे संपादित करें और इसे चलाने के लिए उपयोग किए जाने वाले बाइनरी को निर्दिष्ट करें।


मेरी तरफ से मैं आमतौर पर उन्हें अतिशयोक्तिपूर्ण बना देता हूं, क्योंकि अगर आप ऐसा नहीं करते हैं तो आप फ़ाइल को स्वयं से स्थानांतरित नहीं कर सकते। उदाहरण के लिए, अजगर os.execv(__file__, sys.argv)काम नहीं करेगा, और निश्चित रूप से इस तरह की स्थिति और भी हैं। यदि सुरक्षा एक लक्ष्य है, तो इसे रूट / sudo से उपयोग करें बजाय उपयोगकर्ताओं को बायनेरिज़ को चलाने के लिए। इसके अलावा, यदि लक्ष्य सुरक्षा है, तो आप नहीं चाहते हैं कि वे स्क्रिप्ट चलाने में सक्षम हों, क्योंकि आप सिस्टम को वैसे भी नुकसान पहुंचा सकते हैं ... निष्पादन योग्य या नहीं। इसलिए मैं यह नहीं देखता कि उन्हें निष्पादन योग्य बनाने से बचना क्यों महत्वपूर्ण है।
m3nda

0

C, C ++ या Python आदि में प्रोग्राम बनाएं और बैश स्क्रिप्ट को निष्पादित करने के लिए सिस्टम कमांड का उपयोग करें।

उदाहरण के लिए एक सी कार्यक्रम की तरह दिखेगा:

#include "stdio.h"
int main(int argc, char const *argv[])
{
    system('chmod +x path/yourbashscript.sh');
    system('path/yourbashscript.sh');
    return 0;
}

स्टार्टअप पर प्रोग्राम को निष्पादित करने के लिए इसे स्टार्टअप प्रोग्राम की सूची में जोड़ें। अपने डैश से स्टार्टअप एप्लिकेशन खोलें और ऐड बटन पर क्लिक करके संकलित निष्पादन योग्य को सूची में जोड़ें।


2
-1: यह वास्तव में एक उत्तर नहीं है। अजगर किसी शेल स्क्रिप्ट से बेहतर क्यों होगा? अकेले चलो C! किसी भी स्थिति में, आप वास्तव में यह नहीं दिखा रहे हैं कि यह कार्यक्रम कैसा दिखेगा और आप यह नहीं बता रहे हैं कि स्टार्टअप प्रोग्राम सूची में प्रोग्राम कैसे जोड़ें।
टेराडन

आपके पहले प्रश्न का उत्तर यह बताकर दिया जा सकता है कि कैसे एक प्रोग्रामिंग भाषा एक स्क्रिप्टिंग भाषा से अलग है, जैसा कि मैंने अपना उत्तर संपादित किया है
akxer

संपादन के लिए धन्यवाद, -1 हटा दिया गया। हालांकि, लिनक्स पर एक शेल स्क्रिप्ट लॉन्च करने के लिए सी प्रोग्राम का उपयोग करना पूरी तरह अनावश्यक है और अनावश्यक ओवरहेड जोड़ता है। सिर्फ स्टार्टअप अनुप्रयोगों के लिए स्क्रिप्ट को ही क्यों न जोड़ें? या, यदि आप वास्तव में सी का उपयोग करना चाहते हैं तो इसे सीधे क्यों लागू नहीं करें? C में एक रैपर बनाना जो Linux के अंतर्गत एक शेल स्क्रिप्ट को कॉल करता है, जब तक आपको SUID बिट सेट के साथ स्क्रिप्ट को चलाने की आवश्यकता न हो, तब तक कोई मतलब नहीं है। उस मामले में भी, आमतौर पर सरल उपाय होते हैं।
टेराडन

1
-1: यह अभी भी विफल होगा यदि स्क्रिप्ट में अनुमतियाँ निष्पादित नहीं हुई थीं। आपको कॉल करना होगा bash path/yourbashscript.sh
मुरु

1
जो इस सवाल को उठाता है, bash path/yourbashscript.shइस सी कार्यक्रम को संकलित करने और चलाने के बजाय सीधे क्यों नहीं चलाया जाता है?
मुरु

0

आप कमांड लाइन में निम्नलिखित को चलाकर अपनी बैश स्क्रिप्ट को निष्पादन योग्य बना सकते हैं।

cd ~/path/to/file
chmod +x nameoffile.sh

फिर, इसे स्टार्ट अप पर निष्पादित किया जा सकता है, इसे स्टार्टअप कार्यक्रमों की सूची में जोड़कर किया जा सकता है जैसा कि @akabhirav ने कहा।


यह मुझे लगता है कि सवाल (कुछ हद तक) से पता चलता है कि वह चामोद से परिचित है। लेकिन वह इसे स्क्रिप्ट के भीतर से ही निष्पादन योग्य बनाने की विधि पूछ रहा है (इसलिए उसे मैन्युअल रूप से ऐसा करने की आवश्यकता नहीं है)। हालांकि मैं अभी भी विधि पर सवाल उठाता हूं: मक्खी पर एक स्क्रिप्ट को फिर से बनाना ऐसा करने का तरीका नहीं है।
रिनविंड सेप

0

SHC एक सामान्य शेल स्क्रिप्ट कंपाइलर है। यह एक स्क्रिप्ट लेता है, जो कमांड लाइन पर निर्दिष्ट होता है और सी सोर्स कोड का उत्पादन करता है। उत्पन्न स्रोत कोड फिर एक छीन बाइनरी का उत्पादन करने के लिए संकलित और जुड़ा हुआ है।

संकलित बाइनरी अभी भी शेल कोड की पहली पंक्ति (शेलबंग: #!/bin/shया इस तरह) में निर्दिष्ट शेल पर निर्भर करेगा , इस प्रकार एसएचसी पूरी तरह से स्वतंत्र बायनेरिज़ नहीं बनाता है।

SHC स्वयं एक संकलक नहीं है जैसे कि cc। बल्कि एक शेल स्क्रिप्ट को एनकोड और एनक्रिप्ट करता है और अतिरिक्त समाप्ति क्षमता के साथ सी सोर्स कोड उत्पन्न करता है। यह तब सिस्टम कंपाइलर का उपयोग स्ट्रिप्ड बाइनरी को संकलित करने के लिए करता है जो मूल स्क्रिप्ट की तरह ही व्यवहार करता है। निष्पादन के बाद, संकलित बाइनरी शेल के -cविकल्प के साथ कोड को डिक्रिप्ट और निष्पादित करेगा ।


यदि निष्पादन योग्य अभी भी मूल शेल वातावरण की आवश्यकता है तो इसका क्या मतलब है? यह कैसे किसी भी सिर्फ एक जोड़ने से बेहतर है #!और chmod +x?
xiota
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.