Почему не работает следующее?
exec 3<|cat $0
Идея состоит в том, чтобы получить дескриптор файла (3) канала (| cat $ 0).
Вы не можете смешивать exec и трубы таким образом. Кажется, вам нужна подстановка процесса:
$ exec 3< <(cat /etc/hosts) $ grep ftp <&3 209.85.41.143 ftp.archlinux.org
http://tldp.org/LDP/abs/html/x17601.html#REDIR1
http://tldp.org/LDP/abs/html/process-sub.html
exec 3<>$0 while read -u 3 line; do grep ftp $line; done exec 3>&-;