Você não explica qual é o seu stdout e para onde vai! (Por exemplo, o stdout de um aplicativo CGI é direcionado para algum navegador).
A filosofia Unix e Unix pipelines quer stdin e stdout para ser texto simples, mas isso é apenas uma convenção . Em alguns casos, você pode ter outras convenções (por exemplo, lpr
ou lp
geralmente preferem PDF em stdin).
Se você estiver codificando algum programa, poderá torná-lo com algum modo (por exemplo, especificado por algum argumento de programa) para gerar um texto mais estruturado, como JSON ou XML ou CSV ou YAML . Observe que o jq pode processar o JSON.
Alguns programas detectam (usando isatty e / ou fstat ) quando o seu stdout (ou o seu stdin ) é um terminal e age de acordo (talvez usando ncurses , termios , ou códigos de escape ANSI .
Muitos formatos de texto (principalmente XML) têm caracteres iniciais ou cabeçalhos convencionais, portanto, em alguns casos, adivinhando-os (ou seja, descobrindo o formato de arquivo ) é possível. Veja também MIME e libmagic (e file(1) ).
I have a script that produces two different (unknown) strings and two different (unknown) numbers for each file it processes. Then there is another script that reads from STDIN to process each of the given strings, numbers. How can I format the output of the first script, so that the second can be made to identify each type correctly?
Se você sabe (e documenta) que as strings desconhecidas são boas o suficiente para não conter caracteres de controle como newlines (então cada uma é uma única linha) você pode decidir por algum formato como
FIRSTSTRING:
firststring
FIRSTNUMBER:
firstnumber
por exemplo
FIRSTSTRING: foo bar is nice!
FIRSTNUMBER: 42
escreva e use algum script simples de awk
(ou talvez use sed
) para seu segundo script
Em outras palavras, decida e documente um formato ad-hoc simples; no seu caso, o pode ser mais simples de manipular do que o JSON. Você pode ter suas próprias convenções ad-hoc desde que documente-as (talvez usando algumas notações de EBNF ).
Muitas ferramentas estão prontas; por exemplo, ps
, ls
, df
e ifconfig
têm formatos e convenções de saída ad-hoc, mas bem documentados. E também para proc (5) . Por isso, muitos scripts podem analisar essas saídas.
No entanto, o JSON foi projetado para ser simples, flexível, escalável, extensível, ... E é capaz de representar strings arbitrárias (mesmo com caracteres de controle, várias linhas, etc ...) . Se isso é importante para você, use-o.
Poder-se-ia reinventar e reimplementar todos os utilitários Unix para produzir, e. JSON ou XML (mas isso é um lote de trabalho). Por exemplo, algumas pessoas reinventaram proc (5) e faz um módulo do kernel para ter um sistema de arquivos /xmlproc/
pseudo em vez do /proc/
one que gerou dados do kernel do sistema em algum formato XML. Mas isso não foi bem sucedido! As convenções sociais são muito importantes (é por isso que é tão importante documentar seu formato de saída, pelo menos em um comentário longo).
(mesmo que você use JSON ou XML, você precisa documentar como você os usa)
BTW, muitas ferramentas existentes do Unix podem adicionar sutilezas em convenções. Por exemplo, um espaço ou uma tabulação ou um caractere de retorno em um caminho de arquivo é possível (veja path_resolution () 7) ), mas poderia ser desaprovado (então eu nunca faço isso). O diretório $HOME
de algum usuário poderia, em teoria, conter um caractere de retorno ou dois-pontos, mas se você fizesse isso, a maioria das ferramentas sofreria (e é provável que você quebre passwd (5) ...). Os caminhos de arquivo que começam com um traço não são amigáveis e, portanto, são caminhos muito longos (por exemplo, seu $HOME
pode ter 3000 caracteres em teoria, mas isso seria realmente imprudente).