কোনও ফাইলের শেষে একটি নতুন লাইন যুক্ত করার অর্থ কী?


165

কিছু সংকলক (বিশেষত সি বা সি ++ বেশী) আপনাকে সতর্কতা দেয়:

No new line at end of file

আমি ভেবেছিলাম এটি কেবলমাত্র সি-প্রোগ্রামারগুলির সমস্যা হবে, তবে গিথুব প্রতিশ্রুতিবদ্ধ দৃশ্যে একটি বার্তা প্রদর্শন করে:

\ No newline at end of file

একটি পিএইচপি ফাইলের জন্য।

আমি এই থ্রেডে ব্যাখ্যা করা প্রিপ্রোসেসরটি বুঝতে পারি , তবে পিএইচপি এর সাথে এর কী আছে? এটি কি একই include()জিনিস বা এটি \r\nবনাম \nবিষয়ের সাথে সম্পর্কিত ?

একটি ফাইলের শেষে একটি নতুন লাইন থাকার মানে কী?


: তাই থেকে সদৃশ stackoverflow.com/questions/729692/...
AlikElzin-kilaka

2
লোককে প্রস্রাব করা
অ্যান্ড্রু

3
আপনি যদি catফাইল করেন তবে পরবর্তী প্রম্পটটি চূড়ান্ত "লাইন" এ যুক্ত হবে যদি এটি কোনও নতুন লাইনের সাথে শেষ না হয়।
অ্যারন ফ্রাঙ্ক

উত্তর:


185

এটি কোনও ফাইলের শেষে একটি অতিরিক্ত নিউলাইন যুক্ত করার বিষয়ে নয়, এটি সেখানে থাকা নতুন লাইনটি সরিয়ে না দেওয়ার বিষয়ে।

ইউনিক্সের অধীনে একটি পাঠ্য ফাইলটিতে কয়েকটি লাইন থাকে, যার প্রতিটিটি একটি নতুন লাইনের অক্ষর ( \n) দিয়ে শেষ হয় । একটি ফাইল যা খালি নয় এবং একটি নতুন লাইনের সাথে শেষ হয় না তাই কোনও পাঠ্য ফাইল নয়।

পাঠ্য ফাইলগুলিতে অপারেশন করার কথা যে ইউটিলিটিগুলি নতুন লাইনের সাথে শেষ হয় না এমন ফাইলগুলির সাথে ভালভাবে মোকাবেলা করতে পারে না; Unতিহাসিক ইউনিক্স ইউটিলিটিগুলি শেষ নিউলাইনের পরে পাঠ্যটিকে উপেক্ষা করতে পারে, উদাহরণস্বরূপ। জিএনইউ ইউটিলিটিগুলির নন-টেক্সট ফাইলগুলির সাথে শালীন আচরণ করার নীতি রয়েছে এবং একই সাথে অন্যান্য বেশিরভাগ আধুনিক ইউটিলিটিগুলিও আপনাকে চূড়ান্ত নিউলাইন মিস করা ফাইলগুলির সাথে এখনও অদ্ভুত আচরণের মুখোমুখি হতে পারে ¹

জিএনইউ পার্থক্যের সাথে, তুলনা করা ফাইলগুলির মধ্যে একটি যদি নতুন লাইনের সাথে শেষ হয় তবে অন্যটি নয়, তবে সেই সত্যটি লক্ষ করা সতর্কতা অবলম্বন করে। যেহেতু পার্থক্য লাইন-ভিত্তিক, এটি ফাইলের একটির জন্য একটি নতুন লাইন সংরক্ষণ করে অন্যের জন্য নয়, এটি চিহ্নিত করতে পারে না - নিউলাইনগুলি পৃথক ফাইলের প্রতিটি লাইন কোথায় শুরু হয় এবং শেষ হয় তা নির্দেশ করার জন্য প্রয়োজনীয় । সুতরাং \ No newline at end of fileপৃথক এই বিশেষ পাঠ্যটি এমন কোনও ফাইলের পার্থক্য করতে ব্যবহার করে যা কোনও ফাইল থেকে নতুন লাইনে শেষ হয় না।

