apt-show-versions exibe erro de "Uso de valor não inicializado ..."

0

Quando o Cron diário roda o apt-show-versions, o seguinte erro é exibido.

/etc/cron.daily/apt-show-versions:
Use of uninitialized value $value in substitution (s///) at /usr/bin/apt-show-versions line 586, <FILE> line 174.
Use of uninitialized value $value in substitution (s///) at /usr/bin/apt-show-versions line 587, <FILE> line 174.
Use of uninitialized value $value in substitution (s///) at /usr/bin/apt-show-versions line 586, <FILE> line 174.
Use of uninitialized value $value in substitution (s///) at /usr/bin/apt-show-versions line 587, <FILE> line 174.

Aqui está um trecho na área da linha 586:

551 sub parse_file {
552     my ($file, $status) = @_;
553     my ($key, $value, $package, $packages);
554 
555     my $release = &determine_pkgfile_release($file);
556     open FILE, $file or &die("Can't open file $file: $!\n");
557     if ($opts{'verbose'}) {print "Parsing $file...";};
558     while (<FILE>) {
559         if (/^$/){
560             unless (defined $package) {next};
561 
562             if ($status) { # Are we parsing the status file?
563                 # if we did not specify a package or pattern
564                 # only include installed packages
565                 unless ($mode == $MODE_ALL and
566                         ($package->{$STATUS} =~ /not-installed|config-files/ or
567                          # don't print holded packages if requested
568                          ($opts{'nohold'} and $package->{$STATUS} =~ /hold/))) {
569                     $packages->{$package->{$PACKAGE}}{$package->{$ARCH}} = $package;
570                 }
571             }
572             else {
573                 if (!defined $packages->{$package->{$PACKAGE}} or
574                     !defined $packages->{$package->{$PACKAGE}}{$package->{$ARCH}}{$VERS} or
575                     $vs->compare($packages->{$package->{$PACKAGE}}{$package->{$ARCH}}{$VERS},
576                          $package->{$VERS}) < 0) {
577                     $package->{$RELEASE} = $release;
578                     $packages->{$package->{$PACKAGE}}{$package->{$ARCH}} = $package;
579                 }
580             }
581             undef $package;
582             next;
583         }
584         unless ((/^Package/) || (/^Version/) || (/^Status/) || (/^Source/) || (/^Architecture/)) {next};
585         ($key, $value) = split /: /, $_;
586         $value =~ s/\n//;
587         $value =~ s/\s\(.*\)$//; # Remove any Version information in ()
588         $package->{$key} = $value;
589     }
590     if ($opts{'verbose'}) {print " completed.\n"};
591     close FILE;
592     return $packages, $release;
593 }
594 

Eu pesquisei e encontrei tópicos similares (mas diferentes) com soluções que não tenho certeza se funcionariam. Agradecemos antecipadamente pela ajuda.

EDIT Code from /var/lib/dpkg/status conforme solicitado de @meuh

162 Description: Micro string library: shared library
163 ustr (Micro string library) is a string API for C. It has tiny overhead over
164 just plain strdup(), is much safer, is easier to use, is faster for many
165 operations, can be used with read-only or automatically allocated data. You
166 don't even need to link to the library to use it (so there are no
167 dependencies).
168 .
169 This package contains the shared library for ustr.
170 Homepage: http://www.and.org/ustr/
171 Original-Maintainer: Vaclav Ovsik <[email protected]>
172
173 Package: libpam-winbind
174 Status: install ok installed
175 Priority: optional
176 Section: net
177 Installed-Size: 204
178 Maintainer: Ubuntu Developers <[email protected]>
179 Architecture: amd64
180 Multi-Arch: same
    
por wayside50 19.08.2015 / 15:57

2 respostas

0

No meu sistema, o comando está lendo o arquivo /var/lib/dpkg/status e este é aquele em que a linha 174 está em um formato inesperado.

O script perl apt-show-versions está esperando linhas que começam com as palavras-chave, como neste exemplo:

Package: x11vnc-data
Version: 0.9.13-1.1
Status: install ok installed
Source: x11vnc
Architecture: all

Essas palavras-chave têm : seguindo-as, mas em sua linha de erro, esse não é o caso, portanto, a instrução de script perl:

($key, $value) = split /: /, $_;

define o valor $ como undefined e assim a próxima instrução:

$value =~ s/\n//;

não pode fazer um substituto e gera uma mensagem de aviso. Eu não acho que isso vai quebrar nada. Depende de qual foi a palavra-chave.

Procure no /var/lib/dpkg/status o nome do pacote com falha, (linha começando com Package: e adicione-o e algumas linhas ao redor da linha de erro na postagem original.

    
por meuh 19.08.2015 / 18:11
0

Eu tive os mesmos erros. /usr/bin/apt-show-versions -iv mostrou os arquivos que estava analisando. No arquivo após os erros, descobri que continha :<tab> em vez de :<space> .

    
por Gustav Mogensen 18.01.2018 / 11:33