Digamos que eu tenha um comando foo
que leva um argumento filename: foo myfile.txt
. Irritantemente, foo
não lê da entrada padrão. Em vez de um arquivo real, eu gostaria de passar o resultado de outro comando (na realidade pv
, que irá capturar o arquivo e gerar um medidor de progresso como efeito colateral).
Existe uma maneira de fazer isso acontecer? Nada na minha mochila parece fazer isso.
( foo
neste caso, é um script PHP que, acredito, processa o arquivo sequencialmente).
Estou usando o Ubuntu e o Bash
EDITAR Desculpe a descrição do problema pouco clara, mas aqui está a resposta que faz o que eu quero:
pv longfile.txt | foo /dev/stdin
Muito óbvio agora que eu vejo.
Respostas:
Se eu entendo o que você deseja fazer corretamente, você pode fazê-lo com o recurso de substituição de comando do bash:
Isso faz algo semelhante ao que as
mkfifo
respostas baseadas sugerem, exceto que o bash lida com os detalhes para você (e acaba passando algo como / dev / fd / 63 para o comando, em vez de um pipe nomeado comum). Você também pode fazer isso de maneira ainda mais direta assim:fonte
pv inputfile.txt | foo /dev/stdin
exatamente isso que eu estava procurando, mas não pensei nisso.<(.)
trabalhou para mim. Essa sintaxe está documentada no manual do Bash? Entendo(.)
que a substituição de comandos está documentada, mas não vi sua combinação com<
explicada.mkfifo
.fonte
Esta pergunta do Unix SE tem uma resposta que mostra como criar um pipe nomeado temporário:
Shell Script mktemp, qual é o melhor método para criar pipe nomeado temporário?
Com base nas respostas, você pode fazer algo como o seguinte:
Você poderia assistir o tubo com:
Em seguida, exclua-o quando terminar.
fonte
Tente usar o mkfifo.
Em outro shell, execute foo file_read_by_foo
fonte
xargs
parece funcionar bem para isso:fonte
pv
várias vezes, cada uma com uma ou mais linhas desenhadaslongfile.txt
. Não é o que eu estou procurando aqui.