tsort: -: 入力に奇数個のトークンが含まれています。

tsort: -: 入力に奇数個のトークンが含まれています。

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ため、bandもペアに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 eb<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」(有向グラフであるため、順番に)を意味し、ここに示されている特定のケースでは「依存ABを意味します(後者は前の項目に依存するため、以前に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

奇数のノードが含まれているため、ペアのリストとして読み取ることができないということです。

関連情報