mkfifo
создает файл канала. Здесь FIFO означает «первым пришел - первым вышел». Что бы ни один процесс записывал в канал, второй процесс может читать. Это не «настоящий» файл - данные никогда не сохраняются на диск; но Linux абстрагирует множество своих механизмов в виде файлов, чтобы упростить вещи.
nc -l 12345
свяжется с сокетом 12345 и прослушает; когда он ловит входящее соединение, он передает стандартный ввод на удаленный хост, а входящие данные удаленного хоста на стандартный вывод.
Таким образом, архитектура здесь:
remote host -> nc -> regular pipe -> myprogram
myprogram -> mypipe -> nc -> remote host
эффективно позволяет myprogram и удаленному хосту общаться, хотя myprogram был разработан для чтения из stdin и записи в stdout.
Поскольку канал bash (|
) обрабатывает только одно направление связи, вам необходимо создать явный второй канал для двустороннего межпроцессного соединения.