Ls से आउटपुट में नई सुर्खियाँ होती हैं लेकिन एक ही लाइन पर प्रदर्शित होती हैं। क्यों?


41

मुझे लगता है कि मैं शेल के संबंध में एक अपेक्षाकृत मौलिक बिंदु की अनदेखी कर सकता हूं। डिफ़ॉल्ट रूप से ls कमांड से आउटपुट न्यूलाइन्स के साथ आउटपुट को अलग करता है, लेकिन शेल आउटपुट को एक ही लाइन पर प्रदर्शित करता है।

क्या कोई मुझे यह समझा सकता है? मैंने हमेशा यह माना था कि आउटपुट को रिक्त स्थान द्वारा अलग किया गया था, लेकिन अब जब मैं आउटपुट को न्यूलाइन से अलग देखता हूं, तो मैं उम्मीद करता हूं कि आउटपुट अलग-अलग लाइनों पर प्रदर्शित होगा।

उदाहरण:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

ओड से पता चलता है कि आउटपुट को न्यूलाइन द्वारा अलग किया गया है:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

यदि नई लाइनें मौजूद हैं, तो आउटपुट डिस्प्ले क्यों नहीं है:

text1 
text2
text3

जवाबों:


44

जब आप आउटपुट को पाइप करते हैं, तो lsअलग तरह से कार्य करता है।

यह तथ्य जानकारी के दस्तावेज में छिपा है :

यदि मानक आउटपुट एक टर्मिनल है, तो आउटपुट कॉलम में है (लंबवत क्रमबद्ध) और नियंत्रण वर्ण आउटपुट हैं प्रश्न चिह्न के रूप में; अन्यथा, आउटपुट प्रति पंक्ति एक सूचीबद्ध होता है और नियंत्रण वर्ण आउटपुट के रूप में होता है।

इसे साबित करने के लिए, दौड़ने का प्रयास करें

ls

और फिर

ls | less

इसका मतलब है कि यदि आप चाहते हैं कि आउटपुट प्रति पंक्ति एक फ़ाइल की गारंटी हो, भले ही वह पाइप हो या रीडायरेक्ट हो, तो आपको चलना होगा

ls -1

( -1नंबर एक है)

या, आप ls | lessचलाकर स्तंभों में आउटपुट करने के लिए बाध्य कर सकते हैं

ls -C

( -Cएक राजधानी सी है)


6
@ अन्य: यह बहुत विशिष्ट है ls। यह उपयोगी है, लेकिन स्पष्ट रूप से असंगत और आश्चर्यजनक है। लेकिन ध्यान दें कि कुछ आउटपुट जो रंगीन आउटपुट का उत्पादन करते हैं, रंगों को पाइप किए जाने पर भी बाहर निकाल देंगे।
मिकेल

5
@theconnorpower: ट्रिविया: यूनिक्स के अन्वेषकों ने प्लान 9 को लिखने के लिए आगे बढ़ाया। Plan9 में, lsहमेशा प्रति पंक्ति एक प्रिंट करता है, और lcहमेशा कॉलम में प्रिंट करता है।
मिकेल

2
@ वेनकॉर्पॉवर: ऐसे प्रोग्राम भी हैं जो टर्मिनल के आकार को पढ़ते हैं, और उनके आउटपुट को तदनुसार समायोजित करते हैं, उदाहरण के लिए डेबियन dpkg -lस्क्रीन की पूरी चौड़ाई का उपयोग करेगा, लेकिन अगर यह एक पाइप पर मुद्रण कर रहा है, तो यह मानता है कि टर्मिनल 80 कॉलम चौड़ा है , और यदि आवश्यक हो तो इसे फिट करने के लिए आउटपुट को संक्षिप्त करता है।
मिकेल

1
@ मिकेल ने प्लान 9 में एलएस / एलसी अंतर को सुनने के लिए दिलचस्प है। विस्तृत उत्तर के लिए धन्यवाद।
3

1
यदि कोई आउटपुट किसी फ़ाइल में रीडायरेक्ट हो जाता है या क्या वह शेल में जा रहा है तो कोई प्रोग्राम कैसे निर्धारित कर सकता है?
user2820379

4

आपकी खोज प्राथमिक कारण पर प्रकाश डालती है कि आउटपुट lsहमेशा खराब क्यों होता है। पूर्ण विवरण के लिए ग्रेग की विकि देखें ।

अपनी समस्या को उल्टा समझें। आपने देखा कि ls कभी-कभी करता है और कभी-कभी इसके उत्पादन के बीच में नई सीमाएँ नहीं छापता है। लिपियों में उपयोग के लिए या जब -1ध्वज द्वारा मजबूर किया जाता है , तो यह करता है। प्रत्येक फ़ाइल के अंत में एक नई पंक्ति। क्या कोई गारंटी नहीं है कि प्रत्येक newline एक नया फ़ाइल नाम का प्रतिनिधित्व करता है । वास्तव में, यदि एक फ़ाइल नाम में एक नई रेखा होती है, तो ls का उत्पादन पूर्णतया अन-पार्सबल होगा। इन फ़ाइलनामों पर विचार करें:

file1
file2\nfile3
file4

जब आप इसके ls -1साथ एक निर्देशिका बनाते हैं, तो आपको कुछ ऐसा मिलेगा जो इस तरह दिखता है:

file1
file2
file3
file4

क्या आप स्वाभाविक रूप से नहीं मानेंगे कि चार फाइलें थीं? तो क्या कोई स्क्रिप्ट जो ls के आउटपुट को पार्स करती है। वास्तव में, तीन फाइलें हैं, एक मुश्किल नाम के साथ, लेकिन आप एलएस के आउटपुट से यह पता नहीं लगा पाएंगे। *

* जब तक आप -lध्वज का उपयोग कर रहे थे और देखा गया था कि आउटपुट बोर हो गया था, लेकिन आपकी स्क्रिप्ट अभी भी चोक होगी।


3
यदि आपको वास्तव में आउटपुट को पार्स करना है ls, तो -bविकल्प मदद कर सकता है। यह न्यूलाइन में बदल जाता है \n, आदि
मिकेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.