- Unix 환경에서 vi는 필수라고 봐도 되며 vi 없는 Unix는 상상도 하기가 어렵습니다…….
- 그러나 그런 만큼 vi editor에 문제가 생기게 되면 script 파일이나 문서를 수정하는데 큰 곤란을 겪게 될 것입니다.
- 그래서 vi editor를 사용하던 중 화면이 깨지거나 텍스트가 밀려서 입력되는 현상이 발생하면 당혹스러울 수 밖에 없을 것입니다.
- 주로 발생하는 원인은 OS 언어를 한글로 설치하고 인코딩 설정이 불일치 할 경우 자주 발생하며 간헐적으로 계정의 환경설정 파일의 누락과도 연관이 있는 경우가 있었습니다.
- Character encoding 또는 Remote character set 또는 Encoding 설정을 변경합니다.
- Default일 경우 UTF-8로 변경
- UTF-8일 경우 Default로 변경
- vi 화면이 깨지는 현상의 경우 export TERM=vt100 을 실행 후 vi를 실행하도록 합니다.
Shell Script bad interpreter error
- Shell Script를 윈도우 환경에서 작성했거나 FTP로 전송하고 리눅스 환경에서 실행하면 아래와 같은 에러 메시지를 마주할 때가 있습니다.
[root@localhost ~]# ./temp.sh
-bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory
- 결론적으로는 윈도우와 리눅스의 개행문자의 차이로 인해 발생하는 현상으로 윈도우는 CRLF, 리눅스는 LF입니다. 대강의 의미는 아래와 같습니다.
LF : Line Feed | 커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed) |
CR : Carriage Return | 커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return) |
https://zetawiki.com/wiki/%EA%B0%9C%ED%96%89%EB%AC%B8%EC%9E%90,%EB%9D%BC%EC%9D%B8%ED%94%BC%EB%93%9C,%EC%BA%90%EB%A6%AC%EC%A7%80%EB%A6%AC%ED%84%B4
- Binary 타입으로 윈도우의 에디터에서 파일을 저장하거나 FTP로 전송하게 되면 윈도우의 개행문자 “\r\n”가 리눅스의 개행문자 “\n”으로 변환 되지 않게 되어 처음과 같은 현상이 발생하게 됩니다.
- 해당 상태를 정확히 확인하기 위해서는 vi 편집기를 Binary모드로 실행하면 되고 아래와 같이 확인이 가능합니다.
[root@localhost ~]# vim -b temp.sh
!/bin/bash^M
^M
ls -lh^M
- 단순히 ^M만 삭제후 저장해도 해결 가능하지만 수백줄이상의 스크립트에서는 작업하기 곤란한 방식이므로 검색, 치환 기능을 이용해 변경할 수 있습니다.
- 개행문자 ^M은 “Shift + 6”, “Shift + m” 이 아닌 “Ctrl + v + m” 입력해야 합니다.
[root@localhost ~]# vim -b temp.sh
:%s/^M//g
- 또는 기본 모드로 vi를 실행 후 Last Line Mode에서 설정 입력 후 저장 하는 방법이 있습니다.
[root@localhost ~]# vim temp.sh
:set fileformat=unix
:wq
- vi 편집기를 사용하기 곤란한 환경에서는 sed 명령으로 해당 개행문자를 치환 할 수 있습니다.
[root@localhost ~]# sed -i -e 's/\r$//' temp.sh
[root@localhost ~]# sed -i -e 's/^M$//' temp.sh // ^M은 "Ctrl + v + m" 입력
- 저장하거나 전송할 때 파일 포멧을 선택할 수 있으므로 사전에 신경을 쓰는게 시행착오를 방지하는 방법입니다. 🙂
What is vi?
- Unix 계열에서 사용되는 text 편집기
- 최근의 Redhat 계열 Linux에서는 vim을 vi로 alias 처리(vim 패키지 미설치시 미적용)
- UNIX와 Linux의 Terminal CLI 환경에서는 가장 기본적인 편집기이기 때문에 기본적인 사용키 정도는 익혀두는 것이 좋습니다.
3 modes of vi
- Command Mode(명령) : esc 입력 상태, 기본값
- Insert Mode(입력) : 편집 상태
- Last Line Mode(명령) : Command Mode상 : “shift + ;” 입력 상태, 파일 또는 vi 상태 제어
Commande Mode Control
Input | Function |
h | 왼쪽 이동 |
j | 위로 이동 |
k | 아래로 이동 |
l | 오른쪽 이동 |
^ or 0 | 행의 가장 처음으로 이동 |
$ | 행의 가장 끝으로 이동 |
gg | 제일 첫 행으로 이동 |
G | 제일 끝 행으로 이동 |
b | 왼쪽 특수문자 혹은 한단어의 처음으로 이동 |
B | 왼쪽 한단어의 처음으로 이동 |
x | 현재 커서 위치 삭제 |
X | 현재 커서가 위치한 앞 글자 삭제 |
dw | 현재 커서 위치 한단어 삭제 |
d$ | 현재 커서 위치 행 삭제 |
dd | 현재 커서부터 마지막 행까지 삭제 |
CTRL+b | 한페이지 위로 이동 |
CTRL+f | 한 페이지 아래로 이동 |
숫자+G | 해당 숫자의 행으로 이동 |
w | 오른쪽 특수문자 혹은 한단어의 처음으로 이동 |
W | 오른쪽 한단어의 처음으로 이동 |
i | 현재 커서 앞쪽에 입력 |
I | 현재 커서 행의 맨 앞에서 입력 |
a | 현재 커서 뒤쪽에 입력 |
A | 현재 커서 행의 마지막에 입력 |
o | 현재 커서 행의 아래 줄에 입력 |
O | 현재 커서 행의 위쪽 줄에 입력현재 커서 행의 위쪽 줄에 입력 |
s | 현재 커서의 한 글자를 지우고 입력 |
S | 현재 커서의 행을 지우고 입력 |
r | 현재 커서의 한 글자를 교체 |
cw | 현재 커서의 한 단어 교체 |
u | Undo(입력시 마다 이전 작업으로 이동) |
숫자+yy | 현재 커서부터 숫자만큼의 행을 복사(1은 생략 가능) |
yw | 현재 커서의 한 단어 복사 |
Y$ | 현재 커서부터 마지막 행까지 복사 |
숫자+p | 복사한 내용을 현재 커서 다음에 붙여넣기(숫자 횟수 만큼) |
숫자+P | 복사한 내용을 현재 커서 전에 붙여넣기(숫자 횟수 만큼) |
/ | 커서의 위치에서 아래로 검색 |
? | 커서의 위치에서 위로 검색 |
n | 검색 결과에서 아래 행 이동 |
N | 검색 결과에서 위 행 이동 |
모든 제어는 커서의 위치 기준
Insert Mode Control
- i, a등의 Command Mode 제어키를 통해 입력 모드로 전환
- 문서의 작성 또는 편집이 가능한 상태
Last Line Mode Control
Input | Function |
:s/찾는문자열/치환문자열 | 현재 커서 행에서 검색, 치환 |
:1,10s/찾는문자열/치환문자열 | 1행에서 10행까지 검색, 치환 |
:%s/찾는문자열/치환문자열 | 전체 행에서 검색, 치환 |
\+/ | 특수문자를 검색하려면 해석방지를 위해 그 앞에 \를입력 |
:nohl | 검색등을 통해 하이라이트(Highlight)처리된 블럭을 해제 |
:set number | 행 번호 표시 |
:set nonumber | 행 번호 표시 취소 |
:set autoindent | 들여쓰기 설정 |
:set noautoindent | 들여쓰기 제거 |
:set list | 문단,조판부호 보기 |
:set nolist | 문단,조판부호 안보이게 |
:set ignorecase | 검색시 대소문자 구별 제거 |
:set noignorecase | 검색시 대소문자 구별 |
:set window=30 | 한 화면당 행의 갯수 30개로 지정 |
:set all | 현재 설정된 vi 모든 설정값 보기 |
:q | 저장하지 않고 vi 종료 |
:q! | 읽기전용인 파일을 수정후 강제로 저장할때 |
:w | 현재내용을 저장 |
:w! | 읽기전용인 파일을 수정후 강제로 저장할때 |
:wq | 저장하고 종료 |
:wq! | 읽기전용인 파일을 수정후 강제로 저장하고 종료하기 |
:w “filename” | 새로운 파일명으로 저장 |
모든 제어는 커서의 위치 기준
IT Infomation, Ultima Online