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
자체는 의미가 없지만 a
and가 b
쌍을 이루므로 c
and도 쌍을 이룹니다 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의 세 가지 암시적 쌍을 생성하지만, 그렇지 않고 모든 공백은 개행을 포함하여 동일하게 해석되며 한 번에 한 쌍씩 읽혀집니다. )
답변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
홀수 개의 노드가 포함되어 있기 때문에 쌍의 목록으로 읽을 수 없다는 것입니다.