it-swarm.com.de

Bash Tab Completion: '-bash: unerwartetes EOF beim Suchen nach passendem `)' -Bash: Syntaxfehler: unerwartetes Dateiende

Ich versuche, mit dem folgenden Befehl aus einer Datei in eine irb -Sitzung mit bestimmten Umgebungsvariablen zu wechseln:

$ env $(cat env.sh) irb

Wenn ich jedoch versuche, Tab zu drücken, nachdem ich env. eingegeben habe, um den Vorgang abzuschließen, wird die folgende Fehlermeldung angezeigt:

$ env $(cat env.-bash: unexpected EOF while looking for matching `)'
-bash: syntax error: unexpected end of file

Eine weitere interessante Sache ist, dass dieser Fehler nicht auftritt, wenn ich als root angemeldet bin.

Hier ist die Ausgabe von find ~ -uid 0:

$ find ~ -uid 0
/home/(redacted)/.rpmdb
/home/(redacted)/.rpmdb/Group
/home/(redacted)/.rpmdb/Conflictname
/home/(redacted)/.rpmdb/Installtid
/home/(redacted)/.rpmdb/Sha1header
/home/(redacted)/.rpmdb/Providename
/home/(redacted)/.rpmdb/__db.002
/home/(redacted)/.rpmdb/Requirename
/home/(redacted)/.rpmdb/Sigmd5
/home/(redacted)/.rpmdb/__db.001
/home/(redacted)/.rpmdb/Obsoletename
/home/(redacted)/.rpmdb/.dbenv.lock
/home/(redacted)/.rpmdb/Name
/home/(redacted)/.rpmdb/Basenames
/home/(redacted)/.rpmdb/Triggername
/home/(redacted)/.rpmdb/Packages
/home/(redacted)/.rpmdb/Dirnames
/home/(redacted)/.rpmdb/__db.003

Kann mir jemand erklären, warum dies geschieht und wenn ja, wie ich es beheben kann, wenn ich kein Root-Benutzer bin?

18
eldosoa

Sie haben einen Fehler in der von Ubuntu verwendeten Bibliothek Bash Completion 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. Wann immer Sie drücken Tab, Funktionen in dieser Bibliothek werden aufgerufen und versuchen, Ihre aktuelle Befehlszeile zu vervollständigen. Also zum Beispiel, wenn Sie apt-get i eingebenTab es wird das zu apt-get install vervollständigen. Wenn Sie diese Bibliothek nicht als Quelle verwenden, haben Sie nur die standardmäßige, primitive Bash-Vervollständigung - zum Beispiel, wenn Sie apt-get i eingeben.Tab Ohne es gefunden zu haben, sucht bash einfach nach Dateien im aktuellen Verzeichnis, beginnend mit i, und versucht, Ihren Befehl gemäß diesen Dateinamen auszuführen.

Warum passiert es nicht als root?

Wenn Sie Sudo su verwenden, um sich root zu machen, wird die Bash-Vervollständigungsbibliothek nicht bereitgestellt. Dies wäre anders, wenn Sie Sudo -i verwenden würden, um sich root zu machen. Ich wette du siehst den Bug 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 nicht mit den unterschieden vertraut.

In meinem Fall wird die Bibliothek als normaler Benutzer bezogen, wenn ich eine Bash-Shell starte, da ~/.bashrc/etc/bash_completion als Quelle für /usr/share/bash-completion/bash_completion verwendet wird.

Wenn ich mich mit Sudo -i als root anmelde, wird die Bibliothek bezogen, da /etc/profile/etc/profile.d/bash_completion.sh als Quelle für /usr/share/bash-completion/bash_completion verwendet.

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 ist hinter den Kulissen passiert, als du getroffen hast Tab in dem von Ihnen beschriebenen Kontext. 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

Angesichts dieser Argumente führt die Funktion _quote_readline_by_ref unter anderem das oben erwähnte eval aus. Sie können nachsehen, wenn Sie möchten. Und als du env $(cat env. eingegeben hastTabHinter den Kulissen wurde diese Funktion 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 wurde bereits gemeldet . Nachdem ich diesen Fehlerbericht gelesen habe, sehe ich drei Möglichkeiten, ihn zu beheben:

  1. 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, erscheint nicht m Entwickler der Bash-Vervollständigung zu sein . Dieser Hotfix bewirkt einfach, dass der linke Operand der Anweisung als false ausgewertet wird, und verhindert so, dass eval auftritt. 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.

  2. 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 (Sie müssen die alte Version nicht unbedingt sichern, es sei denn, Sie fühlen sich sicherer. Bei Problemen macht Sudo apt-get install --reinstall bash-completion alle von Ihnen vorgenommenen Änderungen rückgängig.) Dies ist die Art und Weise empfehle ich, 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.

  1. 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 ;-)
33
Malte Skoruppa