विशेष वर्ण कैसे दर्ज करें ताकि बाश / टर्मिनल उन्हें समझ सके?


18

मान लीजिए कि एक फ़ोल्डर में एक फ़ाइल है जिसे Näyttökuva.png(रुचि रखने वालों के लिए, यह फिनिश में "स्क्रीनशॉट" है)। ऐसा ही होता है:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

$ ls Nä*
ls: Nä*: No such file or directory

यह टैब-ऑटो-पूर्णता को भी प्रभावित करता है। यदि मैं टाइप करना शुरू करता हूं ls Nऔर tabइसे सही ढंग से विस्तारित करता हूं ls Näyttökuva.png। लेकिन अगर मैं टाइप करना शुरू ls Näकरता हूं तो टैबिंग कुछ नहीं करता है।

मैं कैसे कर सकता हूँ:

  • बैश / टर्मिनल को कॉन्फ़िगर करें ताकि यह विशेष वर्णों को समझे
  • विशेष अक्षर टाइप करें ताकि bash / टर्मिनल उन्हें समझे?

टर्मिनल में एन्कोडिंग को सेटिंग टैब में UTF-8 में सेट किया गया है और एन्कोडिंग टैब अपनी डिफ़ॉल्ट स्थिति में है, अर्थात। UTF-8, मैक ओएस रोमन, आईएसओ लैटिन 1, आईएसओ लैटिन 9, विंडोज लैटिन 1, एएससीआईआई, नेक्स्टस्टेप + कुछ एशियाई कोडिंग सक्षम हैं।


यहां तक ​​कि अजनबी (हालांकि सवाल के लिए आवश्यक नहीं):

यदि मैं टाइप करता हूं ls N, tabतब तक अक्षरों को अंत से हटाता हूं , जब तक वह पढ़ता है ls Näऔर tabफिर से दबाता है , कमांड ls Nättökuva.png[sic] तक फैल जाती है।

अगर मैं दूसरी बार अक्षरों को हटाने की कोशिश करता हूं ls Näऔर टैब को दबाता हूं तो यह फैलता है ls Nätökuva.png। थर्ड रन का विस्तार ls Näökuva.png

किसी कारण के लिए, 4 रन देता है ls Nä̈kuva.png(umlauts पर umlauts नोटिस)। हर बार ls Nä̈देता है टैब ls Nä̈kuva.png। फिर भी, यह काम करता है:

$ ls Nä̈kuva.png
Näyttökuva.png

$ history 2
518  ls Näyttökuva.png 
519  history 2

जवाबों:


23

मुझे लगता है कि कुछ विसंगतियों पर बात की जा रही है कि कैसे उच्चारण को नियंत्रित किया जाता है। आप कुछ पॉपकॉर्न को हथियाना चाह सकते हैं, क्योंकि यह थोड़ा सा तकनीकी पाने वाला है ...

यूनिकोड कुछ उच्चारण पात्रों को कई अलग-अलग तरीकों से प्रस्तुत करने की अनुमति देता है: एक "कोड बिंदु" के रूप में, उच्चारण चरित्र का प्रतिनिधित्व करता है, या कोड अंक की एक श्रृंखला के रूप में चरित्र के अस्वीकार्य संस्करण का प्रतिनिधित्व करता है, इसके बाद उच्चारण (ओं)। उदाहरण के लिए, "ä" को या तो U + 00E4 (UTF-8 0xc3a4, लैटिन छोटे अक्षर 1 को डायसिस के साथ) के रूप में प्रस्तुत किया जा सकता है या U + 0061 U + 0308 (UTF-8 0x61cc88, लैटिन छोटे अक्षर + संयोजन संयोजन) के रूप में विघटित किया जा सकता है। )।

OS X के HFS + फाइलसिस्टम के लिए आवश्यक है कि सभी फ़ाइलनामों को UTF-8 में उनके पूरी तरह से विघटित रूप का प्रतिनिधित्व किया जाए । HFS + फ़ाइल नाम में, "ä" को 0x61cc88 के रूप में एन्कोड किया जाना चाहिए, और "ö" को 0x6fcc88 के रूप में एन्कोड किया जाना चाहिए।

