
Estou escrevendo um aplicativo C++ e preciso trabalhar com substituição de processos no shell Bash.
Estou tentando encontrar uma maneira de validar os caminhos passados como argumentos para o meu programa, alguns dos quais apontam para arquivos FIFO criados por substituição de processo.
Existe uma maneira de shell (ou C++) que eu possa verificar se o sistema cria esses arquivos /dev/fd
ou se eles são criados em outro lugar?
Responder1
A resposta curta é que você não pode fazer isso. Só porque um diretório é o padrão do bash para colocar caminhos fifo, não significa que um fifo específico nesse diretório foi criado pelo bash ou que foi passado pelo bash como um argumento para o seu comando.
Dê uma olhada no panorama geral do seu problema. O que você REALMENTE está tentando resolver?
Se você está tentando resolver, "a saída do meu programa deve sempre ser canalizada para outro programa", então não exija que o usuário use a obscura substituição de processo do bash. E se o shell padrão do sistema for zsh? Concha Bourne? Concha Korn?
Em vez disso, faça com que seu programa crie um canal, bifurque e execute o outro programa.
Então, o que você está realmente tentando fazer? O que acontece se você, Deus me livre, gravar sua saída em um arquivo que o usuário do seu programa passou, em vez de em um fifo criado pelo bash?
Responder2
Use a -p
opção test
se um arquivo for um canal:
#!/bin/bash
file="$1"
if [ -p "$file" ]
then
echo "$file is a pipe"
fi
Demonstração:
$ myscript.sh <(echo hello)
/dev/fd/63 is a pipe