В zsh разница между cat <(cat) и cat | cat против cat = (кошка)?

В качестве замены zsh / процесса noob я ожидал cat <(cat) и cat | cat cat | cat сделать то же самое: скопировать строки из stdin в stdout. Мое понимание заключалось в том, что оба будут выполнять cat в подоболочке, перенаправить stdout cat подоболочки на временный именованный канал, а затем выполнить другую cat в текущей оболочке с ее stdin, перенаправленным в трубу.

Вместо этого cat <(cat) позволяет мне вводить мой терминал, но ни одна из входных строк не копируется, а ^D не может сигнализировать EOF ; cat | cat cat | cat работает, как ожидалось, хотя.

В качестве дополнительного эксперимента я проверил, имеет ли cat =(cat) аналогичные трудности, такие как cat <(cat) , но он работает так, как я ожидал: все stdin до ^D копируется в stdout за один раз.

Может ли кто-нибудь помочь мне понять, что делает zsh под капотом?

  • Проблема с пониманием привязок ключей
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Локальные переменные в zsh: что эквивалентно «export -n» bash в zsh
  • очистка вывода скрипта, так что он спускается, дает имена пакетов и чисто
  • Отображение ~ для $ HOME в приглашении zsh
  • Как управлять конфигурациями на нескольких компьютерах и оболочках?
  • Экран: текущий каталог в заголовке (не как заголовок)
  • Могу ли я ссылаться на команду перед '&&' после '&&'
  • One Solution collect form web for “В zsh разница между cat <(cat) и cat | cat против cat = (кошка)?”

    1. a | b a | b связывает STDOUT с a и STDIN с b , используя dup/dup2 . Обе команды выполняются параллельно.

    2. a =(b) заменяет аргумент на a временным именем файла. b будет выполняться до того, как будет создан временный файл, прежде чем он сможет быть передан в

    3. a <(b) заменяет аргумент a на именованный канал. a и b работают параллельно. Теперь это становится немного сложнее:

      b находится в фоновом режиме и не может считывать данные с терминала. Вы можете протестировать его самостоятельно, используя strace -p $PID для привязки ко второму процессу кошки, чтобы увидеть процесс.

      • в то же время пытается прочитать из именованного канала, но не может читать ничего, поскольку b не может читать.

      • Это означает, что у вас в основном есть тупик, где попытки чтения из b но b не могут читать из STDIN и не могут писать в

    Дополнительная информация о фоновом процессе и терминале от man bash :

    Чтобы облегчить реализацию пользовательского интерфейса для управления заданиями, операционная система поддерживает понятие текущего идентификатора группы процессов терминала . Члены этой группы процессов (процессы, идентификатор группы процессов которых равен текущему идентификатору группы терминальных процессов) получают сигналы с клавиатуры, такие как SIGINT . Эти процессы, как говорят, находятся на переднем плане . Фоновые процессы – это те, чей идентификатор группы процессов отличается от терминалов; такие процессы невосприимчивы к сигналам, генерируемым клавиатурой. Разрешено читать только процессы переднего плана или, если пользователь так задает stty tostop, пишите на терминал. Фоновые процессы, которые пытаются считывать (записывать, когда stty tostop действует), терминал посылает сигнал SIGTTIN (SIGTTOU) драйвером терминала ядра, который, если только он не задерживается, приостанавливает процесс.

    Linux и Unix - лучшая ОС в мире.