मुझे पूरा यकीन है कि यहाँ क्या हो रहा है कि जब आप कमांड लाइन पर "Näyttökuva.png" टाइप करते हैं, तो यह पूर्वगामी रूप में वर्णों को "टाइप" कर रहा है। जब फ़ाइल बनाई जाती है, तो फ़ाइल सिस्टम स्टोरेज के लिए वर्णों को विघटित करता है। सब कुछ अब तक ठीक है। लेकिन जब आप "Nä" से शुरू होने वाले टैब-पूर्णता का उपयोग करने का प्रयास करते हैं, तो मुझे लगता है कि माचिस खोजने से पहले "ä" को विघटित करने में विफल हो रहा है, और निश्चित रूप से इसे कोई नहीं मिला।

अंतर को स्पष्ट करने के लिए, कमांड लाइन पर "Näyttökuva.png" टाइप करने पर क्या एन्कोडिंग का उपयोग किया जाता है, इसका एक उदाहरण है, बनाम जब मैं इसे फ़ाइल नाम के रूप में संग्रहीत करता हूं और इसे भरने के लिए टैब समापन का उपयोग करता हूं:

$ printf Näyttökuva.png | xxd    # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67  N..ytt..kuva.png
$ touch Näyttökuva.png           # Also pasted from the web
$ printf Näyttökuva.png | xxd    # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70  Na..ytto..kuva.p
0000010: 6e67                                     ng

अब, हटाए जाने और पुन: टैब-पूर्ण होने पर वर्णों के खो जाने की बात के रूप में, मुझे संदेह है कि यह निकटता से संबंधित है। विशेष रूप से, मुझे लगता है कि बैश डिलीट की के प्रेस के प्रति एक कोड पॉइंट को "डिलीट" कर रहा है, लेकिन टर्मिनल विंडो से प्रति प्रेस एक कैरेक्टर को मिटा रहा है। क्योंकि हटाए गए वर्णों में से एक ("ö" इस बार) में दो कोड बिंदु शामिल थे, लेकिन केवल एक वर्ण, टर्मिनल डिस्प्ले सिंक से बाहर हो जाता है। टैब को पूरा करने का प्रयास करें, इसे "Näytt" में वापस डिलीट करें, फिर से टैब को पूरा करें: bash को लगता है कि केवल संयोजन डाइअर्सिस हटा दिया गया था, न कि संपूर्ण "ö", इसलिए यह पुनः संयोजन डायरिसिस को जोड़ता है , लेकिन इस बार यह "टी" से जुड़ा है:

$ echo Näytkuva.png 
Näyttökuva.png

ध्यान दें कि जब मैं रिटर्न दबाता हूं, तो वास्तव में बैश का पूरा फाइलनेम होता है; यह सिर्फ टर्मिनल डिस्प्ले है जो भ्रमित था।

टीएल; डीआर बैश में कुछ बग्स हैं जो डीकॉम्पोज़िट उच्चारण पात्रों को संभालते हैं।

संपादित करें: कुछ खच्चरों के बाद, मुझे लगता है कि एकमात्र समाधान बश को ठीक करना है (/ अपने डेवलपर्स को इसे ठीक करने के लिए प्रतीक्षा करें)। विघटित रूप में वर्णों को इनपुट करने का एक तरीका भी हो सकता है, लेकिन मुझे नहीं पता कि यह क्या होगा। लेकिन मुझे कुछ आंशिक कामगार मिले:

  1. फ़ाइंडर को किसी फ़ाइल को उसके सही रूप में चिपकाने और खींचने के लिए। चूंकि फाइंडर को फाइलसिस्टम से फाइलनेम मिलता है, यह पहले से ही विघटित है, इसलिए यह सिर्फ काम करता है।

  2. आप वास्तव में उच्चारण चरित्र को पूरी तरह से टैब कर सकते हैं। उदाहरण के लिए, यदि आप "Na" टाइप करते हैं और फिर टैब करते हैं, तो यह "Näyttökuva.png" से मेल खाएगा क्योंकि "ä" का विहित विघटन "a" से शुरू होता है। लेकिन अगर आपके पास एक ही निर्देशिका में "नरवाल.गिफ़" नामक एक फ़ाइल है, तो यह बहुत उपयोगी नहीं होगा ...

  3. मैंने इसका परीक्षण नहीं किया है, लेकिन यदि आप टैब को पूर्ण के बजाय मेनू-पूर्ण करने के लिए बाँधते हैं , तो यह आपको संभावित मैचों के माध्यम से टैब करना चाहिए, ताकि आप अपने इच्छित अक्षर का चयन कर सकें, भले ही आप अगले पत्र को टाइप न कर सकें। (या आप इसे एक अलग कीस्ट्रोक से बांध सकते हैं, इसलिए आप इसे केवल तभी उपयोग कर सकते हैं जब आपको इसकी आवश्यकता हो।)

  4. सिंक से बाहर निकल रही टर्मिनल डिस्प्ले के साथ समस्या को ठीक करने के लिए, आप कुछ को redraw-current-line से जोड़ सकते हैं - यह समस्या को होने से नहीं रोकेगा, लेकिन यह आपको डिस्प्ले को फिर से सिंक्रनाइज़ करने का एक तरीका देगा।