উপায় দ্বারা, একটি সি প্রসঙ্গে, একটি উত্স ফাইল একইভাবে লাইন একটি সিরিজ নিয়ে গঠিত। আরও স্পষ্টভাবে, একটি অনুবাদ ইউনিট একটি বাস্তবায়ন সংজ্ঞায়িত লাইনের একটি ধারা হিসাবে সংজ্ঞায়িত করা হয়, যার প্রত্যেকটি অবশ্যই একটি নতুন লাইন চরিত্রের সাথে শেষ হওয়া উচিত ( n1256 §5.1.1.1)। ইউনিক্স সিস্টেমে ম্যাপিংটি সোজা is ডস এবং উইন্ডোজে, প্রতিটি সিআর এলএফ সিকোয়েন্স ( \r\n) একটি নতুন লাইনে ম্যাপ করা হয় ( \n; এই ওএসগুলিতে পাঠ্য হিসাবে খোলা কোনও ফাইল পড়ার সময় এটি সর্বদা ঘটে)। সেখানে কয়েকটি ওএস আছে যাতে একটি নতুন লাইন চরিত্র নেই, তবে পরিবর্তে স্থির- বা পরিবর্তনশীল-আকারের রেকর্ড রয়েছে; এই সিস্টেমে ফাইলগুলি থেকে সি উত্সে ম্যাপিংয়ের মাধ্যমে a\nপ্রতিটি রেকর্ড শেষে। যদিও এটি ইউনিক্সের সাথে সরাসরি প্রাসঙ্গিক নয়, এর অর্থ হ'ল আপনি যদি রেকর্ড-ভিত্তিক পাঠ্য ফাইল সহ কোনও সিস্টেমে চূড়ান্ত নিউলাইন অনুপস্থিত এমন কোনও সি উত্স ফাইলটি অনুলিপি করেন তবে তা আবার অনুলিপি করুন, আপনি হয় অসম্পূর্ণতা সহ শেষ করবেন প্রারম্ভিক রূপান্তরকালে সর্বশেষ লাইনটি কেটে গেছে বা বিপরীত রূপান্তরকালে একটি অতিরিক্ত নতুন লাইন এটিতে লাগিয়েছে।

¹ উদাহরণ: জিএনইউ সাজানোর আউটপুট সর্বদা একটি নতুন লাইনের সাথে শেষ হয়। সুতরাং যদি ফাইলটির fooচূড়ান্ত নিউলাইনটি অনুপস্থিত থাকে তবে আপনি এটির sort foo | wc -cচেয়ে আরও একটি চরিত্রের প্রতিবেদন পাবেন cat foo | wc -c


"... ধারাবাহিক রেখাগুলি সম্পর্কে, যার প্রত্যেকটি অবশ্যই একটি নতুন লাইন চরিত্রের সাথে শেষ হওয়া উচিত (n1256 §5.1.1.1)" -> আরও সাম্প্রতিক সি 11 ডিআর এন 1570 পুনরায় দেখার ক্ষেত্রে সম্ভবত এর চেয়ে অন্যটির পক্ষে সমর্থন খুঁজে পেল না: "একটি উত্স ফাইল যা শূন্য নয় এটি একটি নতুন লাইনের চরিত্রের মধ্যে শেষ হবে, যা তত্ক্ষণাত ব্যাকস্ল্যাশ অক্ষর দ্বারা এর আগে এমন কোনও স্প্লাইসিংয়ের আগে হওয়া উচিত নয়।" §5.1.1.2 2, তবে এটি স্প্লিকিংয়ের নির্দিষ্টকরণের মধ্যে সীমাবদ্ধ বলে মনে হচ্ছে।
chux

@ chux এই বাক্যটি এন 1256 এও উপস্থিত রয়েছে। শেষ রেখাটি অবশ্যই একটি নতুন লাইনের চরিত্রের সাথে শেষ হবে। শেষ রেখাটি নয় এমন রেখাগুলি অবশ্যই একটি নতুন রেখাযুক্ত অক্ষরের সাথে অবশ্যই শেষ হতে হবে যা নির্দেশ করে যে সেই লাইনটি শেষ হয়ে গেছে এবং পরবর্তী লাইনটি শুরু হবে। সুতরাং প্রতিটি লাইন একটি নতুন লাইন চরিত্রের সাথে শেষ হতে হবে।
গিলস

