Sie haben einen Fehler in der von Ubuntu verwendeten Bash Completion- Bibliothek gefunden.
Was bedeutet das?
Ubuntu verwendet eine Bash-Vervollständigungsbibliothek, um die Bash-Vervollständigung intelligent zu gestalten. Diese Bibliothek lebt in /usr/share/bash-completion/bash_completion
.
Im Wesentlichen werden in dieser Bibliothek einige clevere Funktionen deklariert, die typische Befehle kennen und wissen, wie sie ausgeführt werden. Jedes Mal Tab, wenn Sie drücken , werden Funktionen in dieser Bibliothek aufgerufen und versuchen, Ihre aktuelle Befehlszeile zu vervollständigen. Wenn Sie zum Beispiel Folgendes eingeben apt-get i
Tab, wird dies zu vervollständigen apt-get install
. Wenn Sie diese Bibliothek nicht als Quelle verwenden, haben Sie nur die standardmäßige, primitive Bash-Vervollständigung. Wenn Sie also beispielsweise ohne Quellenangabe apt-get i
Tabeingeben, sucht Bash einfach nach Dateien im aktuellen Verzeichnis, beginnend mit i
und versucht, Ihren Befehl entsprechend zu vervollständigen diese Dateinamen.
Warum passiert es nicht als root?
Denn wenn Sie es verwenden sudo su
, um sich selbst zu machen root
, wird die Bash-Vervollständigungsbibliothek nicht bezogen. Das wäre anders, wenn du es sudo -i
selbst gemacht hättest root
. Ich wette, du siehst den Fehler dann, nicht wahr? Siehe zum Beispiel 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - wann spielt es eine Rolle, welche verwendet wird, oder spielt es überhaupt eine Rolle? wenn Sie mit den Unterschieden nicht vertraut sind.
In meinem Fall als normaler Benutzer, wird die Bibliothek stammen , als ich ein Bash - Shell , weil starten ~/.bashrc
Quellen /etc/bash_completion
welchen Quellen /usr/share/bash-completion/bash_completion
.
Wenn ich mich sudo -i
als anmelde root
, wird die Bibliothek bezogen, weil /etc/profile
Quellen /etc/profile.d/bash_completion.sh
welche Quellen /usr/share/bash-completion/bash_completion
.
Warum passiert dieser Fehler?
Versuchen Sie diesen Befehl auszuführen:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Kommt mir bekannt vor? ;-) Genau das passierte hinter den Kulissen, als Sie Tabin dem von Ihnen beschriebenen Kontext trafen . Genauer gesagt ist der Fehler in der von _quote_readline_by_ref
deklarierten Funktion /usr/share/bash-completion/bash_completion
. Wenn Sie diese Datei bezogen haben, sollten Sie diese Funktion zur Verfügung haben. Also versuche es als nächstes so:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Mit diesen Argumenten _quote_readline_by_ref
erfüllt die Funktion unter anderem die eval
oben genannten Aufgaben . Sie können nachsehen, wenn Sie möchten. Und als Sie tippten env $(cat env.
Tab, wurde diese Funktion hinter den Kulissen mit genau diesen Argumenten aufgerufen. Das ist also passiert.
Dieser eval
Hack sollte ein anderes Problem beheben , aber ich denke, er hat diesen anderen Fehler in den Prozess eingebracht.
Wie behebe ich das?
Es stellt sich heraus, dass dieser Fehler bereits gemeldet wurde . Nachdem ich diesen Fehlerbericht gelesen habe, sehe ich drei Möglichkeiten, ihn zu beheben:
Patch it: In einem der Kommentare in diesem Fehlerbericht schlägt jemand vor, die Zeile zu ersetzen
[[ ${!2} == \$* ]] && eval $2=${!2}
innerhalb der Funktion _quote_readline_by_ref
in der Datei /usr/share/bash-completion/bash_completion
durch die Zeile
[[ ${!2} == \$\'* ]] && eval $2=${!2}
Ich empfehle dagegen. Die Person, die diesen Kommentar geschrieben hat, scheint kein Entwickler der Bash-Vervollständigung zu sein . Dieser Hotfix bewirkt einfach, dass der linke Operand der Anweisung als falsch ausgewertet wird, und verhindert so, dass dies eval
geschieht. Ohne ein gutes Wissen darüber, was diese Funktion tun soll und in welchem Kontext sie aufgerufen wird, ist jedoch unklar, ob dies möglicherweise eine andere beabsichtigte Funktionalität beeinträchtigt.
Holen Sie sich die neueste Version: Wie auch in diesem Fehlerbericht erwähnt, ist dieser Fehler in git head nicht vorhanden (wobei unter anderem die Funktion _quote_readline_by_ref
vereinfacht wurde). Sie können einfach die aktuelle Version von Git klonen:
git clone https://salsa.debian.org/debian/bash-completion.git
... und kopieren Sie dann die neueste Version des bash_completion
Skripts nach /usr/share/bash-completion
(es ist nicht dringend erforderlich, die alte Version zu sichern, es sei denn, Sie fühlen sich sicherer - wenn Sie auf Probleme sudo apt-get install --reinstall bash-completion
stoßen , sollten Sie die von Ihnen vorgenommenen Änderungen rückgängig machen.) So verhalte ich mich empfehlen, wenn Sie es eilig haben, dies zu beheben. :-)
Beachten Sie, dass keine dieser Lösungen die Bash-Vervollständigung innerhalb der Befehlsersetzung bewirkt: Wie im selben Fehlerbericht erwähnt, ist dies in Bash 4.3 nicht möglich.
- Lehnen Sie sich zurück und warten Sie: Früher oder später wird eine neue Version veröffentlicht (die möglicherweise sogar die Bash-Vervollständigung innerhalb der Befehlsersetzung behebt) und Sie werden sie mit einer zukünftigen Ubuntu-Version erhalten. Dafür gehe ich ;-)