if tty>/dev/null ; then
read x
else
read x<fic
fi
significa que fic será lido somente quando tty retornar um erro. O que acontecerá quando descobrir que seu stdin não é um terminal. Normalmente, isso acontece quando o script está em um canal ou quando você o executa via nohup , ou como uma tarefa cron ou remotamente via ssh -T ...
Usar [ -t 0 ] como uma condição é praticamente o mesmo (e mais rápido, já que [ aka test geralmente é incorporado nestes dias).