![Kopieren und Einfügen des Dokuments in Bash wandelt Tabulatoren in Punkte um](https://rvso.com/image/718156/Kopieren%20und%20Einf%C3%BCgen%20des%20Dokuments%20in%20Bash%20wandelt%20Tabulatoren%20in%20Punkte%20um.png)
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:
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 tuntouch "$HOME"/myFile
.Starten Sie eine Shell mit deaktiviertem Readline und erledigen Sie dort Ihre Arbeit.
bash --noediting
Schalten Sie die Vervollständigung vor dem Heredoc aus:
bind 'set disable-completion on'