Когда вы передаете выходные данные функции ncat
, она должна выполняться в подоболочке.По какой-то причине FD, подключенный к каналу замены процесса, не наследуется этой подоболочкой.Поскольку он использует /proc/self/fd
, если FD не открыт в дочернем процессе, попытка чтения из него не удалась.
Мне кажется, что это ошибка, поскольку функция должна работать аналогично внешним функциямв этом отношении.
Это не специфично для Linux, я воспроизвел проблему на MacOS под управлением zsh 5.3.
Кажется, что это происходит только тогда, когда подоболочка создается для канала.Чтобы увидеть, когда создается подпроцесс и наследуется ли FD, я изменил функцию на:
ncat() { echo $$;sh -c 'echo $PPID';echo "$@";ls /dev/fd; }
(/dev/fd
- это эквивалент Mac для /proc/self/fd
.)
ЕслиЯ запускаю
(ncat <(gzcat myfile.gz ))
Скобки создают подоболочку, но FD, связанный с подстановкой процесса , равен , показанному в выводе ls /dev/fd
.