`grep -l .. | xargs vim`이 경고를 생성하는 이유는 무엇입니까? [복사]

`grep -l .. | xargs vim`이 경고를 생성하는 이유는 무엇입니까? [복사]

다음과 같은 명령을 실행하면

grep -rl test . | xargs vim

"Vim: 경고: 입력이 터미널에서 오지 않았습니다."라는 경고가 표시되지만 여전히 파일을 편집할 수 있습니다. 경고가 나타나는 이유는 무엇입니까?

답변1

Vim은 내부에서 호출되기 때문에관로, stdin터미널이 아닌 이전 파이프의 출력에 연결됩니다. 대화형 명령으로서 Vim은 터미널에서 입력을 받아야 합니다.

via와 같은 파이프는 피하는 것이 가장 좋습니다.

$ vim $(grep -rl test .)

또는 Vim 내에서:

:args `grep -rl test .`

답변2

Vim은 명령을 입력하는 터미널로 표준 입력이 필요하지만 구현에 따라 이를 가져오거나 /dev/null파이프할 것입니다.grepxargs

중간 쉘을 통해 표준 입력을 복원할 수 있습니다.

grep -rl test . | xargs sh -c 'vim -- "$@" <$0' /dev/tty

파일 이름에 공백 문자 등이 포함되어 있지 않으면 \[?*명령 대체를 사용할 수 있습니다.

vim $(grep -rl test .)

특수 문자(줄 바꿈 제외)를 처리하는 한 가지 방법은 단어 분할을 줄 바꿈으로 제한하고 와일드카드를 끄는 것입니다.

(IFS='
'; set -f; exec vim $(grep -rl test .))

답변3

xargs 대신 GNU Parallel을 사용하면 경고가 표시되지 않으며 나중에 터미널 설정이 변경되지 않습니다.

grep -rl test . | parallel -X --tty vi

보너스: 파일 이름에 공백(' 또는 ")이 포함되어 있어도 작동합니다.

관련 정보