문자열을 찾기 위해 큰 파일을 검색하고 싶지만 grep foo bar.txt | less
실제로는 을 입력한다고 가정해 보겠습니다 grep foobar.txt | less
. 이제 grep
터미널에 뭔가를 입력하기를 기다리고 있습니다. 내 오류를 발견할 때까지 이 명령이 지속된 것 같습니다.
쉘(모든 쉘 또는 tmux)이 명령이 콘솔 입력을 기다리고 있음을 감지하고 경고할 수 있습니까?
편집하다:모든 프로세스에는 표준 입력이 있는 것처럼 보이며 쉘은 실제로 무언가가 도착하기를 기다리고 있는지 알 수 없습니다. 그러나 쉘은 zsh
일반적인 명령에 대한 명령줄 인수를 알고 있으므로 grep
알고 있는 프로그램에 대해 나에게 경고할 수 있습니다.
( grep f
Tab아무 것도 완성하려고 시도하지 않고 grep foo b
Tab파일 이름을 완성하려고 시도합니다.)
답변1
grep
터미널에서 데이터를 읽는 것을 절대 사용하지 않을 것임을 알고 있다면 grep을 다음과 같이 재정의할 수 있습니다.
grep() {
if [ -t 0 ]; then
< /dev/null command grep "$@"
else
command grep "$@"
fi
}
오타에 대한 경고는 제공되지 않습니다. 그러나 적어도 일치하는 항목 없이 즉시 반환됩니다. 또한 -
또는 가 /dev/stdin
매개변수로 전달될 때의 동작에도 영향을 줍니다 grep
.
편집하다:
실제로 경고를 받는 한 가지 방법은 표준 입력을 다음에서 리디렉션하는 대신 닫는 것입니다 /dev/null
.
grep() {
if [ -t 0 ]; then
<&- command grep "$@"
else
command grep "$@"
fi
}
$ grep foobar.txt
grep: (standard input): Bad file descriptor
답변2
아니요, 쉘은 프로그램이 입력을 차단하는지 여부를 알 수 없기 때문입니다. 그럼에도 불구하고 결국 입력이 올지 여부를 알 수 있는 방법이 없습니다(참조:다운타임 문제). 터미널로부터의 입력이 예상된다면 어떻게 될까요? 기다리고 있는 입력을 제공하기까지 몇 분, 며칠, 수십 년을 기다릴 수 있습니다. less
입력이 도착하는 것을 방지하기 위해 발생 grep
하지만 항상 그런 것은 아닙니다. try와 같이 명령줄에 입력한 내용( + 완성) cat | grep foo
을 처리합니다 .CtrlD