एकल उद्धरणों में 'ls' अचानक रिक्त स्थान वाली वस्तुओं को क्यों लपेट रहा है?


187

मैंने अभी देखा कि मेरी एक मशीन पर (डेबियन सिड को चलाने पर) जब भी मैं lsकिसी भी फ़ाइल का नाम टाइप करता हूं तो उसके आसपास सिंगल कोट्स होते हैं।

मैंने तुरंत अपने उपनामों की जाँच की, केवल उन्हें बरकरार रखने के लिए।

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(चित्र)

एक अन्य परीक्षण, जिनके नाम में एकल उद्धरण युक्त फाइलें (जिमीज द्वारा एक अनुरोध का जवाब देना):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(चित्र)

नए कोर्यूटिल्स-8.26 आउटपुट के साथ अपडेट (जो कि वास्तव में बहुत कम भ्रमित है, लेकिन फिर भी डिफ़ॉल्ट रूप से परेशान है)। इस प्रिंटआउट के लिए Pádraig ब्रैडी का धन्यवाद:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt

ये क्यों हो रहा है? मैं इसे ठीक से कैसे रोकूं?

स्पष्ट करने के लिए, मैं खुद को स्वचालित रूप से रंग आउटपुट के लिए सेट करता हूं। इसने पहले कभी भी चीजों के बारे में उद्धरण नहीं दिया।

मैं चल रहा हूँ bashऔर Coreutils 8.25।

EDIT: लगता है कि कोरुटाइल डेवलपर्स ने सोचा (लिंक) यह एक अच्छा विचार है कि कम से कम विस्मय के सिद्धांत के साथ-साथ UNIX परंपरा के 46+ वर्षों को तोड़ने के बावजूद यह एक वैश्विक डिफ़ॉल्ट है ।

किसी भी तरह एक recompile बिना इसे ठीक करने के लिए?


अद्यतन - अक्टूबर 2017 - डेबियन सिड ने शेल एस्केप को डिफ़ॉल्ट रूप से फिर से सक्षम किया है। यह सिर्फ हास्यास्पद है। https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

और पिछली बग रिपोर्ट की उत्तर श्रृंखला के निचले भाग में, "परिवर्तन जानबूझकर किया गया था और रहेगा।" https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

मुझे लगा कि यह निपट गया। जाहिरा तौर पर नहीं।

अद्यतन: अप्रैल 2019: बस PHP में एक शानदार बग रिपोर्ट मिली जो इस परिवर्तन के कारण हुई थी ls। जब आप डेवलपर्स को भ्रमित कर रहे हैं और गलत बग रिपोर्ट उत्पन्न कर रहे हैं, तो यह आपके परिवर्तनों पर फिर से विचार करने का समय है।

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

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "$@" |cat
    else
        /system/bin/ls "$@" |cat
    fi
}

20
फिर भी एक और कारण है कि lsकमांड क्यों नहीं ।
जिमीज

12
यह अजीब लग रहा है, लेकिन अगर यह केवल एक टर्मिनल पर प्रिंट करने में सक्षम है, तो यह समझ में आता है। आप स्पष्ट रूप से देख सकते हैं कि आपके पास फ़ाइल 'परीक्षण' के बजाय फ़ाइल 'परीक्षण 1.txt' और अन्य '1.txt' है। कोशिश करो ls | catऔर देखो अगर यह चला जाता है। अगर मेरे पास टाइम मशीन होती, तो मैं बेल लैब्स ~ 1970 पर वापस जाता और केन थॉम्पसन को समझाने की कोशिश करता कि फ़ाइल और डायरेक्टरी नामों में जगह की अनुमति देना एक बुरा विचार है। :-P
ब्योर्न मंच

6
जब मैंने पहली बार यह देखा, तो मैं यह सोचकर बेहोश हो गया कि मेरी एक स्क्रिप्ट खराब हो गई थी और मैंने अपनी सभी फाइलों का नाम बदल दिया '*'। मुझे लगता है मैं lsइससे छुटकारा पाने के लिए अपने सभी मशीनों में उपनाम जोड़ने के लिए जाऊंगा ...
सीमित प्रायश्चित

