Clustersh: 창이 알파벳순으로 정렬되는 것을 방지합니다.

Clustersh: 창이 알파벳순으로 정렬되는 것을 방지합니다.

cssh저는 Debian 10(패키지) 을 사용하고 있습니다 clusterssh 4.13.2-2.

여러 서버에 연결할 때:

cssh foo bar zz aa

cssh는 4개의 터미널을 열고알파벳순으로! 이렇게 하면 다음과 같이 화면의 창 순서를 지정할 수 있습니다.

aa   bar
foo  zz

이것은 순수한 악입니다!

창을 원래 순서대로 유지하려면 어떻게 해야 합니까? Perl 코드에 몇 가지 빠른 수정 사항이 있습니까?

답변1

근사치를 살펴보면원천@servers, 주어진 순서대로 원래 호스트 이름 매개변수를 보유하는 것으로 보이는 배열 과 %servers호스트 이름에서 파생된 키로 색인화된 모든 호스트별 정보를 보유하는 해시(정렬되지 않은 사전)가 있음을 알 수 있습니다.

존재하다클라이언트 창 열기, 순서가 지정된 이름 배열로 호출되는 것으로 보이며 여기서 각 %servers항목을 생성합니다.

에서는 retile_hosts()주어진 순서대로 창이 열리고 $sort->( keys(%servers) )코드는 다음으로 시작합니다.여기, 따라서 표시되는 순서입니다.

따라서 가능한 해결책은 추가 필드에서 각 서버 항목이 생성된 순서를 유지한 다음 $sort키 대신 해당 값을 기준으로 정렬되도록 기능을 변경하는 것입니다. (키를 변경하는 것이 더 간단하지만 많이 사용되며 알 수 없는 결과가 발생할 수 있습니다.)

다음 패치는 내 Fedora 28 버전에서 작동합니다. ClusterSSH.pm배포 버전에 대해 이 설정을 변경해야 할 수도 있습니다.

--- usr/share/perl5/vendor_perl/App/ClusterSSH.pm.orig  2022-08-24 10:47:57.937143651 +0200
+++ usr/share/perl5/vendor_perl/App/ClusterSSH.pm   2022-08-24 11:32:43.637808164 +0200
@@ -116,9 +116,12 @@
 my $host_menu_static_items;    # number of items in the host menu that should
                                # not be touched by build_host_menu
 my (@dead_hosts);              # list of hosts whose sessions are now closed
-my $sort = sub { sort @_ };   # reference to our sort function which may later
+#my $sort = sub { sort @_ };   # reference to our sort function which may later
                               # be changed in run() if the user has asked for
                               # natural sorting
+# sort using original order of cli args 
+# https://unix.stackexchange.com/a/714683/119298
+my $sort = sub { sort {$servers{$a}{order} <=> $servers{$b}{order}} @_ };
 
 $keysymtocode{unknown_sym} = 0xFFFFFF;    # put in a default "unknown" entry
 $keysymtocode{EuroSign}
@@ -667,6 +670,8 @@
     #$xdisplay->flush(); # dont flush here, but after all tiling worked out
 }
 
+# sort using original order of cli args
+my $globalorder;
 sub open_client_windows(@) {
     my $self = shift;
     foreach (@_) {
@@ -727,6 +732,8 @@
         $servers{$server}{port}           = $port || '';
         $servers{$server}{master}         = $self->config->{mstr} || '';
         $servers{$server}{master}         = $master if ($master);
+        # sort using original order of cli args
+        $servers{$server}{order}          = ++$globalorder;
 
         $self->debug( 2, "Working on server $server for $_" );
 
 

관련 정보