হুম, আমার কাছে, এই লাইনটি "" একটি উত্স ফাইল ... স্প্লাইকিং ঘটে takes "স্লাইসিংয়ের বিবেচনার মধ্যে সীমাবদ্ধ থাকতে পারে এবং ফাইলগুলি সাধারণভাবে নয়। তবুও আমি দেখতে পাচ্ছি যে অন্যভাবে কীভাবে দেখা যায় Perhaps সম্ভবত আমি কোনও পোস্ট খুঁজব এটি এতে ফোকাস করে
chux

> "তাই আলাদা এই বিশেষ পাঠ্যটি ব্যবহার করে \ যে ফাইলটি একটি নতুন লাইনে শেষ হয় নি এমন ফাইলের পার্থক্য করতে ফাইলের শেষে কোনও নিউলাইন নেই" " গিট এই পাঠ্যটি কেবলমাত্র ফাইলগুলির সাথে তুলনা করলেই দেখায়। এমনকি যখন নতুন ফাইলটি গিটে যুক্ত হয়। সুতরাং এই যুক্তিটি বৈধ নয়, আমি মনে করি।
ভিক্টর ক্রুগলিকভ

> "পাঠ্য ফাইলগুলিতে পরিচালিত ইউটিলিটিগুলি যে কোনও নতুন লাইনের সাথে শেষ হয় না এমন ফাইলগুলির সাথে ভালভাবে লড়াই করতে পারে না" আমি মনে করি না যে পসিক্সের কারণে of n মিস করার মতো নিম্ন স্তরের সমস্যার যত্ন নেওয়া গিটের ব্যবসা of প্রয়োজনীয়তা। আমি মনে করি যদি গিটটি এই বার্তাটি দেখায়, কারণ উত্স নিয়ন্ত্রণ সমস্যা হওয়া উচিত ।
ভিক্টর ক্রুগলিকভ

41

অগত্যা কারণ নয়, তবে ফাইলগুলির ব্যবহারিক পরিণতি নতুন লাইনের সাথে শেষ হচ্ছে না:

আপনি যদি কয়েকটি ফাইল ব্যবহার করে প্রক্রিয়া করতে চান তবে কী হবে তা বিবেচনা করুন cat। উদাহরণস্বরূপ, আপনি যদি foo3 টি ফাইল জুড়ে লাইনের শুরুতে শব্দটি খুঁজতে চান :

cat file1 file2 file3 | grep -e '^foo'

যদি ফাইল 3-এর প্রথম লাইনটি শুরু হয় fooতবে ফাইল 2 \nএর শেষ লাইনের পরে একটি চূড়ান্ত না থাকলে এই ঘটনাটি গ্রেপ দ্বারা পাওয়া যায় না, কারণ ফাইল 2-র শেষ লাইন এবং ফাইল 3 এর প্রথম লাইনটি গ্রেপ দ্বারা একক হিসাবে দেখা যাবে লাইন।

সুতরাং, দৃistence়তার জন্য এবং আশ্চর্যতা এড়াতে আমি আমার ফাইলগুলি সর্বদা একটি নতুন লাইনের সাথে শেষ করে দেওয়ার চেষ্টা করি।


তবে ফাইলগুলি একত্রিত করার বিষয়ে যত্ন নেওয়া কি গিটের ব্যবসা?
ভিক্টর ক্রুগলিভ

আপনার কি ঠিক '\n'এই বিড়ালের অপারেশন করা উচিত এই কারণটি দাঁড়ায় না ...
অ্যান্ড্রু

3
বলে যে মত, "মাঝে মাঝে আমি স্ট্রিংস একসঙ্গে যোগ আছে \nবা প্রান্তে হোয়াইটস্পেস, যাতে কিছু সামঞ্জস্যপূর্ণ রাখতে তাই হয়, আমি সবসময় করা \n _____আমার স্ট্রিং উভয় প্রান্তে।" ঠিক আছে, না, আপনার স্ট্রিংগুলি ছাঁটাই করা এবং তারপরে সেগুলি যথাযথভাবে সংমিশ্রণ করা সঠিক কাজ।
অ্যান্ড্রু

16