14
@ लिस्टेअटोनमेंट, जैसा कि लेकेनस्टेन द्वारा बताया गया है , आप QUOTING_STYLE=literalएक उपनाम के बजाय एक पर्यावरण चर के साथ ऐसा कर सकते हैं । (मुझे लगता है कि यह स्वाद की बात है, लेकिन मैं चर को पसंद करता हूं।)
एलएसपीस

4
@BjornMunch यह बताने के मुद्दे के दो समाधान हैं कि क्या यह एक फ़ाइल है या दो: 1) कॉलम कैसे खींचे जा रहे हैं और यह काफी स्पष्ट है। 2) प्रति पंक्ति एक आइटम सूचीबद्ध करें। उन दोनों एकल उद्धरण के साथ प्रबंध से बेहतर और स्पष्ट दिखते हैं।
व्याट8740

जवाबों:


132

प्रस्तावना : हालांकि यह इस तरह के रूप में एक जवाब अपवोट करने और एक दिन इसे कॉल करने के लिए काफी संतोषजनक हो सकता है, कृपया आश्वस्त रहें कि GNU डेवलपर्स SO उत्तर वोटों की परवाह नहीं करते हैं, और यदि आप वास्तव में उन्हें बदलने के लिए प्रोत्साहित करना चाहते हैं , तो आपको इसकी आवश्यकता है इस उत्तर के रूप में उन्हें ईमेल करें


" ऐसा क्यों हो रहा है? "

कई Coreutils डेवलपर्स ने फैसला किया कि वे दशकों के वास्तविक मानकों से बेहतर जानते हैं।


" मैं इसे ठीक से कैसे रोकूँ? "

http://www.gnu.org/software/coreutils/coreutils.html :

दोष रिपोर्ट

अगर आपको लगता है कि आपको कोरुटिल्स में बग मिल गया है, तो कृपया बग बग रिपोर्ट पूरी तरह से <बग-coreutils@gnu.org> पर भेजें , और यह स्वतः ही कोरुटिल्स बग ट्रैकर में प्रवेश कर जाएगा। बग रिपोर्ट करने से पहले कृपया अक्सर पूछे जाने वाले प्रश्न पढ़ें। बग रिपोर्ट लिखने और अच्छे प्रश्न पूछने के बारे में एक बहुत ही उपयोगी और अक्सर संदर्भित गाइड दस्तावेज़ है कैसे प्रश्न पूछें स्मार्ट तरीका। आप पिछली पोस्टिंग ब्राउज़ कर सकते हैं और बग-कोरुटिल्स आर्काइव खोज सकते हैं।

डिस्ट्रोस जो पहले ही  इस बदलाव को वापस ले चुके हैं:

अप्रभावित:

  • OpenSUSE (पहले से ही इस्तेमाल किया -एन)

" किसी भी तरह एक recompile बिना इसे ठीक करने के लिए? "

समर्थकों ने आपको ...

पुराने प्रारूप में वापस -N को उनके ls उपनाम में जोड़कर प्राप्त करें

... अनंत काल के शेष के लिए, आपके सभी इंस्टॉलों पर, हर जगह।


17
मेलिंग सूची में परिवर्तन का प्रस्ताव किया गया था और तीन लाभार्थियों द्वारा सहमति व्यक्त की गई थी जो शुद्ध लाभ था। हम इस बारे में रचनात्मक तर्क के लिए पूरी तरह से खुले हैं। यह सब होने के बाद खुला स्रोत है, हमें केवल चीजों को बेहतर बनाने के लिए निर्देशित करने का मतलब नहीं है। कृपया lists.gnu.org/archive/html/coreutils/2016-02/msg00000.html पर कोरुटिल्स थ्रेड में प्रतिक्रिया देने के लिए स्वतंत्र महसूस करें । संरेखण में सुधार करने के लिए एक स्थान जोड़कर)
पडरैग ब्रैडी

