जीएनयू कोर यूटिलिटीज उपयोगिता त्रुटियों को दरकिनार करते हुए

अंतिम कई लिनक्स वितरण पर कोरुटिल्स पैकेज की स्थापना की गई है। इसमें मानक और ऐसी परिचित उपयोगिताओं जैसे बिल्ली , चामोद , तिथि , गूंज , एलएस और कई अन्य शामिल हैं। लेकिन इस तरह के विहित पैकेज में भी त्रुटियां हैं जो उपयोगकर्ता के काम में हस्तक्षेप कर सकती हैं। मैं अपने अनुभव पर उनमें से एक के पार आया और इस बारे में बात करना चाहता हूं कि मैं इसके आसपास कैसे पहुंच पाऊंगा।



कार्य इस प्रकार था - एक पाठ फ़ाइल को लंबी लाइनों के साथ बदलना ताकि कोई भी रेखा 80 वर्णों से अधिक लंबी न हो। लंबी लाइनों को 80 या उससे कम वर्णों की कई पंक्तियों में विभाजित किया जाना चाहिए। फ़ाइल UTF-8 में एन्कोडेड है। आप थोड़ा सा पता लगा सकते हैं कि यूनिक्स जैसे ओएस में, तह उपयोगिता इस कार्य को संभालती है। बहुत बढ़िया, फिर हम इसका इस्तेमाल करेंगे। सबसे पहले, आइए टर्मिनल में परीक्षण कमांड के एक जोड़े को जानें कि इसे कैसे प्रबंधित किया जाए। मैं कोरोडिल्स 8.13 के साथ डेबियन 7.5 सिस्टम पर निष्पादित कमांड के आउटपुट को नीचे दूंगा। वही निष्कर्ष आर्क लिनक्स के साथ कोरुटिल 8.22 के साथ होगा।



सभी परीक्षण आदेशों को निष्पादित करते समय, स्थानीय सेटिंग्स निम्नानुसार हैं:



$ locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=ru_RU.UTF-8
      
      





यदि आपके पास कुछ गलत है, तो करें:



 $ export LC_ALL="ru_RU.UTF-8"
      
      





टेस्ट कमांड को स्ट्रिंग "एबीसीडेफिज" को 4 वर्णों की पंक्तियों में तोड़ने दें:



 $ echo "abcdefghij" | fold -w 4 abcd efgh ij
      
      





वाह! अब लाइन "abgdejouji":



 $ echo "" | fold -w 4     
      
      





और फिर एक आश्चर्य हमें इंतजार कर रहा है। हम देखते हैं कि लाइन "abgdejouji" को दो वर्णों की रेखाओं में विभाजित किया गया था। यहाँ बिंदु यह है कि UTF-8 एन्कोडेड सिरिलिक वर्ण दो बाइट्स लेता है, और लैटिन वर्ण एक है। तह उपयोगिता, सभी पात्रों को एकल-बाइट के रूप में मानते हुए, इस स्ट्रिंग (बाइट सरणी) को 4 बाइट्स के टुकड़ों में तोड़ दिया। जैसा कि आप देख सकते हैं, ऐसे विभाजन एल्गोरिथ्म केवल लैटिन वर्णों के लिए UTF-8 एन्कोडिंग में मान्य है। उसी समय, wc उपयोगिता सही ढंग से स्ट्रिंग "एबगूड" में वर्णों की संख्या की गणना करेगी।



 $ echo -n "" | wc -m 10
      
      





यह बताता है कि कोरुटिल्स पैकेज में यूनिकोड समर्थन आंशिक रूप से लागू किया गया है, और विभिन्न उपयोगिताओं के यूनिकोड के साथ काम करने का परिणाम अप्रत्याशित हो सकता है।



वास्तव में, यह त्रुटि कई साल पहले ज्ञात थी। यह यहां और यहां वर्णित है , और यहां तक ​​कि डेवलपर्स से भी जवाब दिया गया है, लेकिन, दुर्भाग्य से, यह अभी भी "यह एक बग नहीं है, यह एक विशेषता है।"



उपरोक्त बीएसडी सिस्टम पर लागू नहीं होता है, उनके पास मानक उपयोगिताओं का अपना कार्यान्वयन है। फ्रीबीएसडी 10 प्रणाली पर एक परीक्षण से पता चला कि यूनिकोड के साथ सब कुछ ठीक है।



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



सबसे पहले, व्यस्त बॉक्स को स्थापित करें। डेबियन सिस्टम पर, कमांड:



 # apt-get install busybox
      
      





आर्क लिनक्स सिस्टम में, तदनुसार, निम्न कमांड:



 # pacman -S busybox
      
      





प्रलेखन के अनुसार, आप इस तरह बिजीबॉक्स का उपयोग कर सकते हैं:



 $ busybox ls -l $ busybox ps $ busybox seq 1 5
      
      





यानी बस यूट्यूब नाम को एक पैरामीटर के रूप में एक्जीक्यूटेबल एक्जीक्यूटेबल में पास करें । आप निष्पादन योग्य फ़ाइल को उसके द्वारा समर्थित आदेशों में से एक में भी नाम बदल सकते हैं, और यह स्वचालित रूप से कार्य करेगा जैसे कि यह कमांड है। हमने इसका नाम नहीं बदला, लेकिन हम इस पर नाम के साथ एक प्रतीकात्मक लिंक बनाएँगे:



 # cd $(dirname $(which fold)) # mv fold fold.orig # ln -s $(which busybox) fold
      
      





उसके बाद, गुना का उपयोग सबसे परिचित तरीके से किया जा सकता है: एक टर्मिनल या स्क्रिप्ट से कॉल करने के लिए। सिस्टम में ऐसा पैच मुझे स्वीकार्य है। मुझे खुशी होगी अगर वह किसी की मदद कर सकती है। इस बीच, यह आशा की जाती है कि किसी दिन यूनीकोड ​​पूरी तरह से समर्थन करेगा।



All Articles