शेल बिल्डरों को बड़े अक्षरों के साथ क्यों नहीं चलाया जा सकता है, लेकिन अन्य आदेशों से कर सकते हैं?


33

ऐसा क्यों है?

जब मैं ऐसा करता हूं

CD ~/Desktop

यह मुझे डेस्कटॉप पर नहीं ले जाता है। लेकिन यह:

echo "foo
bar" | GREP bar

मुझे देता है:

bar

4
कुछ भी आउटपुट alias GREPया जाँच करें which GREP
chepner

1
तुम वहाँ जाओ। आपके पास एक कमांड है जिसका नाम GREPअलग है grep। (सच है, यह सिर्फ एक कड़ी या प्रतीकात्मक लिंक हो सकता है /usr/bin/grep, लेकिन शेल के दृष्टिकोण से, यह एक अलग कमांड है।)
chepner

12
रुको: आप मैक ओएस एक्स पर हैं, क्या आप नहीं हैं? HFS + डिफ़ॉल्ट रूप से केस-प्रोटेक्टिंग होता है, जिसका अर्थ है कि यदि आप फ़ाइल बनाते समय केस करते हैं , लेकिन फ़ाइल मौजूद होने के बाद, लुकअप केस-असंवेदनशील होते हैं। अर्थात्, bashनाम वाली फ़ाइल के लिए पूछ सकते हैं GREP, लेकिन फ़ाइल सिस्टम grepएक मैच मानता है।
chepner

1
हां, क्योंकि यह यूनिक्स है।
डिस्प्लेनेम

4
फ़ाइल सिस्टम ऑपरेटिंग सिस्टम से स्वतंत्र हैं। आप मैक ओएस एक्स के साथ अन्य फाइल सिस्टम का उपयोग कर सकते हैं, और आप (सिद्धांत रूप में) अन्य ऑपरेटिंग सिस्टम के साथ एचएफएस + का उपयोग कर सकते हैं। इसके अलावा, आप HFS + केस-संवेदी बना सकते हैं; मामला-संरक्षण व्यवहार केवल ऐतिहासिक कारणों के लिए डिफ़ॉल्ट है।
शेपनर

जवाबों:


71

आपके अन्य प्रश्नों से मैं इसे ले रहा हूँ आप ओएस एक्स का उपयोग कर रहे हैं। ओएस एक्स पर डिफ़ॉल्ट एचएफएस + फाइलसिस्टम केस-असंवेदनशील है: आपके पास एक ही निर्देशिका में "एबीसी" और "एबीसी" नामक दो फाइलें नहीं हो सकती हैं, और एक्सेस करने की कोशिश कर रहे हैं। या तो नाम एक ही फ़ाइल के लिए मिल जाएगा। यही बात Cygwin के तहत भी हो सकती है, या केस-असंवेदनशील फाइल सिस्टम के साथ (जैसे FAT32 या साइग्विन के ciopfs ) के साथ कहीं भी हो सकती है।

क्योंकि grepयह एक वास्तविक निष्पादन योग्य है, इसे फाइलसिस्टम (निर्देशिका में PATH) पर देखा जाता है। जब आपका खोल या /usr/binतो में दिखता हैgrepGREP यह grepनिष्पादन योग्य लगेगा ।

शेल बिल्डिंग्स हैं फाइलसिस्टम पर नहीं देखा जाता है: क्योंकि वे अंदर निर्मित होते हैं, वे शेल के अंदर (केस-संवेदी) स्ट्रिंग तुलना के माध्यम से पहुंचते हैं।

आप जो भी सामना कर रहे हैं वह एक दिलचस्प मामला है। जबकि cdएक अंतर्निहित, पहुंच-केस-संवेदी है, CDएक निष्पादन योग्य के रूप में पाया जाता है /usr/bin/cdcdनिष्पादन बहुत बेकार है क्योंकि cdवर्तमान खोल निष्पादन वातावरण को प्रभावित करता है, यह हमेशा एक खोल के रूप में प्रदान की जाती है नियमित रूप से निर्मित है, लेकिन वहाँ एक है cdनिष्पादन POSIX के लिये वैसे भी, जो अपने आप के लिए निर्देशिका बदलता है और फिर तुरंत समाप्त हो जाता है, आसपास के खोल छोड़ने यह कहाँ शुरू हुआ

आप इन्हें typeबिलिन के साथ आज़मा सकते हैं :

$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD

typeआपको बताता है कि जब आप उस कमांड को चलाते हैं तो शेल क्या करेगा। जब आप चलाते हैं cdतो आप बिलिन तक पहुँचते हैं, लेकिन CDनिष्पादन योग्य पाता है। अन्य बिल्डरों के लिए, बिलिन और निष्पादन योग्य यथोचित संगत (प्रयास echo) होंगे, लेकिन इसके लिए cdसंभव नहीं है।


1
अच्छा उत्तर। मैं साइबरविन कहने वाला था, जिसका प्रभाव समान होगा।
जोशुआ

@ जोशुआ ओपी की समस्या हल हो गई है, लेकिन मुझे लगता है कि सवाल के आगे के पाठकों के लिए, एक साइबर आधारित जवाब कम से कम मौजूदा के रूप में उपयोगी होगा; हो सकता है कि आप इसे एक अलग उत्तर बना सकते हैं, भले ही संक्षिप्त हो, और विवरण के लिए मौजूदा एक को संदर्भित करें?
वोल्कर सेगेल

1
Posix को cd जैसी बेकार कमांड की आवश्यकता क्यों होती है, और osx की आंतरिक सीडी योग्य क्यों नहीं है?
जॉन

2
51 अपवित्र! मुझे टिप्पणी के बजाय सिर्फ उत्तर पोस्ट करना चाहिए :)
chepner

1
/ usr / bin / cd का एक उद्देश्य है। वाक्यविन्यास / usr / bin / cd निर्देशिका कार्यक्रम तर्क है
यहोशू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.