셸로 돌아갈 때 파일 이름을 VIM으로 파이핑하면 bash가 중단되는 이유는 무엇입니까?

셸로 돌아갈 때 파일 이름을 VIM으로 파이핑하면 bash가 중단되는 이유는 무엇입니까?

find를 사용하여 일부 파일을 검색했는데 Vim의 탭에서 모두 열고 싶습니다. 그래서 나는 이것을 시도했습니다 :

find . | xargs fgrep -l myExpression | xargs vim -p

ls<backspace><backspace>exitVim을 끝내고 종료할 때 vim에 입력한 모든 내용이 보이지 않고 백스페이스 키가 작동하지 않는 것을 제외하고는 잘 작동합니다. 따라서 결과 기록을 입력하면 가 작동하지 않습니다 ls^?^?exit. exit또한 경고합니다. 내 파이프는 다음과 같습니다. 터미널에서가 아닙니다.

그러나 쉘을 다시 시작하면 모든 것이 정상으로 돌아왔습니다. 이는 항상 재현 가능합니다.

히트 버전:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

빔 버전:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699

답변1

명령줄 프로그램은 두 가지 소스, 즉 stdin(파이핑 대상)과 직접 TTY를 통해 사용자로부터 입력을 얻을 수 있습니다. 이것들이 섞이면 나쁜 일이 일어날 수 있습니다. Vim은 파이프에서 입력을 읽는 것을 원하지 않고, 여러분(사용자)이 직접 입력을 읽기를 원합니다. 이제 실제 표준 입력을 반환해 보겠습니다.

우리가 사용할 수 있는 솔루션으로명령 대체파일을 Vim에 인수로 직접 전달합니다.

vim -p $(find . | xargs fgrep -l myExpression)

쉘에 의해 수행되는 확장으로 인해 이는 다음과 같습니다.아니요이름에 공백이 있는 파일을 올바르게 처리하지만 Bash-fu가 너무 약해서 쉽게 수정할 수 없습니다.

또는 find options | xargs some command로 쓸 수도 있는데 find options -exec some command {} +, 이는 더 우아한 것으로 간주될 수 있습니다.

관련 정보