Kopieren und Einfügen des Dokuments in Bash wandelt Tabulatoren in Punkte um

Kopieren und Einfügen des Dokuments in Bash wandelt Tabulatoren in Punkte um

Ich verwende Windows 10 Home (Build 16299.248) und greife mit verschiedenen SSH-Clients (wie Putty/MobaXterm) per SSH auf eine Remote-Ubuntu 16.04-Maschine zu.

Ich kopiere den folgenden Code aus meinem persönlichen GitHub-Konto und füge ihn in eine SSH-Sitzung ein:

cat <<-EOF >> "$HOME"/.bashrc
    export s_a="/etc/nginx/sites-available"
    export s_e="/etc/nginx/sites-enabled"
    export drt="/var/www/html"
    source "$HOME"/"$repo"/software_internal.sh
EOF

Ich kopiere esdirekt von meinem GitHub-Konto hier (nicht-rohe Version)obwohl das folgende Problem auftritt, auch wenn ich die Rohversion von GitHub kopiere.

Mein Problem

Das Ergebnis in der Remote-Bash ist folgendes:

> .export s_a="/etc/nginx/sites-available"
> .export s_e="/etc/nginx/sites-enabled"
> .export drt="/var/www/html"
> .source "$HOME"/"$repo"/software_internal.sh
> EOF

Beachten Sie den einzelnen Punkt am Anfang fast jeder Zeile.

Etwas übersetzt Tabellen in einzelne Punkte.

Fakten

  • Das gerade beschriebene Problem tritt bei verschiedenen Arten von SSH-Clients auf.

  • Es gelang den Leuten auch, das Problem in Linux-Systemen (Debian, Ubuntu) zu reproduzieren. Außerdem habe ich die Punkte nicht, wenn ich das Windows 10-Subsystem für Linux (WSL) verwende (weder von Powershell noch von CMD). Ich verwende in Windows 10 auch keinerlei Zwischenablage-Manager.

  • Es gibt auch keine Hinweise darauf, dass GitHub ein nicht konventionelles Tabulatorzeichen verwendet.

  • Es passiert, wenn ich entweder aus Mozilla Firefox oder Google Chrome kopiere.

  • Ich habe nach der Installation (nachdem ich mein „Droplet“ in der DigitalOcean-Terminologie erstellt hatte) nichts an der DigitalOcean Ubuntu Bash geändert.

Dies scheint ein Fehler in zu sein GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu). Ich konnte den Fehler auch in Debian Stable 9.3 mit Bash 5.2 reproduzieren. Dieses Problem tritt jedoch nicht in Arch auf, es ist also wahrscheinlich nur bei Debian-Distributionen vorhanden.

Weitere Informationen

Das Problem tritt nicht nur bei DigitalOcean, sondern auch bei Linode auf – ein Linode-Techniker konnte es bei Ubuntu 14.04, 16.04 und 17.04 reproduzieren.

Es ist möglich, dass DigitalOcean und Linode Ubuntu auf die gleiche Weise anpassen und der Fehler nicht in Bash vorliegt, aber dennoch nur bei DigitalOcean und Linode auftritt.

Zusammenfassung

Es ist höchstwahrscheinlich nicht, dass das oben genannte Problem von Windows 10, SSH-Clients, der GitHub-Benutzeroberfläche oder Webbrowsern herrührt. Wahrscheinlicher sind Debian-Repositorys, Bash in 4.3/5.2/anderen oder die Kombination aus Debian-Bash.

Meine Frage

Wie gehe ich mit diesem Problem richtig um? Ich könnte natürlich die Registerkarten des Heredocuments löschen, aber das möchte ich auf keinen Fall. Die Registerkarten helfen mir, das Heredocument besser zu organisieren.

Antwort1

Bash führt die Dateinamenvervollständigung innerhalb des Heredoc durch. Ihr Verzeichnis hat keinenicht verstecktDateien (Dateien, die nicht mit '.' beginnen), also die längsteTeilzeichenfolgevon Zeichen, die mit dem Anfang aller Dateinamen im Verzeichnis übereinstimmen, ist „.“ und das ist, was bereitgestellt wird und in Ihrer Eingabe übrig bleibt.

Die gleiche Version von Bash zeigt dieses Verhalten überall, wo ich es ausprobiert habe, es ist also eindeutig nicht auf einen bestimmten VPS-Anbieter beschränkt. Ich konnte dies nicht stoppen, ohne die Vervollständigung vollständig zu deaktivieren (also kann ich kein „Hier ist, was Linode tun muss, um das Distributions-Image zu reparieren“ liefern), aber es gibt einige Workarounds für Ihre spezielle Verwendung:

  1. Die einfachste Lösung, ohne etwas in Bash selbst zu ändern, ist die Erstellung einesnicht verstecktDatei im Verzeichnis ( $HOME), bevor das Heredoc startet. Dadurch wird die Dateinamenvervollständigung auf 0 Zeichen abgeglichen. Sie können dies beispielsweise mit tun touch "$HOME"/myFile.

  2. Starten Sie eine Shell mit deaktiviertem Readline und erledigen Sie dort Ihre Arbeit.bash --noediting

  3. Schalten Sie die Vervollständigung vor dem Heredoc aus:bind 'set disable-completion on'

verwandte Informationen