দুটি দিক রয়েছে:

  1. কিছু সি সংকলক আছে / রয়েছে যা শেষ লাইনে কোনও নতুন লাইনের সাথে শেষ না হলে পার্স করতে পারে না। সি স্ট্যান্ডার্ডটি উল্লেখ করে যে একটি সি ফাইল একটি নতুন লাইনের (সি 11, 5.1.1.2, 2) দিয়ে শেষ হওয়া উচিত এবং একটি নতুন লাইন ছাড়াই একটি শেষ লাইন অপরিজ্ঞাত আচরণ দেয় (সি 11, জে 2, 2 য় আইটেম)। সম্ভবত historicতিহাসিক কারণে, কারণ প্রথম শ্রেণীর লেখার সময় এই জাতীয় সংকলকের কিছু বিক্রেতা কমিটির অংশ ছিল। এইভাবে জিসিসির সতর্কতা।

  2. diffপ্রোগ্রামগুলি (যেমন ব্যবহৃত git diff, গিথুব ইত্যাদি) ফাইলগুলির মধ্যে লাইন পার্থক্য দেখায় line যখন কেবলমাত্র একটি ফাইল একটি নিউলাইন দিয়ে শেষ হয় তখন তারা সাধারণত একটি বার্তা মুদ্রণ করে কারণ আপনি এই পার্থক্যটি দেখতে পাবেন না। উদাহরণস্বরূপ, যদি দুটি ফাইলের মধ্যে একমাত্র পার্থক্য হ'ল সর্বশেষ নিউলাইন চরিত্রের উপস্থিতি, ইঙ্গিত ব্যতীত এটি উভয় ফাইলের মতো হবে বলে মনে হয় diffএবং কখন cmpএকটি প্রস্থান-কোড অসম সাফল্য এবং ফাইলগুলির চেকসামগুলি ফেরত দেয় (উদাহরণস্বরূপ md5sum) মিলছে না।


ভিন্ন প্রোগ্রামের সাথে
অর্থটি তৈরি করুন

ডিফসের মতো শব্দগুলি কেবল স্মার্ট হওয়া উচিত।
অ্যান্ড্রু

@ অ্যান্ড্রু, না, তা হয় না। diffপার্থক্য আছে যদি মুদ্রণ প্রত্যাশিত হয়। এবং যদি একটি ফাইলের সর্বশেষ অক্ষর হিসাবে একটি নতুন লাইন থাকে তবে অন্যটি না থাকে তবে সেই পার্থক্যটি আউটপুটটিতে অবশ্যই কোনওভাবে লক্ষণীয় হওয়া উচিত।
ম্যাক্সচলেপজিগ

আপনার পরবর্তী বিবৃতিটি সঠিক correct তবে, পৃথক দর্শকের \nশুরুতে "নিউলাইনস" ( ) প্রদর্শন করতে হয় না, এটি পরিবর্তে কেবল "নতুন লাইনগুলি" প্রদর্শন করতে পারে।
অ্যান্ড্রু

10

\ No newline at end of fileআপনি থেকে পাওয়া GitHub একটি প্যাচ শেষে মনে হচ্ছে, (ইন diffবিন্যাস , "ইউনিফায়েড বিন্যাস" বিভাগে শেষে নোট দেখুন)।

ফাইলের শেষে একটি নিউলাইন আছে কি নেই তা সংকলকরা বিবেচনা করে না, তবে git(এবং diff/ patchইউটিলিটিগুলি) তাদের অ্যাকাউন্টে নিতে হবে। এর অনেক কারণ আছে। উদাহরণস্বরূপ, কোনও ফাইলের শেষে একটি নতুন লাইন যুক্ত করা বা সরাতে ভুলে গেলে তার হ্যাশম ( md5sum/ sha1sum) পরিবর্তন হবে । এছাড়াও, ফাইলগুলি সর্বদা প্রোগ্রাম হয় না এবং একটি চূড়ান্ত \nকিছুটা পার্থক্য করতে পারে।

দ্রষ্টব্য : সি সংকলকগণের কাছ থেকে প্রাপ্ত সতর্কবার্তা সম্পর্কে, আমি অনুমান করি যে তারা পশ্চাদপদ সামঞ্জস্যের উদ্দেশ্যে চূড়ান্ত নতুন লাইনের জন্য জোর দিয়েছিল। খুব পুরানো সংকলকরা শেষ পংক্তিকে গ্রহণ করতে পারে না \n(বা অন্যান্য সিস্টেম-নির্ভর লন্ড-এ-লাইন চর ক্রম) শেষ না হলে।


