A forma como eu leio isso - com base na seção bash manpage do REDIRECTION - é que stdin
(fd0) é redirecionado para fd4, então a entrada é tirada de /etc/XX/cfg
para stdin
- que terminará em fd4 .
read line1
deve então pegar fd4, que é então colocado de volta em fd0.
Uma demonstração pode mostrar meu significado um pouco melhor e responder "por que" você pode fazer isso. Adicionando outra linha e colocando-a em um wrapper:
$ vim ./test.sh
#!/bin/bash
exec 4<&0 0</etc/XX/cfg
read line1 # reads from fd4
exec 0<&4
read line2 # reads from fd0
echo $line1
echo $line2
Você pode canalizar ou redirecionar stdin
via test.sh mas também ler na configuração por redirecionamento, então no código acima eu obtive valores da "config" (suposição da minha parte baseada no nome do arquivo - ruim :)), mas também posso processar via stdin.
por exemplo:
$ ./test.sh < somefile
$ cat somefile | ./test.sh
Espero que isso explique isso.