O shell pode me avisar se um programa está aguardando uma entrada padrão?

4

Digamos que eu queira procurar uma string em um arquivo grande: grep foo bar.txt | less , mas na verdade eu digito grep foobar.txt | less . Agora, grep está esperando por mim para digitar algo no terminal. Parece que o comando está demorando, até que eu note o meu erro.

O shell (qualquer shell, ou talvez tmux) detecta que um comando está aguardando a entrada do console e me avisa?

Edit: Parece que cada processo tem uma entrada padrão, e o shell não tem como saber se está realmente esperando algo chegar lá. No entanto, shells como zsh conhecem os argumentos da linha de comando para comandos comuns como grep e, portanto, podem me avisar dos programas que conhecem.

( grep f Aba não tenta completar nada, grep foo b Aba tentará completar o nome do arquivo.)

    
por Michael Kuhn 05.02.2013 / 15:37

2 respostas

4

Se você sabe que nunca vai usar grep para ler a partir do terminal, você pode redefinir o grep como:

grep() {
  if [ -t 0 ]; then
    < /dev/null command grep "$@"
  else
    command grep "$@"
  fi
}

Isso não lhe dará nenhum aviso sobre seu erro de digitação. Mas pelo menos ele retornará sem um fósforo imediatamente. Isso também afetará o comportamento quando - ou /dev/stdin for passado como um argumento para grep .

Editar:

Na verdade, uma maneira de obter um aviso seria fechar stdin em vez de redirecioná-lo de /dev/null :

grep() {
  if [ -t 0 ]; then
    <&- command grep "$@"
  else
    command grep "$@"
  fi
}

$ grep foobar.txt
grep: (standard input): Bad file descriptor
    
por 05.02.2013 / 17:41
1

Não, porque o shell não tem como saber se o programa está bloqueando a entrada. Mesmo que fosse, ele não pode saber se a entrada eventualmente virá (veja o problema da parada ). E se estiver esperando entrada do terminal? Você poderia esperar minutos, dias, décadas para dar a entrada que está esperando. less impede que a entrada chegue a grep , mas nem sempre é esse o caso, por ex. tente cat | grep foo - ele irá processar o que você digitar na linha de comando ( Ctrl + D para concluir).

    
por 05.02.2013 / 16:01

Tags