ගොනුවක අවසානයට නව පේළියක් එක් කිරීමේ තේරුම කුමක්ද?


201

සමහර සම්පාදකයින් (විශේෂයෙන් C හෝ C ++ ඒවා) ඔබට මේ ගැන අනතුරු ඇඟවීම් ලබා දෙයි:

No new line at end of file

මෙය සී-ක්‍රමලේඛකයන්ට පමණක් ඇති ගැටලුවක් වනු ඇතැයි මම සිතුවෙමි, නමුත් ගිතුබ් කැපවීමේ දැක්ම තුළ පණිවිඩයක් පෙන්වයි:

\ No newline at end of file

PHP ගොනුවක් සඳහා.

මෙම ත්‍රෙඩ් එකේ පැහැදිලි කර ඇති පෙර සැකසුම් කාරණය මට වැටහී ඇත , නමුත් මෙය PHP සමඟ ඇති සම්බන්ධය කුමක්ද? එය එකම include()දෙයක්ද? නැතහොත් එය \r\nඑදිරිව \nමාතෘකාවට සම්බන්ධද?

ගොනුවක් අවසානයේ නව පේළියක් තිබීමේ තේරුම කුමක්ද?


SO වෙතින් අනුපිටපත්: stackoverflow.com/questions/729692/…
AlikElzin-kilaka

3
මිනිසුන්ව තල්ලු කිරීමට.
ඇන්ඩෲ

7
ඔබ catගොනුව නම්, නව රේඛාවකින් අවසන් නොවන්නේ නම් ඊළඟ විමසුම අවසාන "පේළියට" එකතු වේ.
ආරොන් ෆ්‍රෑන්ක්

Answers:


229

එය ගොනුවක් අවසානයේ අමතර නව රේඛාවක් එක් කිරීම ගැන නොවේ, එහි තිබිය යුතු නව රේඛාව ඉවත් නොකිරීම ගැන ය.

පෙළ ගොනු , unix යටතේ, මාලාවක් සමන්විත මාර්ග , එය අවසන් වේ සෑම පේලීයක් ( \n). ගොනුවක් හිස් නොවන අතර නව රේඛාවකින් අවසන් නොවන පෙළ පෙළ ගොනුවක් නොවේ.

පෙළ ලිපිගොනු මත ක්‍රියාත්මක වීමට නියමිත උපයෝගිතා නව රේඛාවකින් අවසන් නොවන ලිපිගොනු සමඟ හොඳින් කටයුතු නොකරනු ඇත; New තිහාසික යුනික්ස් උපයෝගිතා උදාහරණයක් ලෙස අවසාන නව රේඛාවෙන් පසුව පෙළ නොසලකා හැරිය හැක. GNU උපයෝගිතා වලට පෙළ නොවන ලිපිගොනු සමඟ විනීතව හැසිරීමේ ප්‍රතිපත්තියක් ඇත, එසේම වෙනත් බොහෝ නවීන උපයෝගිතා වලටද එසේ කළ හැකිය, නමුත් අවසාන නව රේඛාවක් නැති ලිපිගොනු සමඟ අමුතු හැසිරීමක් ඔබට තවමත් හමුවිය හැකිය.

GNU වෙනස සමඟ, සංසන්දනය කරන ලද එක් ගොනුවක් නව රේඛාවකින් අවසන් වන නමුත් අනෙක නොවේ නම්, එම කරුණ සැලකිල්ලට ගැනීම ප්‍රවේශම් වන්න. වෙනස රේඛීය-නැඹුරු බැවින්, එක් ගොනුවක් සඳහා නව රේඛාවක් ගබඩා කිරීමෙන් මෙය දැක්විය නොහැක, නමුත් අනෙක් ඒවා සඳහා නොවේ - වෙනස ගොනුවේ එක් එක් පේළිය ආරම්භ වන හා අවසන් වන ස්ථානය දැක්වීමට නව රේඛා අවශ්‍ය වේ. එබැවින් \ No newline at end of fileනව රේඛාවකින් අවසන් නොවූ ගොනුවක් ගොනුවකින් වෙන්කර හඳුනා ගැනීමට වෙනස මෙම විශේෂ පෙළ භාවිතා කරයි .

