यह सॉफ्टलिंक अपेक्षित रूप से काम क्यों नहीं करता है?


11
bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1   root    root    4   May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1   root    root    1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#

मेरा OS 24 फ़ोरम (डिफ़ॉल्ट GNOME संस्करण) है।

उदाहरण से, हम जान सकते हैं: के तहत /bin, bashएक द्विआधारी निष्पादन योग्य है; shके लिए एक नरम लिंक है bash

तो, मेरी जानकारी के लिए, type bash and press enterठीक उसी तरह परिणाम होना चाहिए type sh and press enter

जब मैं type bash and press enter, मुझे [root@localhost bin]#उम्मीद के मुताबिक मिलता है।

हालांकि, अगर मैं type sh and press enter, मैं आश्चर्यजनक रूप से मिलता हूं sh-4.3#

इसका क्या कारण है?


पाठ जो आसानी से एक एसई संपादक में कॉपी-पेस्ट किया जा सकता है क्योंकि एक छवि काफी कष्टप्रद है, इसलिए कृपया ऐसा न करें। इसके बजाय, अपने टर्मिनल में पाठ का चयन करें और CTRL-SHIFT-C दबाएं।
बिल्ली

जवाबों:


25

यह एक प्रलेखित विशेषता है।

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

से man bash:

यदि बैश को नाम श के साथ लगाया जाता है, तो यह पोस मानक के अनुरूप होने के साथ-साथ यथासंभव समीप के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है। जब एक इंटरेक्टिव लॉगिन शेल, या एक गैर-इंटरेक्टिव शेल इन-एल्गिन विकल्प के रूप में लागू किया जाता है, तो यह पहले उस क्रम में / etc / profile और ~ / .profile से कमांड को पढ़ने और निष्पादित करने का प्रयास करता है। इस व्यवहार को बाधित करने के लिए --noprofile विकल्प का उपयोग किया जा सकता है। जब नाम श के साथ एक इंटरैक्टिव शेल के रूप में आमंत्रित किया जाता है, तो bash वेरिएबल ENV की तलाश करता है, यदि परिभाषित किया गया है, तो इसका मान बढ़ाता है, और विस्तारित मान का उपयोग पढ़ने और निष्पादित करने के लिए फ़ाइल के नाम के रूप में करता है। चूँकि शेल शेल के रूप में किसी अन्य स्टार्टअप फाइल से कमांड को पढ़ने और निष्पादित करने का प्रयास नहीं करता है, इसलिए --rcfile विकल्प का कोई प्रभाव नहीं पड़ता है। नाम श के साथ लगाया गया एक गैर-इंटरैक्टिव शेल किसी भी अन्य स्टार्टअप फ़ाइलों को पढ़ने का प्रयास नहीं करता है। जब श के रूप में आमंत्रित किया जाता है, तो स्टार्टअप फ़ाइलों को पढ़ने के बाद बैश पॉज़िक्स मोड में प्रवेश करता है।

किसी प्रोग्राम को कैसे पता चलता है कि इसे शुरू करने के लिए किस नाम का इस्तेमाल किया गया था?

यदि यह एसी प्रोग्राम है, तो यह निरीक्षण कर सकता है argv[0]। यदि यह एक शेल या पर्ल स्क्रिप्ट है, तो यह निरीक्षण कर सकता है $0

एक उदाहरण के रूप में, आइए इस सरल शेल स्क्रिप्ट पर विचार करें:

$ cat utc
#!/bin/sh
case "${0##*/}" in
        utc) date -u ;;
        et) TZ=US/Eastern date ;;
esac

$0वह नाम है जिसे स्क्रिप्ट ने बुलाया था। ${0##*/}वह नाम है जिसे स्क्रिप्ट को हटाए गए किसी भी निर्देशिका नामों के साथ बुलाया गया था।

आइए इस सिम्लिंक को बनाते हैं:

ln -s utc et

इसलिए, utcऔर etदोनों एक ही निष्पादन योग्य हैं, लेकिन वे अलग-अलग परिणाम प्रदान करते हैं। जब चलाने के रूप में utc, यह सार्वभौमिक समय का उत्पादन करता है। जब के रूप में चलाया जाता है et, यूएस पूर्वी समय में आउटपुट होता है। उदाहरण के लिए:

$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016

4
ओपी कॉल के समान होने की उम्मीद करता है, क्योंकि यह संभव है कि यह कैसे जोड़ना चाहते हैं। ( argv[0], obvs)
ऑर्बिट

@LightnessRacesinOrbit अच्छा विचार है। मैंने एक उदाहरण जोड़ा।
जॉन १०२४२४

अब बिल्कुल सही। :)
१०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.