सवाल क्यों एक ही स्क्रिप्ट के लिए sh और ./ diffent आउटपुट प्रदान करते हैं


$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c

Emp1.sh स्क्रिप्ट की सामग्री

$ cat emp1.sh
#!/bin/bash
#emp1.sh: interactive version uses read to take input

echo "Enter the pattern to be searched: \c"
read pname
echo "Enter the file to be used: \c"
read flname
echo "searching for the pattern $pname from the file $flname"
grep "$pname" $flname
echo "Selected records are shown above"

मुझे प्रदान करें कि पहली पंक्ति में उनका अंतर क्यों है \ सी उनकी दूसरी पंक्ति में क्यों है।

$ sh emp1.sh
Enter the pattern to be searched: 
$ ./emp1.sh
Enter the pattern to be searched: \c

1
2017-11-23 08:28


मूल


वह स्क्रिप्ट एक श-स्क्रिप्ट और बैश-स्क्रिप्ट के रूप में गलत है। एक लघु लिपि के रूप में, printf इसके बजाय इस्तेमाल किया जाना चाहिए echo। एक बैश स्क्रिप्ट के रूप में, readके बजाय एसपी का इस्तेमाल किया जाना चाहिए echo। जैसे read -ep "Enter file to be used: " flname - geirha


जवाब:


वास्तव में दो अलग-अलग गोले हैं। एक है /bin/bash और दूसरा है /bin/dash। तथा /bin/sh वास्तव में एक सॉफ्टलिंक है /bin/dash। इसे सत्यापित करने के लिए, टर्मिनल में लिखें,

which sh

आपको आउटपुट मिलेगा: /bin/sh

अगला प्रकार ls -l /bin/sh टर्मिनल में, जो कुछ वापस लौटाएगा,

lrwxrwxrwx 1 root root 4 May 16 20:23 /bin/sh -> dash

जो तथ्य दिखाता है कि sh का एक सॉफ्टलिंक है /bin/dash। आप आगे की कोशिश कर सकते हैं which dash

वास्तव में bash है sh अधिक सुविधाओं और बेहतर वाक्यविन्यास के साथ। उनमें से दोनों के पास लगभग एक ही आदेश हैं, लेकिन वे अलग हैं।

यहाँ क्या हो रहा है

जब आप दौड़ रहे हों sh emp1.sh तब लिपि द्वारा संभाला जाता है dash लेकिन जब आप भागते हैं ./emp1.sh शेबांग लाइन के कारण (#!/bin/bash) लिपि के शीर्ष पर bash खोल इसे संभालती है। तो आप आउटपुट में थोड़ा अलग स्वरूपण प्राप्त करते हैं। याद रखो bash कुछ सुधार वाक्यविन्यास है।


3
2017-11-23 09:49





आउटपुट अलग है क्योंकि आप दो अलग-अलग कार्यक्रमों का उपयोग कर रहे हैं।

पहले मामले में sh emp1.sh आप नाम का एक कार्यक्रम शुरू करते हैं sh और emp1.sh में निर्देशों को निष्पादित करने के लिए कहें। वह कार्यक्रम sh शायद बोर्न शेल (श), एक बोर्न है फिर शैल (बैश) क्लासिक शैल का अनुकरण करने की कोशिश कर रहा है (और इस प्रकार अपने मूल मोड से अलग प्रतिक्रिया दे रहा है), डैश या यहां तक ​​कि कुछ और भी।

जब आप उपयोग करते हैं ./emp1.sh आप स्क्रिप्ट empt1.sh स्वयं को निष्पादित करने का प्रयास करते हैं। इसकी पहली पंक्ति में एक शेबांग और एक दुभाषिया है (#!/bin/bash) यह बताते हुए कि इसे बैश (और इसकी सभी सुविधाओं) का उपयोग करने की आवश्यकता है।

इसका मतलब है कि आप पहले मामले की तुलना में एक अलग प्रोग्राम / मोड का उपयोग करते हैं। और आप अलग आउटपुट प्राप्त करते हैं।

इसे सत्यापित करने के लिए, इन दोनों में से किसी एक को आज़माएं:

  • /bin/bash emp1.sh  (जो ./emp1.sh के समान उत्पादन का उत्पादन करना चाहिए)
  • या पहली पंक्ति को बदलें #!/bin/sh

-1
2017-11-23 11:37



/bin/sh आधुनिक यूनिक्स और यूनिक्स जैसी प्रणालियों में एक पॉज़िक्स खोल है। आप सौभाग्य से बोर्न को नहीं देखते हैं /bin/sh अब और बहुत कुछ उबंटू के मामले में, डैश को डिफ़ॉल्ट रूप से sh के रूप में उपयोग किया जाता है। - geirha