7
"আমি অনুমান করি তারা পশ্চাদপদ সামঞ্জস্যের উদ্দেশ্যে চূড়ান্ত নিউলাইন করার জন্য জোর দিয়েছিল " - নাহ, তারা এটিতে জোর দেয় কারণ সি স্ট্যান্ডার্ড এটি আদেশ দেয়।
MestreLion

1
@ মাস্টারলিয়ন সি সি উত্স কোডের জন্য একটি চূড়ান্ত নিউলাইন প্রয়োজন (সি 11 §5.1.1.2 2) 2 নোট করুন যে পাঠ্য ফাইল I / O এর জন্য সি আছে "শেষ লাইনে শেষের নতুন লাইনের চরিত্রটি প্রয়োগকরণ-সংজ্ঞায়িত করা আছে কিনা।" §7.21.2 2
chux

কে খুব পুরানো সংকলক ব্যবহার করছে? এগুলি ব্যবহার বন্ধ করুন।
অ্যান্ড্রু

1
@ মাস্টারলিয়ন: এবং আপনি কেন সি স্ট্যান্ডার্ড এটি বাধ্যতামূলক বলে মনে করেন…
স্টাফেন গিমেনেজ

@ StéphaneGimenez: দৃঢ়তা, ভাল সামঞ্জস্য এবং বিভিন্ন অপারেটিং সিস্টেমের মধ্যে ইনটেরোপিরাবিলিটি (POSIX এছাড়া '\ এন' বিভক্তি লাইন সংজ্ঞায়িত)
MestreLion

4

পসিক্স, এটি অপারেটিং সিস্টেমের মধ্যে সামঞ্জস্যতা বজায় রাখতে আইইইই দ্বারা নির্দিষ্ট মানগুলির একটি সেট।

এর মধ্যে একটি হ'ল "লাইন" এর সংজ্ঞা শূন্য বা আরও নন-চরিত্রের সমাপ্তি এবং একটি সমাপ্তি নিউলাইন চরিত্রের ক্রম।

সুতরাং সেই শেষ লাইনটিকে আসল "লাইন" হিসাবে স্বীকৃতি দেওয়ার জন্য এটির একটি সমাপ্তি নতুন রেখা চরিত্র হওয়া উচিত।

লাইন গণনা বা বিভাজন / আপনার ফাইলকে বিশ্লেষণ করতে যদি আপনি ওএস সরঞ্জামগুলির উপর নির্ভর করেন তবে এটি গুরুত্বপূর্ণ। প্রদত্ত পিএইচপি হ'ল একটি স্ক্রিপ্ট ভাষা, এটি সম্পূর্ণরূপে সম্ভব বিশেষত প্রথম দিকের দিনগুলিতে বা এখন পর্যন্ত (আমার কোনও ধারণা / পোস্টুলেটিং নেই) এটির মতো ওএস নির্ভরতা ছিল।

বাস্তবে, বেশিরভাগ অপারেটিং সিস্টেমগুলি সম্পূর্ণরূপে পসিক্সের সাথে সামঞ্জস্য হয় না এবং মানুষ এমন কোনও মেশিনও নয় যা নতুন লাইনগুলি সমাপ্ত করার বিষয়ে যত্নশীল। সুতরাং বেশিরভাগ জিনিসের জন্য এটি প্রতিটি বিষয়গুলির একটি স্মারগাসবার্ড হয় এটি সম্পর্কে যত্নশীল, সতর্কতা বা কেবল পাঠের শেষ বিটটি আসলে একটি লাইন তাই কেবল এটি অন্তর্ভুক্ত করুন।


3

পৃথক ইতিহাস রাখার বিষয়টিও রয়েছে। যদি কোনও ফাইল একটি নতুন লাইন অক্ষর ব্যতীত শেষ হয়, তবে ফাইলটির শেষে যে কোনও কিছু যুক্ত করা সেই বিচ্ছিন্ন ইউটিলিটিগুলির দ্বারা সেই শেষ লাইনটি পরিবর্তনের হিসাবে দেখা হবে (কারণ \nএটি এতে যুক্ত করা হচ্ছে)।

এটি git blameএবং এর মতো আদেশগুলি দিয়ে অযাচিত ফলাফলের কারণ হতে পারে hg annotate


ডিফের মতো সাউন্ডগুলি কেবল আরও স্মার্ট হওয়া দরকার।
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.