sabato 15 gennaio 2011

info: Impossibile trovare il nodo «Top». [Risolto]

Non so bene per quale motivo (ma ho l'impressione che sia colpa di un aggiornamento di Ubuntu) non sono più in grado di usare info. Come spiegai in uno dei primi post di questo blog, per consultare da terminale i manuali (se presenti) dei comandi si può usare man:
man nomecomando
In aggiunta a man, molti programmi (soprattutto del progetto GNU) forniscono una guida (spesso più completa del manuale consultabile con man) che può essere letta con info:
info nomecomando
In questi giorni, dando il comando (per esempio)
info coreutils
(per leggere la guida delle principale utilità di sistema, chiamate appunto coreutils) ricevo dal terminale questa risposta:
info: Impossibile trovare il nodo «Top».
Il messaggio in lingua inglese è il seguente:
info: Cannot find node `Top'.
Il problema è che per qualche motivo si è corrotto il file /usr/share/info/dir che contiene (o, nel mio caso, dovrebbe contenere) l'elenco dei manuali che possono essere consultati con info. Il mio file /usr/share/info/dir conteneva solo questo:
Questo è il file .../info/dir, che contiene il
nodo più in alto della gerarchia di Info, chiamata (dir)Top.
La prima volta che invochi il programma Info esso parte da questo nodo.
^_
File: dir, Node: Top\tQuesto è il nodo più alto dell'albero INFO

Questo (il nodo principale) fornisce un menù che contiene le voci principali.
Digitando "q" esce, digitando "?" si produce un elenco di tutti i comandi Info,
"d" ritorna alla presente schermata, "h" fornisce informazioni ai nuovi utenti,
"mEmacs<return>" visualizza il manuale di Emacs, ecc.
All'interno di Emacs, puoi cliccare con il pulsante sinistro del mouse su una voce di menù
o su un riferimento incrociato per selezionarlo.

* Menu:
Come vedete, manca l'elenco dei manuali disponibili, che invece dovrebbe essere presente dopo la riga * Menu:.

Per risolvere il problema si può cancellare il file incriminato e rigenerarlo con il comando da terminale install-info (in Debian, Ubuntu e derivate bisogna richiamare il comando con ginstall-info). install-info accetta come primo argomento il file (in genere questi file hanno estensione .info e potrebbero essere compressi con gzip) che contiene il manuale che si vuole aggiungere all'elenco (questi file in genere si trovano nella cartella /usr/share/info/ e sue sottocartelle), come secondo argomento il file di elenco (cioè /usr/share/info/dir). Queste due operazioni possono essere automatizzate con i due seguenti comandi (richiedono i diritti di amministratore perché si modificherà un file di sistema):
sudo mv /usr/share/info/dir ~/dir
for file in /usr/share/info/*.{gz,info} /usr/share/info/*/*.{gz,info}; do sudo install-info "$file" /usr/share/info/dir; done
Se usate sistemi, come Debian o Ubuntu, che richiedono ginstall-info al posto di install-info, il secondo dei comandi precedenti va cambiato in
for file in /usr/share/info/*.{gz,info} /usr/share/info/*/*.{gz,info}; do sudo ginstall-info "$file" /usr/share/info/dir ; done
Breve spiegazione dei comandi consigliati: il primo comando (mv) serve per spostare il file nella propria home, conservando una copia di sicurezza (anche se il file è corrotto non fa male creare una copia, dopo aver risolto il problema la copia può essere tranquillamente cancellata); il secondo esegue un ciclo for su tutti i file con estensioni .gz o .info presenti nella cartella /usr/share/info sue sottocartelle. Se in questo modo non dovessero essere inclusi alcuni file di manuali, potete farlo manualmente tramite install-info (o ginstall-info) con la sintassi esposta precedentemente.

Aggiornamento importante: dopo il commento di Zio LoneWolf (che ringrazio) mi sono accorto che la questione era più complicata di quanto mi sembrasse inizialmente. Per risolvere il problema non è affatto sufficiente usare i comandi presentati in precedenza perché pare che sia presente un bug nella traduzione italiana di Texinfo. Si può aggirare (e questa volta per davvero) il problema impostando nella shell la lingua inglese e poi utilizzando nuovamente i comandi precedenti:
LANG=en_US.UTF-8
for file in /usr/share/info/*.{gz,info} /usr/share/info/*/*.{gz,info}; do sudo install-info "$file" /usr/share/info/dir; done
oppure
LANG=en_US.UTF-8
for file in /usr/share/info/*.{gz,info} /usr/share/info/*/*.{gz,info}; do sudo ginstall-info "$file" /usr/share/info/dir; done
L'aggiornamento del file /usr/share/info/dir può anche essere fatto con il comando update-info-dir (dato come al solito con privilegi di amministratore). Si può fare in modo che questo script utilizzi sempre la lingua inglese senza doverla impostare manualmente ogni volta. Aprite con il vostro editor di testo preferito (e con i diritti di amministratore) lo script /usr/sbin/update-info-dir. Per esempio con gedit si userà:
gksudo gedit /usr/sbin/update-info-dir
A questo punto inserite la stringa
unset LANG # https://bugs.launchpad.net/ubuntu/+source/texinfo/+bug/707931
(nel commento c'è un riferimento alla segnalazione del bug su Launchpad) per esempio dopo il rigo
unset LANGUAGE
Dopo di ciò sarà possibile aggiornare il file /usr/share/info/dir semplicemente con il comando
sudo update-info-dir
Altro aggiornamento: Giovanni segnala nei commenti che ha realizzato uno script per risolvere automaticamente il problema. Trovate lo script e le istruzioni per l'uso sul sito sito: http://www.ubaweb.it/miniguide/info_non_va.php.

20 commenti:

  1. Purtroppo sul mio Ubuntu 10.10 non ha funzionato: ginstall-info mi genera sempre un file troncato, come quello che mostri nel post.

    Ho risolto così: dato che che nella directory /usr/share/info c'era un dir.old che funzionava se copiato sopra dir, l'ho svuotato cancellando tutto ciò che seguiva la riga "* Menu:" ed ho poi lanciato il ciclo for che suggerivi.

    Il problema potrebbe consistere nel fatto che la sequenza che appare nel file dir come "^_" in realtà non è una sequenza, ma un carattere di controllo, che per via di un bug ginstall-info non ricrea come carattere di controllo ma come sequenza, col risultato che info non la trova. Invece, se è già presente nel file ginstall-info apparentemente si comporta bene.

    In termini procedurali, per rigenerare /usr/share/info/dir ho dato i seguenti comandi:

    sudo -i
    head -15 /usr/share/info/dir.old > /usr/share/info/dir
    for file in /usr/share/info/*.{gz,info} /usr/share/info/*/*.{gz,info}; do ginstall-info "$file" /usr/share/info/dir ; done
    exit


    Ora info è a posto.

    Grazie per la soluzione.

    RispondiElimina
  2. Anche a me non veniva ricreato correttamente il file `dir' se mantenevo la vecchia versione, per questo l'ho rimossa. In realtà nella guida suggerisco di rinominarla per salvare una copia di backup (inutile visto che info non funziona con quel file dir), l'importante era cancellarlo. Comunque grazie per aver condiviso la tua soluzione :)

    Ciao!

    RispondiElimina
  3. Grazie per queste preziose informazioni. Basandomi su queste ho realizzato un piccolo script per semplificare la risoluzione al problema di info.
    Le istruzioni e il file da scaricare si trovano all'indirizzo:http://www.ubaweb.it/miniguide/info_non_va.php.
    Buon Linux a tutti

    RispondiElimina
  4. Salve, informo che ho modificato lo script, (vedi sopra) ora consente la scelta di una procedura completamente automatica o volendo, anche il metodo manuale.
    Il link è nel commento precedente.
    Spero sia utile a qualcuno.
    Ciao! 8-)

    RispondiElimina
    Risposte
    1. bravo Giovanni! :D risolto in 2 sec, grazie!
      Buon Linux

      Elimina
  5. @Giovanni: grazie per la segnalazione. Ho aggiunto un link al tuo sito nel post.

    Ciao!

    RispondiElimina
  6. salve
    che dire, grazie mille

    augurandoTi un felice Anno

    un bacio

    Erika

    RispondiElimina
  7. @Erika: sono felice di essere stato utile.

    Ciao e tanti auguri anche a te :-)

    RispondiElimina
  8. Copiato lo script, reso eseguibile, lanciato da root...funziona tutto alla perfezione, grazie a Giovanni.
    Un solo piccolo appunto, quando la procedura termina si potrebbe automatizzare l'uscita al prompt di bash invece che dover premere CTRL-C, che dite?
    Grazie di nuovo e ciao
    Simone

    RispondiElimina
  9. Se non fosse sufficiente (io ho la ubuntu 11.10 e non va...), fate:
    sudo gedit /usr/sbin/update-info-dir
    eliminate le righe UNSET e mettete al loro posto:
    export LC_ALL=POSIX
    poi rilanciate con: sudo /usr/sbin/update-info-dir

    ciampix

    RispondiElimina
    Risposte
    1. Per te non è sufficiente la riga `unset LANG'?

      Comunque, come ho segnalato qui, ho suggerito su Launchpad una nuova traduzione italiana del messaggio incriminato che dovrebbe correggere il problema, chissà se verrà mai accettata.

      Ciao

      Elimina
    2. Grandissimo ciampix.
      A me (con Ubuntu 11.10) funziona togliendo
      unset LANG
      e aggiungendo
      export LC_ALL=POSIX

      (nota: avendo fatto delle prove, funziona grazie a "export LC_ALL=POSIX" togliendo o mettendo "unset LANG" non cambia nulla. Mentre se non c'è "export LC_ALL=POSIX" non funziona)

      Grazie,

      Cristian

      Elimina
  10. Sei un dio. Erano più di 2 settimane che mi perdevo tra milioni di entry inutili di ubuntuforums

    RispondiElimina
    Risposte
    1. È un problema legato solo alla traduzione in italiano di un messaggio del pacchetto texinfo di Ubuntu (nelle altre distribuzioni forse non esiste neanche la traduzione italiana di questo pacchetto), probabilmente questo è il motivo per il quale su ubuntuforums (che non penso sia molto frequentato dagli italiani) non sei riuscito a trovare la soluzione ;-)

      Ciao!

      Elimina
    2. ottimo post grazie! Risolto in 1 minuto :D
      Linux Rocks!
      :D

      Elimina
  11. Ossignùr... ad oggi non lo hanno ancora sistemato, nemmeno in Debian. Significa forse che info non lo usa più nessuno?

    RispondiElimina
    Risposte
    1. Inizio a pensare anche io che nessuno usi più le info. La cosa un po' assurda è che la soluzione esiste e, in particolare su Launchpad, è stata spiegata più volte, ma sembra che proprio non riesca a trovare la strada per essere applicata. Mah

      Elimina
  12. Finalmente! su Ubuntu 14.04 sembra che il bug sia stato eliminato...anni per risolvere una bischerata di questo genere!
    Meglio tardi che mai.
    Ciaux

    RispondiElimina

I commenti inseriti vengono lasciati dall'autore degli stessi accettandone ogni eventuale responsabilità civile e penale.
Il curatore del blog si riserva la possibilità di eliminare messaggi contenenti frasi offensive o spam.