31
@ PádraigBrady अपडेट किया गया उत्तर। यद्यपि आपके कोरुटिल्स थ्रेड में इनकार का भार देखते हैं। लब्बोलुआब यह है कि आप लोगों के लिए और अधिक काम पैदा कर रहे हैं, और आप इसे एक ओएस के नाम पर कर रहे हैं जो 1970 से एक ओएस का एक क्लोन है। यदि लोग कुछ अलग करना चाहते हैं, तो वे इसमें चयन करेंगे।
जन क्यु पेबलिक

43
@ PádraigBrady इस बदलाव के कारण मुझे झुंझलाहट हुई और कई घंटे बर्बाद हुए और इसका कारण और समाधान खोजने की कोशिश की। मेरा मतलब नकारात्मक नहीं है - मैं सिर्फ एक अन्य व्यक्ति के दृष्टिकोण को साझा कर रहा हूं! मुख्य व्यवहार को संशोधित करने के बड़े निहितार्थ हैं ..
mafrosis

52
जैसा कि किसी ने 30 साल के लिए * निक्स सिस्टम का इस्तेमाल किया है, मुझे लगता है कि इस तरह के गंभीर बदलाव बहुत कष्टप्रद हैं। वे लंबे समय से चली आ रही स्क्रिप्टों को तोड़ते हैं, एक बात के लिए। वे सिद्धांत के सिद्धांत का भी उल्लंघन करते हैं। "ऑप्ट-इन" यहां डिफ़ॉल्ट होना चाहिए, जैसा कि ऊपर उल्लेख किया गया है।
ब्रायन क्लैपर

28
@ PádraigBrady अभी भी इस तरह के बदलावों को आगे बढ़ाने का तरीका नहीं है। यह तरीका अधिक रचनात्मक होता है कि डिफ़ॉल्ट रूप से सक्रिय के बजाय व्यवहार ऑप्ट-इन होता है। यह गलत तरीके से संकेत भी देता है कि फ़ाइल नाम कैसे संग्रहीत किए जाते हैं, संक्षेप में, lsजो आप देखते हैं कि यह कैसे संग्रहीत है। वह सुविधा वैकल्पिक होनी चाहिए, डिफ़ॉल्ट नहीं

91

आप उद्धरण शैली चुन सकते हैं :

ls --quoting-style=literal

बराबर:

ls -N

या:

QUOTING_STYLE=literal ls

पूर्व 8.28 व्यवहार को प्राप्त करने के लिए इसे एक उपनाम बनाएं, या export QUOTING_STYLE=literalअपने में सेट करें .bashrc


11
थोड़ा अजीब लगता है मुझे यह करना है कि सामान्य यूनिक्स-वाई व्यवहार प्राप्त करना है। साथ ही, मैं पुराना डिफ़ॉल्ट चाहता हूं। मुझे नहीं लगता कि भागने का पुराना डिफ़ॉल्ट था - मुझे लगता है कि यह वास्तव में वही था जो वास्तव में मुद्रित था।
व्याट8740

9
8.25 पूर्व व्यवहार के लिए, export QUOTING_STYLE=literalअपने bashrc में उपयोग करें।
लेकेनस्टेन

2
या उपयोग -N, ऐसा लगता है। मैं अपना खुद का संस्करण तैयार कर रहा हूं क्योंकि मेरे पास पहले से ही एक व्यक्तिगत भंडार है।
व्याट8740

2
@LSpice मैंने पोस्ट का उपयोग literalकरने के बजाय संपादित किया है escape(मेरा मानना ​​है कि @cuonglm सिर्फ यह दिखाना चाहता था कि शैली को कैसे बदलना है, विशेष रूप से escapeशैली को लक्षित नहीं करना है)।
लेकेन्स्टाइन