මාර්ගය වන විට, සී සන්දර්භය තුළ, ප්‍රභව ගොනුවක් ඒ හා සමානව පේළි මාලාවකින් සමන්විත වේ. වඩාත් නිවැරදිව, පරිවර්තන ඒකකයක් ක්‍රියාත්මක කිරීමේ දී පේළි මාලාවක් ලෙස අර්ථ දක්වා ඇති අතර, ඒ සෑම එකක්ම නව රේඛා අක්‍ෂරයකින් අවසන් විය යුතුය ( n1256 .15.1.1.1). යුනික්ස් පද්ධති වල, සිතියම්ගත කිරීම සරල ය. ඩොස් සහ වින්ඩෝස් වල, සෑම සීආර් එල්එෆ් අනුක්‍රමයක්ම ( \r\n) නව රේඛාවකට අනුරූපණය වේ ( \n; මෙම මෙහෙයුම් පද්ධතිවල පෙළ ලෙස විවෘත කරන ලද ගොනුවක් කියවීමේදී සැමවිටම සිදුවන්නේ මෙයයි). නව රේඛා අක්ෂරයක් නොමැති මෙහෙයුම් පද්ධති කිහිපයක් එහි ඇත, නමුත් ඒ වෙනුවට ස්ථාවර හෝ විචල්‍ය ප්‍රමාණයේ වාර්තා ඇත; මෙම පද්ධති මත, ගොනු සිට සී ප්‍රභවයට සිතියම්ගත කිරීම a\nඑක් එක් වාර්තාව අවසානයේ. මෙය යුනික්ස් වලට කෙලින්ම අදාළ නොවන අතර, එයින් අදහස් වන්නේ ඔබ එහි අවසාන නව රේඛාව නැතිවූ සී ප්‍රභව ගොනුවක් පටිගත කරන ලද පෙළ ගොනු සහිත පද්ධතියකට පිටපත් කළහොත් එය නැවත පිටපත් කරන්න, එවිට ඔබ අසම්පූර්ණ වනු ඇත ආරම්භක පරිවර්තනයේදී අවසන් පේළිය කප්පාදු කරන ලදි, නැතහොත් ප්‍රතිලෝම පරිවර්තනයේදී අමතර නව රේඛාවක් එයට සම්බන්ධ කර ඇත.

¹ උදාහරණය: GNU වර්ග කිරීමේ ප්‍රතිදානය සැමවිටම නව රේඛාවකින් අවසන් වේ. එබැවින් ගොනුවේ fooඅවසාන නව රේඛාව අස්ථානගත වී ඇත්නම්, sort foo | wc -cඊට වඩා එක් අක්‍ෂරයක් වාර්තා කරන බව ඔබට පෙනී යනු cat foo | wc -cඇත.


1
"... පේළි මාලාවක් සම්බන්ධයෙන්, ඒ සෑම එකක්ම නව රේඛා අක්‍ෂරයකින් අවසන් විය යුතුය (n1256 §5.1.1.1)" -> වඩාත් මෑත C11dr N1570 නැවත බැලීමේදී, සමහර විට හැර වෙනත් ඒවාට සහාය නොලැබුණි: "හිස් නොවන ප්‍රභව ගොනුවක් නව රේඛා අක්ෂරයකින් අවසන් වන අතර, එවැනි විභේදනයක් සිදුවීමට පෙර බැක්ස්ලෑෂ් අක්ෂරයකට පෙර එය නොපවතිනු ඇත." .15.1.1.2 2, නමුත් එය පිරිවිතර පිරිවිතරයන්ට පමණක් සීමා වී ඇති බව පෙනේ.
chux - මොනිකා නැවත ස්ථාපනය කරන්න

uchchux එම වාක්‍යය n1256 හි ද ඇත. අවසාන පේළිය නව රේඛා අක්ෂරයකින් අවසන් විය යුතුය. අන්තිම පේළිය නොවන රේඛා පැහැදිලිවම නව රේඛා අක්ෂරයකින් අවසන් විය යුතු අතර එම රේඛාව අවසන් වී ඊළඟ පේළිය ආරම්භ වේ. මේ අනුව සෑම පේළියක්ම නව රේඛා අක්‍ෂරයකින් අවසන් විය යුතුය.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

හ්ම්ම්, මට නම්, ““ මූලාශ්‍ර ගොනුවක් ... බෙදීම් සිදු වේ. ”යන රේඛාව සාමාන්‍යයෙන් ලිපිගොනු නොව සලකා බැලිය යුතු දේට සීමා විය හැකිය. එහෙත් යමෙකුට වෙනත් ආකාරයකින් බැලීමට හැකි ආකාරය මම දකිමි. සමහර විට මම තනතුරක් සොයමි බව පිළිබඳව අවධානය යොමු බව.
නැවත සේවයේ පිහිටුවීමට මොනිකා - chux

