2016-10-29 3 views
3

이 오류는 이미 검색했지만 해결책을 찾지 못했습니다.Vim : 입력 내용을 읽는 중 오류가 발생했습니다.

리눅스 세계에 합류하기위한 기본 지침을 따르고 있습니다. .txt 파일을 만들고이 스크립트를 사용하여 Vim에 텍스트 줄을 추가하려고합니다. 그것은 작동해야하지만 내 경우에는 아닙니다.

다음

내 간단한 스크립트 (이것은 중요한 정보가 될 수 있다면, zsh을 사용하고는) :

#!/bin/sh 

filename= test.txt 
vim $filename << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

스크립트는 메시지와 함께 실패합니다 Vim: error reading input.

내가 잘못 했습니까?

답변

2

filename 변수에 filename= test.txt으로 오타가 있습니다 (추가 공간). 이 표현식은 test.txt 명령을 filename 환경 변수 (빈 문자열)로 지정하여 호출됩니다. 따라서 = 이후에 공간을 삭제해야합니다. 읽기 오류 입력 메시지에 대해서는

의 빔 설명서를 읽어 :help E208 :이 입력이 요구되는 동안 빔이 입력 된 문자를 읽을 수없는 경우에 발생

Vim: Error reading input, exiting... 

. Vim은 막혔다. 끝내기 만하면된다. 이것은 stdin과 stderr가 모두 리디렉션되고 Vim을 종료하지 않는 스크립트를 실행할 때 발생할 수 있습니다.

그래서 Vim은 Vim을 종료하지 않은 스크립트를 읽는다고 생각합니다. 스크립트가 삽입 모드로 들어가서 Hello을 입력 한 다음 Esc을 입력하고 마지막으로 :x 명령을 호출합니다. 모든 것이 좋다. :x 명령은 명령 행 영역에 입력되면 Vim을 빠져 나온다. 당신이 제어^[를 입력 한 경우 - V, Esc를 스크립트가 삽입 모드를 종료하고 성공적으로 :x 명령을 실행했을 것이다. 따라서 ^[을 두 자로 입력했습니다.그것은

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 
Vim: preserving files... 
Vim: Finished. 

을 이제 실제 이스케이프 문자로 두 문자를 ^[를 교체하고 같은 디렉토리에서 스크립트를 실행하면 : 그래서 당신의 진짜 입력 Hello^[:x이었다 (하고 스크립트가 빔을 종료하지 않았다) 때문에 스왑 파일의 실패합니다

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 

Vim: Finished. 

을 (당신은 vim test.txt을 실행하여 긴 설명을 읽을 수 있습니다). -n 옵션을 사용하여 스왑 파일을 무시할 수 있습니다 (vim -n "$filename"). 이제 출력은 다음과 같습니다.

Vim: Warning: Input is not from a terminal 

의미가 있습니다. 실제로 Vim의 대화 형 버전은 필요하지 않습니다. 따라서 ex 모드 (-e 옵션)을 사용하거나 예 : 예 모드 (-E 옵션) : vim -n -E "$filename"으로 개선해야합니다.

내용을 해석 할 필요가없는 경우 작은 따옴표로 묶고 문자열에 쉘 변수 인 filename='test.txt'이 있으면 큰 따옴표로 묶는 것이 좋습니다.

고정 버전 :

filename='test.txt' 
vim -n -E "$filename" << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

(^[ 제어하여 빔에 입력 - V,Esc 키).

+0

고마워,이 모든 것을 내 머리 속에 넣을거야. D –

0

filename= test.txt의 공백을 제거하고 마지막 줄 이후에 공백이 없는지 COMMAND으로 확인해야합니다. 첫 줄에 Hello가 있으면, i : iHello^[ 뒤에 이름 줄을 제거하십시오.

^[CTRL-v ESC을 입력하셨습니까? 그것은 한 문자 여야합니다.

+0

고마워요! 나는 2 개의 문자를 사용하여'^ ['를 썼다. 나는 더 나은 Vim 명령을 배워야한다. –

+0

당신은 대답을 받아 들일 수있다. 나는이 파일을 편집하는데 많은 부분을 사용했지만'sed -i'로 바꾸었다. 대화 형 편집의 경우 여전히 vi (m)를 사용하고 있습니다. –

0

이 같이 할 수 있습니다 : 월터 A가 말했듯이

#!/bin/sh 

filename=test.txt 

coms="iHello world^[:x ${filename}^M" 
vim -c "normal $coms" 

, 당신은 coms 변수 안에 각각 Ctrl-V EscCtrl-V Return를 쳐서 ^[^M를 교체해야합니다.

man vim 및 Vim :h :normal을 참조하십시오.

관련 문제