के बीच संबंध lsऔरdir
lsऔर dirअलग-अलग प्रोग्राम हैं जो समान व्यवहार करते हैं। जैसा कि नीचे समझाया और संदर्भित किया गया है, का उद्देश्य dirएक कमांड प्रदान करना है, lsजिसका आउटपुट किसी टर्मिनल पर जा रहा है या नहीं, इसके आधार पर भिन्न नहीं होता है । इस मदद को प्राप्त करने के लिए, dirअपने आउटपुट को इस तरह से प्रारूपित करना चाहिए जो किसी टर्मिनल में देखने और फ़ाइल या पाइप पर लिखने के लिए उचित और उपयोगी हो।
इसके बारे में दो आम गलतफहमियाँ हैं dir:
- कई लोगों का मानना
dirहै कि यह एक उपनाम है ls, लेकिन ऐसा नहीं है। न तो कमांड दूसरे का एक उपनाम है, और उबंटू में डिफ़ॉल्ट रूप से, dirएक उपनाम नहीं है। lsऔर dirअलग-अलग, गैर-समान निष्पादन योग्य द्वारा प्रदान किए जाते हैं।
- कई लोगों का मानना
dirहै कि अस्पष्ट ऐतिहासिक कारणों से या कुछ मानक या कुछ अन्य ओएस के साथ संगतता प्रदान करने के लिए मौजूद है। ऐसी बात नहीं है। lsयह कॉम्पैटिबिलिटी के लिए जिस तरह से व्यवहार करता है। dir, जो संगत नहीं है क्योंकि यह एक मानक यूनिक्स कमांड नहीं है, एक वैकल्पिक तरीके से व्यवहार करता है जिसे डेवलपर्स अपने आप में मूल्यवान मानते हैं और संभवतः बेहतर भी।
ठीक है, लेकिन वास्तव में कैसे lsऔर dirअलग है?
दोनों lsऔर dirनिर्देशिकाओं की सामग्री को सूचीबद्ध करते हैं। उनके डिफ़ॉल्ट व्यवहार में दो विशिष्ट अंतर उन्हें अलग करते हैं।
जब इसका मानक आउटपुट एक टर्मिनल होता है, तो lsफ़ाइल नाम को लंबवत क्रमबद्ध कॉलम (जैसे ls -C) में सूचीबद्ध करता है । जब इसका मानक आउटपुट टर्मिनल नहीं होता है (उदाहरण के लिए, एक फ़ाइल या पाइप ), तो lsप्रति लाइन एक फाइलनाम को सूचीबद्ध करता है (जैसे ls -1)।
इसका मानक आउटपुट टर्मिनल है या नहीं, dirफ़ाइल नाम को क्रमबद्ध स्तंभों (जैसे ls -C) में सूचीबद्ध करता है ।
दोनों के लिए lsऔर dir, इन चूक द्वारा ओवरराइड किया जा सकता --format=झंडा और से -1, -C, -m, और -xझंडे, जो विशेष रूप से संक्षिप्त --format=विकल्प। देखें 10.1.4 जनरल उत्पादन स्वरूपण में GNU coreutils संदर्भ मैनुअल जानकारी के लिए।
जब इसका मानक आउटपुट एक टर्मिनल होता है और सूचीबद्ध होने के लिए एक फ़ाइलनाम में नियंत्रण वर्ण होते हैं , प्रत्येक नियंत्रण वर्ण (जैसे ) के बजाय lsप्रिंट होता है । जब इसका मानक आउटपुट टर्मिनल नहीं होता है, तो वर्णों को नियंत्रित करता है जैसा कि (जैसे ) है।?ls -qlsls --show-control-chars
मानक मानक एक टर्मिनल है या नहीं, जब dirएक नियंत्रण चरित्र या किसी भी अन्य चरित्र का सामना करना पड़ता है , जिसे विशेष रूप से व्याख्या किया जाएगा यदि एक खोल में दर्ज किया जाता है, तो यह पात्रों के लिए बैकलैश दृश्यों को प्रिंट करता है। इसमें रिक्त स्थान जैसे अपेक्षाकृत सामान्य वर्ण भी शामिल हैं। उदाहरण के लिए, dirएक प्रविष्टि सूचीबद्ध करेगा जिसे कहा Documents backupsजाता है Documents\ backups। यह जैसा है ls -b।
दोनों के लिए lsऔर dir, इन चूकों को 10.1.7 में सूचीबद्ध झंडे द्वारा ओवरराइड किया जा सकता है और फ़ाइल नामों को जीएनयू कोरुटिल्स संदर्भ मैनुअल में प्रारूपित किया जा सकता है । इसमें शामिल हैं -b, -q, --quoting-style=, और कुछ अन्य।
स्रोत : ls मंगलाचरण और dir मंगलाचरण , GNU Coreutils संदर्भ मैनुअल में ।
क्यों है dir?
एक अलग dirउपयोगिता के लिए तर्क 4.5 मानकों में अंतर के लिए दिया जाता है आम तौर पर जीएनयू कोडिंग मानकों का । मैं डेवलपर्स के तर्क को समझने के लिए उस पूरे खंड को पढ़ने की सलाह देता हूं, लेकिन यहां इस पर प्रकाश डाला गया है : ls/dir
कृपया इसे लागू करने के लिए उपयोग किए जाने वाले नाम पर निर्भर करते हुए उपयोगिता का व्यवहार न करें ...।
इसके बजाय, वैकल्पिक व्यवहार के बीच चयन करने के लिए रन टाइम विकल्प या संकलन स्विच या दोनों का उपयोग करें ...।
इसी तरह, कृपया कमांड-लाइन प्रोग्राम का व्यवहार आउटपुट डिवाइस के प्रकार पर निर्भर न करें …।
संगतता को आउटपुट डिवाइस के प्रकार पर निर्भर करने के लिए कुछ कार्यक्रमों की आवश्यकता होती है। यदि सभी उपयोगकर्ता अपेक्षा करते हैं तो ऐसा करना विनाशकारी होगा lsया shनहीं। इनमें से कुछ मामलों में, हम प्रोग्राम को एक पसंदीदा वैकल्पिक संस्करण के साथ पूरक करते हैं जो आउटपुट डिवाइस प्रकार पर निर्भर नहीं करता है। उदाहरण के लिए, हम एक dirकार्यक्रम प्रदान करते हैं ,
lsसिवाय इसके कि इसका डिफ़ॉल्ट आउटपुट स्वरूप हमेशा बहु-स्तंभ प्रारूप होता है।
जीएनयू प्रोजेक्ट इसे तकनीकी दृष्टिकोण से अवांछनीय मानता है, उपयोगिता के लिए विभिन्न आउटपुट का उत्पादन करने के लिए यह किस प्रकार के उपकरण के आधार पर लिख रहा है (कम से कम उपयोगिता के डिफ़ॉल्ट कॉन्फ़िगरेशन में)। कुछ उपयोगिताओं के लिए, सहित ls, डिवाइस-निर्भर आउटपुट संगतता के लिए आवश्यक है और इसलिए यह उपयोगकर्ताओं की अपेक्षा के अनुरूप काम करता है। कुछ उपयोगकर्ता विशेष रूप से इस उपकरण-निर्भर व्यवहार को पसंद करते हैं।
जबकि lsडिवाइस को स्वतंत्र रूप से व्यवहार करने के लिए यथोचित नहीं लिखा जा सकता था, dirइसे प्राप्त करने के लिए एक अलग उपयोगिता बनाई गई थी। इस प्रकार dirउपयोगिता नहीं है जो ऐतिहासिक संगतता के कारणों के लिए अजीब व्यवहार करती lsहै - है ।
कैसे को देखने के लिए ls, dirऔर संबंधित vdirउपयोगिता अनावश्यक कोड दोहराव बिना coreutils स्रोत कोड में लागू किया जाता है, को देखने के ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, और ls.c।
है dirवास्तव में उपयोगी?
यदि आपने कभी भी lsमल्टी-कॉलम आउटपुट का उत्पादन किया है, तब भी जब आप इसे less( ls | less) या फ़ाइल ( ls > out.txt) में रीडायरेक्ट करते हैं , तो आप इसका उपयोग कर सकते हैं dirया कर सकते हैं ls -C।
यदि आप कभी भी चाहते हैं कि आप सीधे दिखाए गए फ़ाइल नाम की प्रतिलिपि बनाls सकते हैं और इसे कमांड के भाग के रूप में उपयोग कर सकते हैं, तो आप उद्धृतdir या उपयोग किए बिना चिंता कर सकते हैं ls -b।
dirके समतुल्य है ls -Cb, इसलिए इस अर्थ में आपको आवश्यकता नहीं है dir। लेकिन dirविकल्पों का एक संयोजन प्रदान करता है जो व्यवहार में अक्सर उपयोगी होता है (हालांकि व्यापक रूप से ज्ञात नहीं है)।
मुझे ls(यहां तक कि ls -Cb) से रंगीन उत्पादन क्यों मिलता है dir?
अधिकांश उबंटू उपयोगकर्ताओं के पास एक उपनाम है lsजो चलता है ls --color=auto। जब lsउपनाम और बाहरी आदेश दोनों मौजूद होते हैं, तो उपनाम सरल, संवादात्मक आदेशों में पूर्वता लेता है।
उपनाम की परिभाषाओं का पुनरावर्ती रूप से विस्तार नहीं किया गया है - यह बाहरी lsआदेश है जो lsउपनाम के साथ बुला रहा है --color=auto। अलियास कैसे काम करते हैं, इसके बारे में अधिक जानकारी के लिए बैश संदर्भ मैनुअल में 6.6 उपनाम देखें ।
जब पास किया जाता है ls, dirया vdir(और कुछ अन्य कमांड, जैसे grep), --color=autoरंग का उपयोग करता है जब इसका आउटपुट एक टर्मिनल होता है, लेकिन अन्यथा नहीं।
उबंटू में डिफ़ॉल्ट रूप से, उपयोगकर्ता खाते इसके साथ बनाए जाते हैं ~/.bashrc:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
आप देखेंगे कि lsअन्य नाम ( alias ls='ls --color=auto') थोड़ी देर के लिए उन, uncommented है dirऔर vdirबाहर टिप्पणी की है के साथ #तो वे कोई प्रभाव नहीं ले। यही कारण है, जबकि dirएक अन्य नाम नहीं है, lsहै (लेकिन नहीं dir) ।
मैं dirरंगीन उत्पादन कैसे करूं ?
रंगीन आउटपुट को सक्षम करने के लिए dir, बस .bashrcअपने होम डायरेक्टरी में एडिट करें और #alias dir='dir --color=auto'लीड को हटाकर लाइन को अनकम्प्लीट करें #। परिवर्तन के बाद शुरू किए गए गोले में, dirएक उपनाम होगा।
यदि आप वर्तमान शेल में परिवर्तन चाहते हैं, तो आप उपनाम के रूप में एक कमांड .bashrcचला सकते हैं, या आप चलाकर स्रोत बना सकते हैं . ~/.bashrc।
यह यकीनन के मुख्य बिंदु के खिलाफ जाता है dir- यह आउटपुट डिवाइस की परवाह किए बिना एक ही प्रकार के आउटपुट का उत्पादन करना चाहिए। हालाँकि:
- यदि आपको यह
dirउपनाम बनाने के लिए उपयोगी लगता है , तो आपको निश्चित रूप से ऐसा करना चाहिए।
- जब एक बाहरी कमांड के रूप में कहा जाता है, उदाहरण के लिए स्क्रिप्ट में या यदि आप उर्फ को चालू करके
\dirया command dir, dirअभी भी डिवाइस-स्वतंत्र आउटपुट का उत्पादन करेंगे। यह है कि अलियासिंग कहने के लिए है dirकरने के लिए dir --color=autoवास्तव में नष्ट नहीं होती है dir।
dir --color;)