> "එබැවින් වෙනස මෙම විශේෂ පා text ය භාවිතා කරයි file ගොනුව අවසානයේ නව රේඛාවක් අවසන් නොවූ ගොනුවක් වෙන්කර හඳුනා ගැනීමට ගොනුව අවසානයේ නව රේඛාවක් නොමැත." Git මෙම පා shows ය පෙන්වන්නේ එය ගොනු සංසන්දනය කිරීමේදී පමණක් නොවේ. නමුත් නව ගොනුවක් git එකට එකතු කළ විට පවා. එබැවින් මෙම තර්කය වලංගු නොවේ, මම සිතමි.
වික්ටර් කෘග්ලිකොව්

1
ඇයි දැන් ඒ වෙනුවට පෞරාණික මෙවලම් යාවත්කාලීන අස්ථාන නව රේඛාවක් තියෙනවා නම් ඔවුන් බිඳ නැහැ එසේ නොවේ ...
ඇන්ඩෲ

48

අත්‍යවශ්‍යයෙන්ම හේතුව නොව, ලිපිගොනු නව රේඛාවකින් අවසන් නොවීම ප්‍රායෝගික ප්‍රති consequ ලයකි:

ඔබට ගොනු කිහිපයක් භාවිතා කිරීමට අවශ්‍ය නම් කුමක් සිදුවේදැයි සලකා බලන්න cat. උදාහරණයක් ලෙස, ඔබට fooලිපිගොනු 3 ක් හරහා පේළිය ආරම්භයේදී වචනය සොයා ගැනීමට අවශ්‍ය නම් :

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

ගොනුව 3 හි පළමු පේළිය ආරම්භ fooවුවද, ගොනුව 2 \nඑහි අවසාන පේළියට පසුව අවසන් නොවේ නම් , මෙම සිදුවීම grep මගින් සොයාගත නොහැකි වනු ඇත, මන්ද ගොනුව 2 හි අවසාන පේළිය සහ ගොනු 3 හි පළමු පේළිය grep විසින් තනි ලෙස දකිනු ඇත. රේඛාව.

එබැවින්, අනුකූලතාව සඳහා සහ විස්මයන් වළක්වා ගැනීම සඳහා මම මගේ ලිපිගොනු සෑම විටම නව රේඛාවකින් අවසන් කිරීමට උත්සාහ කරමි.


නමුත් ලිපිගොනු සංයුක්ත කිරීම ගැන සැලකිලිමත් වීම git ව්‍යාපාරයක්ද?
වික්ටර් කෘග්ලිකොව්

1
එය ඔබ තැබිය යුතුය හේතුවක් හැක්කක් නොවේ '\n'බළලා ක්රියාත්මක ගේ ...
ඇන්ඩෲ

3
එය හරියට, "සමහර විට මම \nකෙළවරේ හෝ සුදු පැහැති අවකාශයක් ඇති නූල් එකට එකතු කරමි , එබැවින් දේවල් ස්ථාවරව තබා ගැනීම සඳහා, මම සෑම විටම \n _____මගේ නූල් දෙකේම තබමි." හොඳයි, නැත, එහි කළ යුතු නිවැරදි දෙය නම් ඔබේ නූල් කපා ඒවා නිසි ලෙස සංයුක්ත කිරීමයි.
ඇන්ඩෲ

17

