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자체는 의미가 없지만 aand가 b쌍을 이루므로 cand도 쌍을 이룹니다 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의 세 가지 암시적 쌍을 생성하지만, 그렇지 않고 모든 공백은 개행을 포함하여 동일하게 해석되며 한 번에 한 쌍씩 읽혀집니다. )

답변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

홀수 개의 노드가 포함되어 있기 때문에 쌍의 목록으로 읽을 수 없다는 것입니다.

관련 정보