पाइप ls -1 ls के समान है?


19

lsकई स्तंभों में आउटपुट देता है, जबकि मैंने कोशिश की निर्देशिकाओं के ls|catसाथ बाइट-समान आउटपुट देता है ls -1। फिर भी मुझे ls -1जवाबों में पाइप दिखाई देता है, जैसे ls -1|wc -l। क्या पसंद करने का कोई कारण है ls -1? ...|catका आउटपुट क्यों बदलता है ls?


1
फ़ाइलनाम में नई लाइनें शामिल हो सकती हैं, इसलिए आप उन कई बार गिनेंगे ... आप इसके बजाय सकारात्मक रूप से कर सकते हैं: n=0; for i in .* *; do ((n++)) ; done ; echo $n(ड्रॉप करें। यदि आप उन लोगों को गिनना नहीं चाहते हैं)। या: ls -1d ./.* ./* | grep '^\./' | wc -l (फ़ाइल नाम में '/' नहीं हो सकता)
ओलिवियर दुलैक

3
lsटर्मिनल में आउटपुट में आमतौर पर डिफ़ॉल्ट रूप से रंग कोड शामिल होते हैं। गैर-टर्मिनल के आउटपुट के लिए, रंग आमतौर पर डिफ़ॉल्ट रूप से अक्षम होता है। GNU में, यह --color={always,auto,never}IIRC है। यदि रंग एक में शामिल है, लेकिन दूसरे में नहीं है, तो आउटपुट स्क्रीन पर समान दिखाई दे सकते हैं, लेकिन वे बाइट-समान नहीं हैं (रंग कोड एलएस के आउटपुट का हिस्सा हैं)।
बजे एक CVn

@ MichaelKjörling मुझे लगता है कि आपको उत्तर के रूप में लिखना चाहिए।
Dec_सफल

@ MichaelKjörling यह दिलचस्प कुछ है जो मैंने नहीं माना है। क्या रंग और स्तंभ आउटपुट, आदि के लिए टर्मिनल विकल्पों को याद किए बिना टर्मिनल में आउटपुट करने के लिए हमेशा पाइप करने का एक सामान्य तरीका है?
रुबिसालियन

@rubystallion एक अलग प्रश्न की तरह लगता है।
बजे एक CVn

जवाबों:


26

lsपरीक्षण करता है कि आउटपुट किसी टर्मिनल पर जा रहा है या नहीं। यदि आउटपुट टर्मिनल पर नहीं जा रहा है, तो -1डिफ़ॉल्ट है। (यह में से एक ने अधिरोहित जा सकता है -C, -mया -xविकल्पों में।)

इस प्रकार, जब lsएक पाइपलाइन में उपयोग किया जाता है और आपने इसे किसी अन्य विकल्प के साथ ओवरराइड नहीं किया है, lsतो उपयोग करेगा -1आप इस पर भरोसा कर सकते हैं क्योंकि यह व्यवहार POSIX द्वारा आवश्यक है

POSIX विशिष्टता

-1जब भी आउटपुट किसी टर्मिनल पर नहीं जा रहा है, तो POSIX को डिफ़ॉल्ट की आवश्यकता होती है :

POSIX कल्पना :

डिफ़ॉल्ट प्रारूप मानक उत्पादन के लिए प्रति पंक्ति एक प्रविष्टि को सूचीबद्ध करना होगा; अपवाद टर्मिनलों के लिए या जब -C, -m, या -x विकल्पों में से एक निर्दिष्ट किया जाता है। यदि आउटपुट टर्मिनल के लिए है, तो प्रारूप कार्यान्वयन-परिभाषित है।

वे तीन विकल्प जो डिफ़ॉल्ट एकल-स्तंभ प्रारूप को ओवरराइड करते हैं:

-C
कोलाज अनुक्रम के अनुसार, स्तंभों को छांटे गए प्रविष्टियों के साथ बहु-पाठ-स्तंभ आउटपुट लिखें। पाठ स्तंभों और स्तंभ विभाजक वर्णों की संख्या अनिर्दिष्ट है, लेकिन आउटपुट डिवाइस की प्रकृति के अनुकूल होना चाहिए। यह विकल्प लंबे प्रारूप आउटपुट को अक्षम करता है।

-m
स्ट्रीम आउटपुट स्वरूप; पूरे पृष्ठ के पथनामों को एक <comma> वर्ण द्वारा अलग किया गया, उसके बाद एक <space> वर्ण। सूची टर्मिनेटर के रूप में एक <newline> चरित्र का उपयोग करें और विभाजक अनुक्रम के बाद जब अगली सूची प्रविष्टि के लिए एक पंक्ति में जगह नहीं है। यह विकल्प लंबे प्रारूप आउटपुट को अक्षम करता है।

-x
समान -C, सिवाय इसके कि मल्टी-टेक्स्ट-कॉलम आउटपुट को स्तंभों के बजाय नीचे, प्रविष्टियों के पार निर्मित किया जाता है। यह विकल्प लंबे प्रारूप आउटपुट को अक्षम करता है।

GNU प्रलेखन

से जीएनयू मैनुअल रास :

'-1'
'--फॉर्मैट = सिंगल-कॉलम'
प्रति पंक्ति एक फ़ाइल सूचीबद्ध करें। यह ls के लिए डिफ़ॉल्ट है जब मानक आउटपुट टर्मिनल नहीं है । फ़ाइल नाम के भीतर newline वर्णों के प्रत्यक्ष आउटपुट को दबाने के लिए -b और -q विकल्प भी देखें। [महत्व दिया]

उदाहरण

आइए तीन फाइलें बनाएं:

$ touch file{1..3}

जब आउटपुट टर्मिनल पर जाता है, तो GNU lsएक बहु-स्तंभ प्रारूप का उपयोग करने का विकल्प चुनता है:

$ ls
file1  file2  file3

जब आउटपुट पाइपलाइन में जाता है, तो POSIX कल्पना के लिए आवश्यक है कि एकल-स्तंभ डिफ़ॉल्ट हो:

$ ls | cat
file1
file2
file3

डिफ़ॉल्ट एकल-स्तंभ व्यवहार को ओवरराइड करने वाले तीन अपवाद -mअल्पविराम से अलग किए गए स्तंभों के लिए -C, और नीचे दिए -xगए स्तंभों के लिए हैं:

$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1  file2  file3
$ ls -x | cat
file1  file2  file3

"POSIX की आवश्यकता -1 डिफ़ॉल्ट के रूप में जब उत्पादन एक टर्मिनल को जाता है:" ... लेकिन बोली इंगित करता है कि ऐसा करना आवश्यक हो -1डिफ़ॉल्ट के रूप में छोड़कर जब उत्पादन टर्मिनल (या अन्य स्थितियों) को जाता है
muru

@muru कि पकड़ने के लिए धन्यवाद! उत्तर अपडेट किया गया।
John1024

खैर, हर बादल में चांदी की परत होती है। क्योंकि मेरा जवाब पोस्ट करने से पहले आपका जवाब स्वीकार कर लिया गया था, मुझे एक मज़ेदार पिज़्ज़ा हैट मिली!
जी-मैन का कहना है कि 'मोनिका'

@ जी-मैन बहुत अच्छे। और, यह एक सुंदर टोपी है!
जॉन १०२४२४ १४'१।

9
  • मानक आउटपुट पाइपिंग के व्यवहार को क्यों बदलता है ls? क्योंकि इसे इस तरह से डिजाइन किया गया था। POSIX विशिष्टता का कहना है:

    डिफ़ॉल्ट प्रारूप मानक उत्पादन के लिए प्रति पंक्ति एक प्रविष्टि को सूचीबद्ध करना होगा; अपवाद टर्मिनलों के लिए कर रहे हैं या जब से एक -C, -mया -xविकल्पों में निर्दिष्ट किया जाता है। यदि आउटपुट टर्मिनल के लिए है, तो प्रारूप कार्यान्वयन-परिभाषित है।

    जो टर्मिनल के आउटपुट के साथ वास्तव में डिफ़ॉल्ट व्यवहार के बारे में अस्पष्ट है (जब किसी विकल्प द्वारा -lया उसके जैसे विकल्प द्वारा निर्दिष्ट नहीं किया गया है -1), और जीएनयू कोरुटिल्स प्रलेखन कहते हैं

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

    तो आप देख सकते हैं कि एक फाइल का आउटपुट पाइप के आउटपुट के समान होगा; वह है, प्रति पंक्ति एक प्रविष्टि, जैसे कि -1निर्दिष्ट किया गया था।

  • इसे इस तरह से क्यों बनाया गया था? यह सुनिश्चित करने के लिए पता करने के लिए संभव नहीं हो सकता है (जब तक कोई कुछ डिज़ाइन नोट नहीं पा सकता है), लेकिन मुझे लगता है:
    • जब lsएक टर्मिनल को लिख रहा होता है, तो यह उम्मीद करता है कि एक इंसान आउटपुट को देख रहा है। लोग न्यूनतम आवश्यक संख्याओं में जानकारी प्राप्त करना पसंद करेंगे, इसलिए सामान स्क्रीन पर स्क्रॉल नहीं करता है।
    • जब lsएक पाइप पर लिख रहा होता है, तो यह उम्मीद करता है कि एक अन्य कार्यक्रम आउटपुट पढ़ रहा है। यह डेटा को पढ़ने के लिए एक प्रोग्राम के लिए बहुत आसान है जो प्रति पंक्ति एक मान है स्तंभों को पार्स करने की कोशिश करने के लिए (क्योंकि फ़ाइलनाम में रिक्त स्थान हो सकते हैं)।
  • ls -1 जब आप किसी फ़ाइल या पाइप पर लिख रहे हों, तो क्या कोई कारण है ? नहीं।

-4

जब पीएस पाइपिंग करते हैं, तो एलएस यह निर्धारित नहीं कर सकता है कि कंसोल में वास्तव में कितना कॉलम है (राइट-साइड कमांड के स्वतंत्र)। तो ls सिर्फ यह करता है कि अपनी पसंद पर, या, दूसरे शब्दों में, यह व्यवहार अस्थिर है और भविष्य के संस्करणों में बदल सकता है।

इसके विपरीत, ls -1सामान्य रूप से गिनती या स्क्रिप्टिंग के उद्देश्य से बनाया गया था, इसलिए इसका व्यवहार स्थिर है।


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