coreutils マニュアルによると
tsortは、入力をスペースで区切られた文字列のペアとして読み取り、部分ソートを表します。出力は、指定された部分ソートに対応するフルソートです。例えば
tsort <<EOF a b c d e f b c d e EOF
出力を生成します
a b c d e f
「tsortが入力を文字列のペアとして読み取る」とは何を意味し、入力の要件は何ですか?この例では、最初の行a b c
自体は意味がありませんが、andがペアであるa
ため、b
andもペアにc
なりますd
。
なぜこれがうまくいかないのですか?
$ tsort <<EOF
> a b c
> b c d e
> EOF
tsort: -: input contains an odd number of tokens
答え1
はい、tsortはスペース(新しい行を含む)で区切られたペアで入力を読み取ります。
したがって、tsort文書の例は次のとおりです。
tsort <<EOF
a b c
d
e f
b c d e
EOF
次の整列ペアを定義します。
- a < b
- c<d
- 電子<f
- b<c
- d <電子
これらを合わせると a < b < c < d < e < f のソートになり、この場合は完全なソートになります。
ソースコードを読むと、tsortが使用していることが確認されました。gnulibのreadtoken()区切り記号のセットを含みます。スペース、タブ、改行つまり空白です。
(対応するtsortの例の私の最初の説明は次のとおりです。その他の質問、行はb c d e
b<c、c<d、d<e の 3 つの暗黙のペアを生成しますが、そうではなく、すべてのスペースは改行を含めて同じように解釈され、一度に 1 ペアずつ読み取られます。 )
答え2
tsort
有向グラフのトポロジー整列グラフをノードペアとして取得します。これはグラフの部分的な整列を構成し、tsort
結果として完全な整列を提供する。ただし、グラフの完全な整列が複数ある場合があります。BSDシステムの-f
オプションとオプションの文書化-h
(AFAIKはGNUシステムでは利用できません)。
shells/bash
実際のチャートの例(OpenBSDシステムでパッケージを構築するために必要な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
A B
このリストのペアは「にリンクさA
れているB
」(有向グラフであるため、順番に)を意味し、ここに示されている特定のケースでは「依存A
」B
を意味します(後者は前の項目に依存するため、以前にconverters/libiconv
ビルドする必要があります)。devel/gettext
)。
tsort
ノードペアの部分順序を取得し、部分順序と互換性のある完全な順序のノードのリストを返します。
$ make -C /usr/ports/shells/bash build-dir-depends | tsort -r
devel/ccache
archivers/xz
converters/libiconv
devel/gettext
shells/bash
tsort
ここでは、結果の順序を変更するように指示します(GNUシステムでは不可能です-r
。これはGNUのオプションではないためですtsort
)。これは、私のシステムがパッケージ間の依存関係を尊重しながらパッケージを構築するために必要な順序を提供します(最終的に最終パッケージを構築します)。shells/bash
パッケージ)。
tsort
入力ラインを取得すると
a b c d
だからこれは
a b
c d
そして
a b c
d
つまり、常にグラフのノードを読みます。右、スペースまたは改行で区切られているかどうか。データに問題があります。
a b c
b c d e
奇数のノードが含まれているため、ペアのリストとして読み取ることができないということです。