අංශ දෙකක් තිබේ:

  1. නව රේඛාවකින් අවසන් නොවන්නේ නම් අවසාන පේළිය විග්‍රහ කළ නොහැකි සමහර සී සම්පාදකයින් ඇත. සී ප්‍රමිතිය මඟින් සී ගොනුවක් නව රේඛාවකින් (සී 11, 5.1.1.2, 2.) අවසන් විය යුතු අතර නව රේඛාවක් නොමැතිව අවසාන පේළිය නිර්වචනය නොකළ හැසිරීමක් ලබා දෙයි (සී 11, ජේ .2, 2 වන අයිතමය). සමහර විට histor තිහාසික හේතූන් නිසා, පළමු සම්පාදනය ලියන විට එවැනි සම්පාදකයෙකුගේ සමහර වෙළෙන්දන් කමිටුවේ කොටසක් වූ බැවිනි. මේ අනුව ජී.සී.සී.

  2. diffවැඩසටහන් (භාවිතා කරන git diff, ගිතුබ් වැනි) ගොනු අතර රේඛීය වෙනස්කම් අනුව රේඛාව පෙන්වයි. නව රේඛාවක් සමඟ එක් ගොනුවක් පමණක් අවසන් වන විට ඔවුන් සාමාන්‍යයෙන් පණිවිඩයක් මුද්‍රණය කරයි, එසේ නොමැතිනම් ඔබට මෙම වෙනස නොපෙනේ. උදාහරණයක් ලෙස ලිපිගොනු දෙකක් අතර ඇති එකම වෙනස වන්නේ අන්තිම නව රේඛා අක්‍ෂරය තිබීමයි, ඉඟියක් නොමැතිව එය ගොනු දෙකම එක diffහා සමාන බව පෙනේ, cmpපිටවීමේ කේත අසමාන සාර්ථකත්වයක් සහ ලිපිගොනු වල චෙක්සම් (උදා. md5sum) නොගැලපේ.


වෙනස වැඩසටහන සමඟ අර්ථවත් කරන්න
තමරයිසෙල්වම්

වෙනස මෙන් ශබ්දය වඩා දක්ෂ විය යුතුය.
ඇන්ඩෲ

Nd ඇන්ඩ rew, නැහැ, එසේ නොවේ. diffවෙනස්කම් තිබේ නම් ඒවා මුද්‍රණය කිරීමට අපේක්ෂා කෙරේ. එක් ගොනුවක නව අක්‍ෂරයක් අන්තිම අක්‍ෂරය ලෙස ඇති අතර අනෙක එසේ නොවේ නම් එම වෙනස කෙසේ හෝ ප්‍රතිදානයේ කැපී පෙනේ.
maxschlepzig

ඔබගේ අවසාන ප්‍රකාශය නිවැරදි ය. කෙසේ වෙතත්, වෙනස නරඹන්නාට \nආරම්භ කිරීම සඳහා "නව රේඛා" ( ) පෙන්විය යුතු නැත , ඒ වෙනුවට "නව රේඛා" පෙන්විය හැකිය.
ඇන්ඩෲ

12

මෙම \ No newline at end of fileවෙතින් ලැබෙන github වූ ලප අවසානයේ දර්ශණය (දී diffආකෘතිය , එම "ඒකාබද්ධ ආකෘතිය" කොටස අවසානයේ දී එම නෝට්ටුව බලන්න).

ගොනුවක් අවසානයේ නව රේඛාවක් තිබේද නැද්ද යන්න සම්පාදකයින් ගණන් ගන්නේ නැත, නමුත් git(සහ diff/ patchඋපයෝගිතා) ඒවා සැලකිල්ලට ගත යුතුය. ඒ සඳහා බොහෝ හේතු තිබේ. උදාහරණයක් ලෙස, ගොනුවක් අවසානයේ නව රේඛාවක් එක් කිරීමට හෝ ඉවත් කිරීමට අමතක කිරීමෙන් එහි හැෂ්සම් ( md5sum/ sha1sum) වෙනස් වේ. එසේම, ලිපිගොනු සැමවිටම වැඩසටහන් නොවන අතර අවසාන \nඑකක් යම් වෙනසක් ඇති කරයි.

සටහන : සී සම්පාදකයින්ගේ අනතුරු ඇඟවීම ගැන, ඔවුන් අනුමාන කරන්නේ පසුගාමී අනුකූලතා අරමුණු සඳහා අවසාන නව රේඛාවක් ඉල්ලා සිටින බවයි. \n(හෝ වෙනත් පද්ධති මත රඳා පවතින අවසන් රේඛා වර්‍ග අනුක්‍රමය) අවසන් නොවන්නේ නම් ඉතා පැරණි සම්පාදකයින් අවසාන පේළිය පිළිගන්නේ නැත .


8
"පසුගාමී අනුකූලතා අරමුණු සඳහා අවසාන නව රේඛාවක් ඉල්ලා සිටින බව මම අනුමාන කරමි" - නැත, සී ප්‍රමිතිය විසින් එය නියම කර ඇති නිසා ඔවුන් එය අවධාරනය කරති .
MestreLion

