Como passar o pseudo-arquivo ao programa filho?

1

Estou usando o Cygwin - não, ainda não feche - e estou tendo problemas com a sintaxe <() . Um programa se recusa a aceitar o descritor de arquivo que estou passando, mas outros programas o aceitarão bem. Minha hipótese é que o programa está passando o descritor de arquivo para um de seus programas auxiliares, que então não recebe o canal (apenas o usual 0 , 1 e 2 , dos quais 0 e 2 provavelmente estão fechados). Isso funciona bem com cat , mas não com este programa.

MCVE:

./jpegtran -copy all -drop +16+16 <(echo "JPEG FILE") -outfile out.jpeg out.jpeg

Isso produz a mensagem de erro:

C:\path\to\jpegtran.exe: can't open /dev/fd/63 for reading

Existe uma maneira de fazer isso? Ou vou ter que recorrer a ... arquivos temporários ? * shudder *

Até onde eu sei, o Cygwin simula um ambiente POSIX para todos os efeitos. Se não for possível criar um pseudo-arquivo usando pipes nomeados (algo que eu sei é possível usando a API do Windows em //./pipe/pipename , que deve ser manipulado usando o nome-reescrita que está sendo usado atualmente para quando eu passar um Windows programar um /cygdrive/c/ caminho), então estou feliz com as respostas que irão funcionar em uma caixa 'nix' real.

    
por wizzwizz4 13.11.2017 / 20:09

1 resposta

1

Observação: Depois de muito tempo, foi determinado que o OP está usando uma versão não padrão de jpegtran que suporta "cortar e soltar" (copiar uma parte de uma imagem em outra imagem ).

Então, por que o processo de substituição (também conhecido como PS) não funciona com esse recurso? Baixo de olhar para o código, não podemos dizer com absoluto, 100% de confiança, mas há uma explicação muito provável. O PS cria um arquivo especial que é efetivamente um canal somente leitura do qual os dados são acessados de maneira contínua. Ao usá-lo, você não pode, é claro, gravar no arquivo e, mais importante, não pode procurá-lo ( acesso aleatório). Tente usar o PS com qualquer ferramenta que você possa imaginar que não use um modelo de streaming (vim é um exemplo). Você ficará restrito ao que pode fazer ou simplesmente não funcionará.

Dado que para este recurso jpegtran está extraindo um subconjunto retangular da imagem de origem (JPEG), parece altamente improvável que quem implementou o recurso impusesse uma restrição em si que restringisse o acesso ao fluxo unidirecional. Retirar uma parte de uma imagem é claramente uma operação em que a busca seria muito útil, se não obrigatória. Como tal, o PS não é permitido.

    
por 15.11.2017 / 21:59