Come eseguire il debug e correggere il completamento automatico lento in bash?


26

Dopo un recente aggiornamento (Ubuntu 12.04 LTS), la TAB completa sulla riga di comando è lenta. Dopo aver inserito un comando parziale (ad es. evi [TAB]) O un nome di file parziale (ad es. evince somedocu[TAB]) La shell, a volte anche se non sempre, si blocca per alcuni secondi.

Personalmente, preferirei un completamento automatico meno potente a uno lento. C'è una soluzione semplice?

Modifica: informazioni aggiuntive relative ai commenti:

  • PATH è piuttosto standard. ~ / bin ha alcuni script bash

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
    
  • Il numero di file nella directory di lavoro è inferiore a 100.

  • La funzione di completamento automatico è stata particolarmente lenta dopo un'attività del disco insolita (aggiornamento del sistema). È quindi possibile che rileggere / usr / bin e altre directory abbiano causato il ritardo.

4
non è che abiliti la gestione della velocità del tuo disco rigido con l'aggiornamento e che il completamento automatico attende che il disco si riattivi per poter calcolare il completamento automatico?
Vincent Nivoliers,

2
Dipende da quanti file ci sono nella tua directory attuale?
terdon

1
Cosa dice # echo $ PATH? Se hai molte (diverse decine di migliaia o più) di file nelle directory nel tuo percorso, ciò potrebbe essere la causa.
Stephan,

Risposte:


28

Non so come riparare - ci sono tutti i tipi di cose che potrebbero causare ritardi. Ma posso offrire alcuni suggerimenti per indagare.

Proprio come un'ipotesi, forse c'è una directory da qualche parte in un percorso di ricerca ( $PATHo un posto in cui bash cerca i dati di completamento) che si trova su un filesystem che è lento a rispondere. Di solito sono file system remoti che sono lenti, ma potrebbe anche essere un disco rigido guasto, un driver FUSE bloccato, ecc.

Il primo passo da investigare è eseguire set -xper ottenere una traccia dei comandi che la shell esegue per generare i completamenti. Guarda dove si ferma.

Se ciò non fornisce abbastanza informazioni, porta le armi grosse. Nota l'ID del processo della shell ( echo $$). In un altro terminale, esegui strace -f -s9999 -p$$(o l'equivalente di strace se in esecuzione su un altro sapore unix). Strace elenca le chiamate di sistema eseguite dal processo. Vedi se sembra che acceda ai file che non dovrebbe, o se l'accesso ad alcuni file è lento. L'aggiunta dell'opzione -Talla straceriga di comando consente di mostrare il tempo impiegato in ciascuna chiamata di sistema.


1
La quantità di tempo che uso Unix e di cui non sapevo set -x, che bel comando. Molto "modalità hacker impegnata"
Matt Fletcher il

6
Ps, usa set +xper tornare alla normale modalità non di debug
Matt Fletcher

19

Se la tua * nix box è configurata come client LDAP, potresti avere questo problema, anche se hai effettuato l'accesso come utente locale.

Informazioni noiose sul debug: debug con set-x, ho trovato il completamento che era sospeso a:

> set -x
> ls foo<tab>
...                     <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]]      <--- froze here
+ [[ foo == ~* ]]       <--- actually causing the trouble

Conferma: ho confermato questo con ls ~*cui anche appeso. Si scopre che il mio server LDAP era lento, ma questo non dovrebbe influire su cose come il completamento bash e ls!

Soluzione: Aha, c'è un bug archiviato contro bash-completamento + ldap, verrà risolto in una versione più recente e una semplice patch se non si vuole aspettare. Il completamento della scheda è di nuovo veloce, evviva!

Ecco il file di patch nel caso in cui il link scompaia. Sta semplicemente sfuggendo a ~ sulle righe 545 e 547:

--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion  2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
     elif [[ $1 == \'* ]]; then
         # Leave out first character
         printf -v $2 %s "${1:1}"
-    elif [[ $1 == ~* ]]; then
+    elif [[ $1 == \~* ]]; then
         # avoid escaping first ~
-        printf -v $2 ~%q "${1:1}"
+        printf -v $2 \~%q "${1:1}"
     else
         printf -v $2 %q "$1"
     fi

È necessario uscire dalla sessione SSH corrente e accedere nuovamente per rendere effettiva questa patch.


1
Ho avuto questo esatto problema e la patch è buona
radman

2
Lo stesso problema qui (Debian 8.5) 2 1/3 anni prima e la soluzione funziona come un incantesimo. Debian 8.6 non ha il problema.
YoMismo,

2
Ho usato set -xa milioni di volte ma non mi sarei mai aspettato che mostrasse anche problemi di prestazioni di completamento, grazie mille!
Marc

Ho avuto questo problema con debian 9.8!
Philippe Gachoud,

0

Prova a reinstallare bash-completamento

sudo apt-get install --reinstall bash-completion

Per me questo è stato risolto in Ubuntu 18.04.3 LTS


0

Inoltre, alcune persone utilizzano funzionalità di completamento automatico extra come il completamento automatico di Git bash . La lentezza del completamento delle ciglia può essere il risultato del malfunzionamento di quelle funzioni di completamento automatico extra.

Nel mio caso era Git bash auto complete la mia chiave pubblica git era stata aggiornata, quindi stava facendo un tentativo di autenticazione fallito causando un blocco. Una volta rimosso il completamento automatico, è stato di nuovo veloce. Quindi la mia soluzione era quella di riparare la mia chiave e riattivarla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.