सभी लेख

CRLF और LF: लाइन एंडिंग अब भी समस्याएँ क्यों पैदा करती हैं

Windows के Notepad में एक दिलचस्प इतिहास है: अक्टूबर 2018 अपडेट से पहले तक Notepad सिर्फ़ LF वाली फ़ाइलों को सही तरीक़े से नहीं दिखा पाता था — पूरी फ़ाइल एक ही लंबी लाइन जैसी दिखती थी, क्योंकि Notepad सिर्फ़ CRLF को असली लाइन-ब्रेक मानता था। यह अकेली गलतफ़हमी बताती है कि यह फ़र्क़ सिर्फ़ थ्योरी नहीं, रोज़मर्रा की परेशानी रहा है।

यह फ़र्क़ कहाँ से आया

Unix और macOS एक कैरेक्टर इस्तेमाल करते हैं — LF (लाइन फ़ीड, \n)। Windows को पुरानी टेलीटाइप मशीनों से कैरेक्टर की एक जोड़ी विरासत में मिली — CRLF (कैरिज रिटर्न + लाइन फ़ीड, \r\n): एक कैरिज को लाइन की शुरुआत में लौटाता है, दूसरा उसे नीचे की लाइन में ले जाता है — टाइपराइटर की शाब्दिक नकल।

यह अब भी क्यों मायने रखता है

  • Git. अगर CRLF एंडिंग वाली फ़ाइल किसी ऐसे रिपॉज़िटरी में जाती है जहाँ बाक़ी फ़ाइलें LF इस्तेमाल करती हैं, तो git सिर्फ़ एक लाइन एडिट करने पर भी "पूरी फ़ाइल बदल गई" दिखा सकता है — क्योंकि तकनीकी रूप से सभी लाइनों की एंडिंग बदल गई।
  • Shebang लाइनें। CRLF एंडिंग के साथ सेव की गई Unix शेल स्क्रिप्ट Linux सर्वर पर चलने में फेल हो सकती है, क्योंकि इंटरप्रेटर को पहली लाइन में एक अतिरिक्त \r कैरेक्टर दिखता है।
  • कोड में स्ट्रिंग तुलना। CRLF फ़ाइल से पढ़ी गई लाइनें अपेक्षित LF स्ट्रिंग से तुलना करने पर मैच नहीं हो सकतीं, भले ही दिखने वाला टेक्स्ट एक जैसा लगे।

इसे कैसे हैंडल किया जाता है

Git के पास एक सेटिंग (core.autocrlf) है जो checkout/commit पर लाइन एंडिंग को अपने आप कन्वर्ट कर देती है। जिन टीमों में कुछ डेवलपर WSL (Windows Subsystem for Linux) पर और कुछ सीधे Windows पर काम करते हैं, वहाँ रिपॉज़िटरी में .gitattributes रखना ज़्यादा भरोसेमंद रहता है, ताकि नतीजा हर किसी की लोकल सेटिंग पर निर्भर न करे।

मैनुअल कन्वर्ज़न किस काम आता है

  • ग़लत लाइन एंडिंग स्टाइल के साथ रिपॉज़िटरी में आई फ़ाइल को ठीक करना।
  • Windows एडिटर में एडिट की गई स्क्रिप्ट को Linux सर्वर पर डिप्लॉय करने से पहले तैयार करना।
  • यह डायग्नोज़ करना कि दिखने में एक जैसी दो फ़ाइलों के बीच टेक्स्ट तुलना में फ़र्क़ क्यों दिखता है।

एक ही फ़ाइल में मिश्रित एंडिंग

कई एडिटर या अलग-अलग OS पर एडिट की गई फ़ाइल में CRLF और LF दोनों एक साथ मौजूद हो सकते हैं — कुछ लाइनें एक स्टाइल की, कुछ दूसरी की। यह सबसे मुश्किल मामला है: "LF में" कन्वर्ज़न पहली नज़र में उन लाइनों के लिए कुछ नहीं बदलता जो पहले से LF थीं, लेकिन ज़रूरी है कि यह ट्रांसफ़ॉर्मेशन पूरी फ़ाइल पर लागू हो, सिर्फ़ दिखने में "संदिग्ध" लाइनों पर नहीं — वरना समस्या छिपी रह जाती है।

टूल आज़माएँ