1
EstMestreLion C සඳහා C ප්‍රභව කේතය සඳහා අවසාන නව රේඛාවක් අවශ්‍ය වේ (C11 .15.1.1.2 2). I / O පෙළ ගොනුව සඳහා C හි "අවසාන පේළියට නව රේඛා අක්‍ෂරයක් අවශ්‍යද යන්න ක්‍රියාත්මක කිරීම-අර්ථ දක්වා ඇත." §7.21.2 2
චක්ස් - මොනිකා නැවත ස්ථාපනය කරන්න

ඉතා පැරණි සම්පාදකයින් භාවිතා කරන්නේ කවුද? ඒවා භාවිතා කිරීම නවත්වන්න.
ඇන්ඩෲ

1
EstMestreLion: සී ප්‍රමිතිය එය නියම කරයි කියා ඔබ සිතන්නේ ඇයි…
ස්ටෙෆාන් ගිමිනෙස්

@ ස්ටෙෆාන් ගිමිනෙස්: විවිධ මෙහෙයුම් පද්ධති අතර අනුකූලතාව, වඩා හොඳ ගැළපුම සහ අන්තර් ක්‍රියාකාරිත්වය (
පොසික්ස්

6

වෙනස් ඉතිහාසය තබා ගැනීමේ කාරණය ද තිබේ. ගොනුවක් නව රේඛා අක්ෂරයකින් තොරව අවසන් වුවහොත්, ගොනුවේ අවසානයට කිසිවක් එකතු කිරීම විවිධ උපයෝගීතා මඟින් එම අන්තිම පේළිය වෙනස් කිරීමක් ලෙස දකිනු ඇත (එයට \nඑයට එකතු වන නිසා).

git blameසහ වැනි විධානයන් සමඟ මෙය අනවශ්‍ය ප්‍රති results ල ඇති කළ හැකිය hg annotate.


වෙනස මෙන් ශබ්දය වඩාත් දක්ෂ විය යුතුය.
ඇන්ඩෲ

1
වෙනස් මෙවලම් දක්ෂයි. ගොනුවේ සියුම් වෙනස ඔවුන් දකී (එය වැදගත් වන්නේ එය අනිවාර්යයෙන්ම ගොනුවේ හැෂ් වෙනස් කරන බැවිනි). -wමිනිසුන් සඳහා දත්ත ප්‍රතිදානය කිරීමේදී සුදු අවකාශයේ වෙනස්කම් නොසලකා හැරීමේ විකල්පයක් GNU වෙනස සහ git diff යන දෙකම පිළිගනී .
joeytwiddle

4

POSIX, මෙය මෙහෙයුම් පද්ධති අතර අනුකූලතාව පවත්වා ගැනීම සඳහා IEEE විසින් නියම කරන ලද ප්‍රමිති සමූහයකි.

ඉන් එකක් නම් “රේඛාවක්” යනු ශුන්‍ය හෝ ඊට වැඩි අක්ෂර නොවන අනුක්‍රමයක් සහ නව රේඛා අක්‍ෂරයකි.

එබැවින් එම අන්තිම පේළිය සත්‍ය “රේඛාවක්” ලෙස පිළිගැනීමට නම් එයට නව රේඛා අක්‍ෂරයක් තිබිය යුතුය.

ඔබේ ගොනුව විග්‍රහ කිරීමට හෝ විග්‍රහ කිරීමට / උදව් කිරීමට OS මෙවලම් මත යැපෙන්නේ නම් මෙය වැදගත් වේ. PHP ලබා දී ඇත්තේ ස්ක්‍රිප්ට් භාෂාවක් වන අතර, එය විශේෂයෙන් ම මුල් දිනවල හෝ දැන් පවා (මට කිසිම අදහසක් / තැපැල් කිරීමක් නැත) එයට OS පරායත්තතා තිබුනි.

යථාර්ථය නම්, බොහෝ මෙහෙයුම් පද්ධති සම්පූර්ණයෙන්ම පොසික්ස් අනුකූල නොවන අතර මිනිසුන් නව රේඛා අවසන් කිරීම ගැන සැලකිලිමත් වන හෝ යන්ත්‍රයක් නොවේ. එබැවින් බොහෝ දේ සඳහා එය සෑම දෙයක් ගැනම ස්මෝගස්බෝඩ් එකක් ගැන සැලකිලිමත් වීම, අනතුරු ඇඟවීම හෝ අන්තිම පෙළට යාම ඇත්තෙන්ම රේඛාවක් බැවින් එය ඇතුළත් කරන්න.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.