В libc есть возможность создать (анонимный) канал:
https://man7.org/linux/man-pages/man2/pipe.2.html
Мне известно о mkfifo в bash и подобных оболочках, а также я знаю о |, который позволяет осуществлять анонимную передачу данных между стандартным выводом одного процесса и стандартным вводом другого процесса. Согласно данному ответу, также происходит подмена процесса. Но это не совсем та же функциональность, что и pipe(), который предоставляет файловый дескриптор для каждого конца канала, который можно использовать позже или передать другим процессам.
Мне было интересно, существует ли тривиальный эквивалент pipe, о котором я не знаю?
Возможно, вас заинтересуют перенаправления exec, которых в большинстве оболочек может быть до 9, а при использовании нотации {nn} и того больше. Лучшее, что я смог найти здесь, это stackoverflow.com/q/25535036/620097 , но ключом к эффективному поиску был [bash] exec "1>&3" -find -(other annoying keywords) . Удачи.





Вы можете создать анонимный канал, используя подстановку процесса
Например, это будет перебирать все файлы .sh в текущем каталоге:
while IFS= read -r -d '' file
do
: # do stuff
done < <(find . -name '*.sh' -print0)
Другой пример: отправить весь вывод в регистратор.
loggerForStdout()
{
echo "loggerForStdout started"
local x # only in this block
while IFS= read -r x
do
printf "%(%T)T - loggerForStdout - '%s'\n" -1 "${x}"
done
echo "loggerForStdout ended"
}
exec > >(loggerForStdout)
echo "TEST" # this will display "<date> - loggerForStdout - 'TEST'"
Это хороший ответ, но он на самом деле не делает того же, что и pipe(), который предоставляет пару файловых дескрипторов (один для чтения, другой для записи) для дальнейшего использования. например передавая их в программу. Я изменю свой вопрос, чтобы его было легче определить как проблему.
@philip-adler ты прав, я это пропустил! Вы можете попробовать bash coproc. Я не буду приводить вам никаких примеров, поскольку не знаю гораздо большего, чем он существует.
Это определенно интересно и позволяет сделать что-то очень похожее в контексте запуска другого процесса.
В оболочке нет эквивалента pipe().
Наиболее близким к POSIX и обычно используемым является mktemp с mkfifo.
В Bash вы можете использовать coproc cat и ${COPROC[0]} и ${COPROC[1]} в качестве дескрипторов каналов. Обратите внимание, что одновременно можно запускать только один совместный процесс.
Вы также можете написать встроенную функцию bash, которая будет вызывать pipe() и устанавливать две переменные Bash.
Я отмечаю это как правильное, поскольку именно к такому выводу я пришел, учитывая полученные к настоящему времени ответы.
Bash сопроцессы могут делать то, что вы хотите. См. Как использовать команду coproc в различных оболочках?.