बैश स्क्रिप्ट इसके सामने "बैश" टाइप किए बिना नहीं चलेगी


11

हमारी स्कूल प्रणाली में, हम बिना टाइप किए bashया बिना यह बताए स्क्रिप्ट लिपि को चलाने में सक्षम हैं cshकि यह किस प्रकार की स्क्रिप्ट है। हालांकि, उबंटू में, मुझे bash script.bashउदाहरण के लिए टाइप करना है। क्या यह हमेशा उबंटू में आवश्यक है, या यह कुछ सेटिंग है जो मैं बदल सकता हूं?


1
क्या यह एक निष्पादन योग्य फ़ाइल के रूप में सेट है?
jsolarski

हां, फ़ाइल निष्पादन योग्य है, यही वजह है कि मुझे लगता है कि यह अपने आप ही चल जाएगा।
muttley91

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

1
आप इसे कैसे शुरू करते हैं, और यह कैसे गलत है?
उपयोगकर्ता अज्ञात

.shबैश स्क्रिप्ट के लिए उपयोग नहीं करने के लिए +1 । आमतौर पर फ़ाइल एक्सटेंशन का उपयोग UNIX दुनिया में निष्पादन योग्य स्क्रिप्ट के लिए नहीं किया जाता है, हालांकि।
nyuszika7h

जवाबों:


17
  1. सुनिश्चित करें कि आप स्क्रिप्ट को ./scriptपूर्ण पथ या जो भी हो, से शुरू करें । बस scriptकाम नहीं कर सकता है (यह काम करता है अगर निर्देशिका में है $PATH, जैसे /usr/bin), UNIX सिस्टम के बाद से आपके मार्ग में वर्तमान निर्देशिका (सुरक्षा कारणों से, और यह अच्छा है) की आदत नहीं है!)

  2. सुनिश्चित करें कि स्क्रिप्ट निष्पादन योग्य है, उदाहरण के लिए: chmod +x scriptइसे निष्पादन योग्य बना देगा।

  3. सुनिश्चित करें, #!/bin/bashआपकी स्क्रिप्ट में पहली पंक्ति के रूप में है। यह भी सुनिश्चित करें कि यह किसी प्रकार के विंडोज एडिटर के साथ संपादित नहीं किया गया है, क्योंकि वे अक्सर ईओएल के "डॉस प्रकार" (लाइन के अंत) का उपयोग करते हैं जो यूनिक्स एक से भिन्न होता है (यदि ऊपर की चेकलिस्ट ठीक है, लेकिन आप "खराब" हैं दुभाषिया: ऐसी कोई फ़ाइल या निर्देशिका "या तो, भले ही वह / बिन / बैश न हो, यह अक्सर कारण है, गैर-मुद्रण योग्य के रूप में - इसलिए आप आमतौर पर इसे नहीं देखते हैं - \ r को इसके भाग के रूप में माना जाएगा। दुभाषिया का रास्ता)

अन्य लोगों ने पहले ही उल्लेख किया है: /bin/bashयदि आप बैश सुविधाओं का उपयोग करते हैं तो यह महत्वपूर्ण है, इसके /bin/shलिए सहानुभूति भी थी /bin/bash, लेकिन अब-एक-दिन (जहाँ तक मैंने ध्यान दिया) यह सिमिलिंक है dashजो बैश संगतता, केवल पोसिक्स प्रदान नहीं करेगा sh। यह काफी महत्वपूर्ण है, यहां तक ​​कि हमारी फर्म में काफी महंगे सॉफ्टवेयर्स में भी यह समस्या है: स्क्रिप्ट में #!/bin/shपहली पंक्ति होती है लेकिन यह बैश फंक्शनलिटी पर भी निर्भर करती है।


इसलिए मुझे इसे ऐसे ही चलाना होगा: / .स्क्रिप्ट, जैसा कि मैंने खोजा है। यह हर बार "बैश" टाइप करने से बेहतर है, और यह समझ में आता है। मेरा मानना ​​है कि मैं यह पहले से जानता था, यह सिर्फ मेरे दिमाग फिसल गया। ओह ठीक है, धन्यवाद!
muttley91

सिद्धांत रूप में आप वर्तमान कार्यशील निर्देशिका को PATH चर में डाल सकते हैं, तो आप "./cript" के बजाय बस "स्क्रिप्ट" का उपयोग कर सकते हैं, लेकिन मैं आपको चेतावनी देता हूं: यह वास्तव में UNIX सिस्टम पर एक आदत नहीं है और यह एक सुरक्षा समस्या हो सकती है। ! इसके अलावा स्कूल में चीजों को इस तरह से सीखना अच्छा नहीं है, जो यूनिक्स सिस्टम पर कभी हल नहीं हुआ है, इसलिए मैं इस समाधान से
बचूंगा

1
या, अधिमानतः, #!/usr/bin/env bashजो थोड़ा अधिक पोर्टेबल है।
स्पार्कहॉक

4

सुनिश्चित करें कि फ़ाइल की पहली पंक्ति पढ़ती है:

#!/bin/bash

यदि शेबंग है #!/bin/sh, तो आपको किसी भी बैश-विशिष्ट सुविधाओं का उपयोग नहीं करना चाहिए, केवल POSIX सुविधाएँ। यहां तक ​​कि अगर /bin/shएक सिमलिंक है bash, तो bash शोस के रूप में चलने पर POSIX संगतता मोड में चलेगा, कुछ (लेकिन सभी नहीं) बैश सुविधाओं को अक्षम करता है।

आपको यह भी सुनिश्चित करना होगा कि स्क्रिप्ट निष्पादन योग्य है, निश्चित रूप से।


नहीं, मैंने इसे वैसे भी बस आदत से बाहर सेट किया।
muttley91

0

एक वैकल्पिक, दृढ़ता से हतोत्साहित रास्ता जोड़ रहा .है PATH

PATH=".:$PATH"

या

PATH="$PATH:."

इस दृष्टिकोण के साथ समस्या यह है कि पूर्व के मामले में, किसी भी सिस्टम कमांड को मौजूदा निर्देशिका से निष्पादनयोग्य के साथ ओवरराइड किया जा सकता है, और बाद के मामले में, अज्ञात कमांड को अभी भी ओवरराइड किया जा सकता है।

निम्नलिखित को धयान मे रखते हुए:

फाइल: एल.एस.

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

सबसे अधिक संभावना है कि आप तब तक नोटिस नहीं करेंगे जब तक कि बहुत देर न हो जाए।


1
शब्द का चुनाव यहाँ थोड़ा भ्रामक है। कमानों को ओवरराइड नहीं किया जाएगा। यदि आपके पास वर्तमान वर्किंग डायरेक्टरी में एक कमांड है जो सिस्टम निर्देशिका में रहने वाले के समान नाम है echo, तो उदाहरण के लिए कहें , आपकी निर्देशिका में एक का उपयोग केवल इसलिए किया जाएगा क्योंकि उस निर्देशिका को PATHवेरिएबल में सेट किया गया है /bin। शेल बस विशेष निर्देशिकाओं में अपने आदेश के आधार पर आदेशों की तलाश करता है PATH, और कुछ भी नष्ट / नष्ट नहीं करता है। लेकिन हां, इसके निहितार्थ हैं
सर्गी कोलोडियाज़नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.