이상한 행동을 이해하는 데 어려움이 있습니다 .vi 는 파일 끝에 특별히 입력하지 않으면 줄 바꿈 (ASCII : LF, Unix ( AIX ) 시스템 이므로 LF)을 추가하는 것처럼 보입니다 .
vi에서 파일을 편집합니다 (끝에 줄 바꿈을 입력하지 않도록주의하십시오).
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
vi는 "있는 그대로"저장하여 39 바이트를 갖도록 기대합니다. 처음 세 줄 각각에 10 개의 ASCII 문자 (숫자 1-9, 그 뒤에 줄 바꿈 (시스템의 LF)), 마지막 9 개만 줄 (문자 1-9, 종료 줄 바꿈 / LF 없음).
그러나 저장하면 39 바이트 대신 40 바이트이며 od는 종료 LF를 보여줍니다 .
# wc foo
4 4 40 foo ## I expected 39 here! as I didn't add the last newline
# od -a toto
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9 lf
0000050
## An "lf" terminates the file?? Did vi add it silently?
vi에서 내가 한 일을 printf로 파일을 만들면 예상대로 작동합니다.
# ## I create a file with NO newline at the end:
# printf "123456789\n123456789\n123456789\n123456789" > foo2
# wc foo2 ## This one is as expected: 39 bytes, exactly as I was trying to do above with vi.
3 4 39 foo ## As expected, as I didn't add the last newline
## Note that for wc, there are only three lines!
## (So wc -l doesn't count lines; it counts the [newline] chars... Which is rather odd.)
# root@SPU0WMY1:~ ## od -a foo2
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9
0000047 ## As expected, no added LF.
vi로 파일을 다시 열면 두 파일 (foo (40 characters) 및 foo2 (39 characters)이 똑같이 나타납니다 ...
그리고 vi에서 foo2 (39 문자, 종료 줄 바꿈 없음)를 열고 아무것도 편집 하지 :wq
않고 40 문자를 쓰면 줄 바꿈이 나타납니다!
더 최근의 vi에 접근 할 수 없습니다 (나는 AIX에서 vi, vi ( vim 아님) 버전 3.10이라고 생각합니까?
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
vi가 파일의 끝에 줄 바꿈을 자동으로 추가하는 것이 vi입니까? (~는 이전 줄이 줄 바꿈으로 끝나지 않았다고 생각했습니다.)
-
편집 : 아래의 답변 덕분에 추가 업데이트와 약간의 요약이 있습니다.
vi 파일이 비어 있지 않은 경우 파일이없는 파일을 쓰는 시점에 후행 줄 바꿈을 자동으로 추가합니다.
그것은 글을 쓸 때만 그렇게합니다! (즉, : w까지 : e를 사용하여 파일을 열었을 때 파일이 여전히 유효한지 확인할 수 있습니다 ... 저장하면 줄 바꿈이 특정 경고없이 자동으로 추가됩니다 (저장 바이트 수를 말하지만 대부분의 경우 줄 바꿈이 추가 된 것을 알기에 충분하지 않습니다) (@jiliagre에게 감사를 표합니다. vi 메시지를 열면 변경이 실제로 발생하는시기를 알 수 있습니다.)
이것은 (자동 수정) POSIX 동작입니다! (참조는 @ barefoot-io 답변 참조)
vi
을 실행하여 버전이나 그 기원에 대한 단서 를 얻을 수 있습니다 :ve
.
ex
은 :ver
명령이 일반적으로 문서화 된 매뉴얼 페이지를 제거했습니다 .