5
यह उत्तर अधिक उत्थान के योग्य है। यह सीधे तौर पर संबोधित करता है कि प्रश्नकर्ता ने नौकरशाही जवाब से बचने के लिए क्या कहा। वास्तव में, पर्यावरण चर दृष्टिकोण बहुत सुंदर लगता है। (मैं व्यक्तिगत रूप से नए व्यवहार को पसंद करता हूं क्योंकि यह एक अधिक कुशल सी एंड पी कार्रवाई का पक्षधर है), फिर भी, एलएस पुराने तरीके से व्यवहार करने के लिए पर्याप्त चतुर है जब पुनर्निर्देशन का उपयोग किया जाता है, इसलिए स्क्रिप्ट का कोई नुकसान नहीं होता है जो एलएस आउटपुट का उपयोग करता है।
मार्सेलो

42

बदलाव के बारे में कुछ बिंदु।

  • इसे कोर्यूटिल्स v8.25 में पेश किया गया था, और v8.26 में संरेखण में सुधार हुआ था
  • यह केवल तब होता है जब टर्मिनलों को आउटपुट करना इतना स्क्रिप्ट नहीं तोड़ता है
  • यह व्हाट्सएप युक्त फ़ाइलों के लिए उपयोगकर्ताओं के लिए आउटपुट को अलग करता है
  • यह आउटपुट को सैनिटाइज करता है इसलिए कॉपी और पेस्ट करना सुरक्षित है
  • आउटपुट अब हमेशा शेल में कॉपी और पेस्ट करने के लिए मान्य है
  • उपयोगकर्ता अपने ls उपनाम में -N जोड़कर पुराने प्रारूप में वापस आ सकते हैं

7
मेरा अंतिम उदाहरण अस्पष्ट नहीं है? शायद नहीं - लेकिन यह निश्चित रूप से भ्रमित करने वाला है और इसे समझने में अधिक समय लगता है। मुझे लगता है कि यह एक भयानक बदलाव है (आपके लिए कोई अपराध नहीं है)। हालांकि उपनाम की टिप के लिए धन्यवाद।
व्याट8740

27
नोट: इस परिवर्तन को Coreutils 8.25 में पेश किया गया था ( कमिट , इस पोस्ट के समान Pádraig द्वारा लिखित)। व्यक्तिगत रूप से मुझे लगता है कि यह व्यवहार उप-प्रकार है, जब भी किसी फ़ाइल नाम में कोई स्थान होता है, तो यह संरेखण को तोड़ देता है।
लेकेनस्टेन

10
मेरी क्षमायाचना - जाहिरा तौर पर आप शेल-कोट्स को कम से कम उद्धृत कर रहे हैं। मुझे अभी भी यह पसंद नहीं है। विकल्प ठीक हैं - लेकिन दशकों पुरानी यूनिक्स कोर उपयोगिता के बहुत अच्छी तरह से निर्दिष्ट डिफ़ॉल्ट व्यवहार को इस तरह से बदलना कि इसकी सत्यता कम हो जाती है केवल एक बुरा विचार हो सकता है।
17

12
@ PádraigBrady तो, क्या आप lsटूटे हुए रखने जा रहे हैं ? अपने परिवर्तन के खिलाफ उन सभी तर्कों को देखें। कोई नहीं चाहता। शायद यह दुनिया से माफी मांगने और इसे पूर्ववत करने का समय है।
क्रिस वारिक

6
@ PádraigBrady तो कई लोगों के बावजूद जिन्होंने समझाया है कि यह गलत, टूटा हुआ आदि कैसे है, आप अभी भी इसे वापस नहीं लेंगे ताकि डिफ़ॉल्ट अपरिवर्तित रहे? आपकी धारणा के विपरीत, यह परिवर्तन भ्रमित नहीं करता है । यह सुझाव देते हुए कि लोग एक पर्यावरण चर या उर्फ ​​निर्धारित करते हैं, सबसे अच्छा है।
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.