tsort
faz uma classificação topológica de um gráfico direcionado. Obtém o gráfico como pares de nós. Estes constituem uma ordenação parcial do gráfico e tsort
dá-lhe uma ordenação total como resultado (pode haver mais do que uma ordenação total do gráfico, ver a documentação para as opções -f
e -h
nos sistemas BSD (não disponível nos sistemas GNU AFAIK)).
Exemplo de um gráfico real (estes são os pacotes do OpenBSD necessários para construir o pacote shells/bash
em um sistema OpenBSD):
$ make -C /usr/ports/shells/bash build-dir-depends
shells/bash devel/ccache
shells/bash devel/gettext
devel/gettext devel/ccache
devel/gettext archivers/xz
archivers/xz devel/ccache
devel/gettext converters/libiconv
converters/libiconv devel/ccache
devel/gettext converters/libiconv
Um par, A B
, nesta lista significa " A
está conectado a B
" (nessa ordem, já que é um gráfico direcionado) e, no caso específico mostrado aqui, significa " A
depende de B
"( converters/libiconv
precisa ser construído antes de devel/gettext
porque o último depende do primeiro).
tsort
aceita a ordenação parcial de pares de nós e retorna uma lista de nós em uma ordem total compatível com essa ordenação parcial:
$ make -C /usr/ports/shells/bash build-dir-depends | tsort -r
devel/ccache
archivers/xz
converters/libiconv
devel/gettext
shells/bash
Aqui, instruímos tsort
a reverter a ordem resultante (não é possível em sistemas GNU, pois -r
não é uma opção para o GNU tsort
), o que me dá a ordem na qual o sistema precisa construir os pacotes e, ao mesmo tempo, honrar as dependências entre eles (terminando com a compilação final do pacote shells/bash
).
Se tsort
obtiver uma linha de entrada
a b c d
então isso é o mesmo que
a b
c d
e como
a b c
d
Ou seja, ele sempre lê os nós do gráfico em pares , independentemente de estarem separados por espaços ou novas linhas. O problema com seus dados,
a b c
b c d e
é que não pode ser lido como uma lista de pares, pois contém um número ímpar de nós.