프로그램이 표준 입력을 기다리고 있으면 쉘이 나에게 경고할 수 있습니까?

프로그램이 표준 입력을 기다리고 있으면 쉘이 나에게 경고할 수 있습니까?

문자열을 찾기 위해 큰 파일을 검색하고 싶지만 grep foo bar.txt | less실제로는 을 입력한다고 가정해 보겠습니다 grep foobar.txt | less. 이제 grep터미널에 뭔가를 입력하기를 기다리고 있습니다. 내 오류를 발견할 때까지 이 명령이 지속된 것 같습니다.

쉘(모든 쉘 또는 tmux)이 명령이 콘솔 입력을 기다리고 있음을 감지하고 경고할 수 있습니까?

편집하다:모든 프로세스에는 표준 입력이 있는 것처럼 보이며 쉘은 실제로 무언가가 도착하기를 기다리고 있는지 알 수 없습니다. 그러나 쉘은 zsh일반적인 명령에 대한 명령줄 인수를 알고 있으므로 grep알고 있는 프로그램에 대해 나에게 경고할 수 있습니다.

( grep fTab아무 것도 완성하려고 시도하지 않고 grep foo bTab파일 이름을 완성하려고 시도합니다.)

답변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

관련 정보