![`grep -l .. | xargs vim`이 경고를 생성하는 이유는 무엇입니까? [복사]](https://linux55.com/image/32527/%60grep%20-l%20..%20%7C%20xargs%20vim%60%EC%9D%B4%20%EA%B2%BD%EA%B3%A0%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음과 같은 명령을 실행하면
grep -rl test . | xargs vim
"Vim: 경고: 입력이 터미널에서 오지 않았습니다."라는 경고가 표시되지만 여전히 파일을 편집할 수 있습니다. 경고가 나타나는 이유는 무엇입니까?
답변1
Vim은 내부에서 호출되기 때문에관로, stdin
터미널이 아닌 이전 파이프의 출력에 연결됩니다. 대화형 명령으로서 Vim은 터미널에서 입력을 받아야 합니다.
via와 같은 파이프는 피하는 것이 가장 좋습니다.
$ vim $(grep -rl test .)
또는 Vim 내에서:
:args `grep -rl test .`
답변2
Vim은 명령을 입력하는 터미널로 표준 입력이 필요하지만 구현에 따라 이를 가져오거나 /dev/null
파이프할 것입니다.grep
xargs
중간 쉘을 통해 표준 입력을 복원할 수 있습니다.
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
보너스: 파일 이름에 공백(' 또는 ")이 포함되어 있어도 작동합니다.