Eu quero ser capaz de gravar dados em um descritor de arquivo e depois lê-lo de volta no bash.
Isso se pareceria com:
# some line to create LOOPBACK_FD
echo foo >${LOOPBACK_FD}
cat <${LOOPBACK_FD}
# foo is printed
Eu sei que posso usar variáveis para armazenar a saída de comandos como em:
MYMESSAGE=$(echo foo)
echo ${MYMESSAGE}
memfd_create
faz algo parecido com o que eu quero, mas provavelmente haveria problemas com o deslocamento do arquivo e parece que o bash nem o usa.
Talvez haja um dispositivo especial que possa fazer isso?
Edit: Estou procurando uma solução que não exija a criação de um novo nó no sistema de arquivos.
Isso não funcionará - não importa como
LOOPBACK_FD
é criado ou aberto, ou se é acessível através do sistema de arquivos ou não.O
cat
continuará esperando por um EOF que não virá enquanto o script de chamada (que está esperando paracat
terminar) manterá a extremidade de escrita do pipe aberta.Algo que pode funcionar com exemplos simples (mas vai se deparar com deadlocks e problemas de buffer com qualquer coisa não trivial) está usando
read
em vez decat
obter apenas uma linha do pipe, sem tentar sugá-la inteira.Não há pipes "anônimos" no Linux; mesmo aqueles criados com a
pipe(2)
chamada do sistema ou com|
o shell são acessíveis via/proc/{pid}/fd/{fd}
ou/proc/self/fd/{fd}
; eles sempre " criarão " um novo nó no sistema de arquivos.Mas você pode usar esse recurso para abrir a extremidade de escrita de um tubo de entrada (ou vice-versa), o que pode resultar em uma resposta "inteligente" para o seu problema XY: