शॉप लाइन कमांड लाइन में काम करती है, स्क्रिप्ट में चलने पर नहीं मिलती है


13

मैं कुछ फ़ाइलों को कॉपी करने के लिए एक स्क्रिप्ट लिख रहा हूँ, और shopt -s dotglob cp को डॉटफाइल्स की तरह कॉपी करने के लिए उपयोग करने की कोशिश कर रहा हूँ .jshint

मैं shopt -s dotglobबिना किसी त्रुटि के सीधे bash प्रॉम्प्ट पर चला सकता हूं । हालाँकि, स्क्रिप्ट को चलाना त्रुटि देता है:

script.sh: 81: script.sh: shopt: not found

मैं इस स्क्रिप्ट को शेल शेल्डर के साथ बैश शेल में चला रहा हूं #!/usr/bin/env bash। त्रुटि पंक्ति:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

Google पर कुछ भी उपयोगी नहीं मिल रहा है, किसी भी विचार की समस्या क्या है?


अनुस्मारक के लिए धन्यवाद, उन सभी के लिए चयनित उत्तर जो मैं कर सकता था। इस सवाल के अलावा अभी भी एक है कि अभी तक एक अच्छा जवाब नहीं है।
कुर्तोसिस

3
सरल #!/bin/bashशीर्ष लेख के साथ प्रयास करें ?
ish

और कौन सा उबंटू संस्करण?
ish

2
@izx, यह सही उत्तर है, shoptएक बैश बिलिन है, shनहीं है shoptऔर त्रुटि संदेश से त्रुटि संदेश जैसा दिखता है dash। तो सबसे अधिक संभावना है कि यहां त्रुटि एक स्क्रिप्ट को चला रही है sh(जो कि Ubuntu में dashडिफ़ॉल्ट रूप से है)। यहां तक ​​कि अगर shएक सिमलिंक है bash, तो shइसके साथ चलाने के रूप में एक बैश स्क्रिप्ट को चलाने के समान नहीं है bash
जियरा

जवाबों:


23

टिप्पणियों से उत्तर बनाने के लिए:

आदत से बाहर कई लोग shइसके बजाय अपनी स्क्रिप्ट चलाते हैं bash। पोर्टेबिलिटी एक चिंता का विषय है, तो यह एक अच्छा अभ्यास है, लेकिन बहुत से लोग ऐसा इसलिए करते हैं क्योंकि वे कुछ ऐसी चीज़ों की नकल कर रहे हैं जिन्हें उन्होंने बिना समझे देखा है।

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

#!/bin/bash

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


5
पूरी तरह से क्रॉस-सिस्टम होने के लिए, मैं पसंद करता हूं: #!/usr/bin/env bash जैसा कि यह जानने के लिए कि यह bash का उपयोग करने के लिए env का काम है (उदाहरण के लिए, आपने इसे पैच किया है)।
१५

-1

आपको zsh से बाहर निकलने और बैश को सक्रिय करने की आवश्यकता है जैसा कि दिखाया गया है:

exec bash

कमांड चलाएं

source ~/.bashrc

जिसके बाद आप प्रतिक्रियाशील zsh कर सकते हैं:

exec zsh

उम्मीद है की वो मदद करदे


हममम। 1) मुझे नहीं लगता कि ओपी zsh का उपयोग कर रहा था, 2) AFAIK ~/.basrcको इस मामले में स्टार्टअप पर चलाया जाता है, इसलिए इसे स्पष्ट रूप से कॉल करने की कोई आवश्यकता नहीं है, 3) ओपी की कमान को कहां निष्पादित किया गया है? और 4) execदो बार उपयोग करने से आप प्रारंभिक zsh शेल में किए गए किसी भी पर्यावरण परिवर्तन को खो देते हैं, जो कि अगर आप सिर्फ बैश कहेंगे तो ऐसा नहीं होगा।
xenoid

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