Aqui está o meu caso de uso: o utilitário de linha de comando melt
pode aceitar um nome de arquivo, com a extensão .melt
na linha de comando, e abri-lo; Por exemplo, este é um arquivo test_p.melt
adequado:
colour:blue
out=24
colour:red
out=48
... que é aberto e reproduzido com melt test_p.melt
.
Agora, a questão é que .melt
arquivos não suportam comentários, o que eu gostaria que eles fizessem (você receberá mensagens de erro para qualquer linha que contenha um argumento não analisável, incluindo aqueles com, digamos, #
) . Então, aqui está um arquivo test_c.melt
comentado:
# master comment here
colour:blue # this is blue!
out=24
colour:red
out=48
Abrir isso em melt
gera diretamente:
$ melt test_c.melt
Failed to load "# master comment here"
...
... e não há tela azul mostrada.
Então eu pensei - bem, eu posso colocar comentários de qualquer maneira , e então usar a substituição do processo Bash para filtrar o arquivo com sed
, e simplesmente fornecer isso ao aplicativo melt
. Primeiro, tentei um teste com cat
, o que é bem sucedido:
$ cat <(sed 's/#.*$//' test_c.melt)
colour:blue
out=24
colour:red
out=48
... parece bom; mas , se eu tentar isso com melt
, ele verá meus truques:
$ melt <(sed 's/#.*$//' test_c.melt)
Failed to load "/dev/fd/62"
Failed to load "/dev/fd/62"
Basicamente, o derretimento recebeu o nome do arquivo do cachimbo fornecido pelo Bash para a substituição do processo - mas, infelizmente, o que melt
faz é que ele processa argv[i]
diretamente; e no caso de um arquivo, ele precisa ver uma extensão .melt
no nome do arquivo; se isso não acontecer, o processo falhará.
Então, minha pergunta é: como eu poderia usar a substituição de processos - então o nome do arquivo do pipe tem uma extensão específica, neste caso .melt
? Basicamente, como resultado da substituição, eu quero um nome de arquivo pipe de /dev/fd/62.melt
, que eu acho que vai passar.
NB: claro, sempre posso fazer:
sed 's/#.*$//' test_c.melt > test_c_temp.melt
melt test_c_temp.melt
... mas primeiro, há dois comandos aqui - e eu quero um duto de uma linha; e para outro, isso abre outro problema para mim, pensando em remover arquivos temporários depois, o que eu não gosto.
Isso é possível com a substituição do processo Bash - ou de alguma forma com as ferramentas padrão do Linux?