के बीच संबंध 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 -q
ls
ls --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
;)