धन्यवाद, मैंने पॉपकॉर्न का आनंद लिया। मुझे लगता है कि आपने समस्या का कारण पकड़ लिया है: $ echo -e "N\xC3\xA4*" | ls(गूंज देता है Nä*) परिणाम का उपयोग करना Näyttökuva.png। मैक ओएस में अन्य गोले के साथ समस्या भी मौजूद है; और जैसे zsh ls Nको ऑटो पूरा हो जाता हैls Na<0308>ytto<0308>kuva.png
Jari Keinänen

मैंने स्वत: पूर्णता की भी कोशिश की और ls Nä*Xubuntu में बैश में और इसने ठीक से काम किया, इसलिए यह कीबोर्ड और OS X और टर्मिनल के बीच कहीं बग कर गया। मैंने यह भी परीक्षण किया कि बूटकैम्प विभाजन के भीतर, लेकिन समस्या बनी रहती है (यानी यह केवल HFS + फाइलों के साथ नहीं होता है)।
जरी कीनलेन

(अब वर्कअराउंड से संबंधित अपने संपादन देखें) कम से कम पहले दो काम। # 2 दिलचस्प है: स्वतः पूर्ण Naकाम करता है, लेकिन Nayनहीं है (हालांकि यह समझा जा सकता है क्योंकि वहाँ वास्तव में है ¨के बीच aऔर y। में Xubuntu ls Na*नहीं है काम (हालांकि Nä*। काम करता है तो यह वास्तव में कोई मुद्दा नहीं है) वाइल्डकार्ड के संबंध में - एक अन्य वैकल्पिक हल हो सकता है जगह äऔर öसाथ a?और o?जैसे ls Na?y*बेशक यह बढ़ जाती है अस्पष्टता की है, लेकिन यह कुछ मामलों में काम आ सकते
जरी Keinänen

2
एक्सयूबंटू में काम करने का कारण सिर्फ यह हो सकता है कि फाइलसिस्टम टर्मिनल इंटरफ़ेस के समान रूप का उपयोग करता है। यदि आप ls N* | xxdXubuntu में करते हैं , तो यह रचित या विघटित वर्ण देता है?
गॉर्डन डेविसन

यह मानते हुए कि ज़ुबंटु फ़ाइल नाम की रचना प्रपत्र में करता है, कमांड चलाने का प्रयास करें touch $'Na\xcc\x88ytto\xcc\x88kuva.png'और देखें कि क्या होता है - मेरा अनुमान है कि यह एक बहुत ही समान नाम के साथ एक नई फ़ाइल बनाएगा।
गॉर्डन डेविसन

4

यह एक पुराना प्रश्न है, और इसका कोई निश्चित उत्तर नहीं है। बस कामचोर।

हालाँकि मैंने इस पुराने मार्गदर्शक से कुछ जानकारी को संयुक्त किया, और जैसा कि यहाँ सुझाया गया है और निर्देश दिया गया है :

मैंने अपने स्नो लेपर्ड में एक नया बैश लगाया। इसे स्थापित करने के बाद, बैश पूरा होने का काम सही ढंग से होता है! (हिम तेंदुए को 3.2.48 (1) और मैकपोर्ट्स ने 4.2.45_1 स्थापित किया)। याद रखें कि अंदर /etc/shellsऔर चल रहे बदलाव करें chsh

इसके अलावा, कुछ अन्य निर्देशों के कारण, मेरे पास है .inputrc:

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

सुनिश्चित नहीं हैं कि वे उचित संचालन के लिए आवश्यक हैं या नहीं।


तुम सही हो: bash 4.2 पूर्ण (जहां äपूर्व-निर्धारित है) Näyttökuva.pngलेकिन bash 3.2 नहीं करता है।
21

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