WSL - Nachgestellte Whitespaces, die zu Bash-Code hinzugefügt werden, der in CMD WSL TTY pro Fenstergröße eingefügt wird

823
JohnDoea

Ich habe ein paar Bash-Skripte unter Windows und kopiere sie manchmal aus Notepad ++ in den WSL (CMD-basierten) Terminal-Emulator (TTY), um sie auszuführen.

Das Problem:

Nachgestellte Leerzeichen (grüne Kästchen in Nano) werden zu jedem Skript hinzugefügt, wenn ich es mit dem folgenden Befehl in WSL Nano kopiere und einfügen:

nano ~/script.sh 

Diese nachgestellten Whitespaces-Zeichen sind nicht Teil des Skripts und brechen tatsächlich die Ausführung in Linux, sollten also nicht darin enthalten sein.

Je enger das WSL-TTY-Fenster ist, desto mehr Wagenrückläufe werden beim Einfügen gebildet.

Das Skript enthält immer diese grünen Kästchen, wenn ich es mit Nano öffne. Diese Zeichen scheinen die Zeichen nicht zu entfernen, wenn die Datei gespeichert wird (was eigentlich hätte sein sollen). Man könnte also behaupten, dass es sich um einen Fehler in Nano handelt, der jedoch dos2unixdie Datei ausführt streift auch nicht die nachfolgenden Leerzeichen ab.

WSL - Nachgestellte Whitespaces, die zu Bash-Code hinzugefügt werden, der in CMD WSL TTY pro Fenstergröße eingefügt wird

WSL - Nachgestellte Whitespaces, die zu Bash-Code hinzugefügt werden, der in CMD WSL TTY pro Fenstergröße eingefügt wird

Die gewünschte Situation:

Ich wünsche mir, dass beim Kopieren und Einfügen von Bash-Skripts (oder anderen Daten) von Windows in WSL Nano keine nachgestellten Whitespaces beim Kopieren entstehen.

Weitere Informationen:

https://github.com/Microsoft/BashOnWindows/issues/2006

https://savannah.gnu.org/bugs/?50879

Wenn Sie versuchen, sich in Ihrer WSL zu reproduzieren:

  1. Stellen Sie sicher, dass Sie ein Skript aus Notepad ++ kopieren, das über Unix EOLs (LF) verfügt und nur Tabulationseinrückungen enthält.
  2. Vergewissern Sie sich, dass Ihre Nano-Skript-Datei mit endet .sh, sodass Sie die Bash-Hervorhebung verwenden. Wenn Sie es immer noch nicht haben, versuchen Sie, SSH in einen entfernten Ubuntu-Server zu tunneln, wenn Sie über einen verfügen, und erstellen Sie dort eine Skriptdatei auf dieselbe Weise, und dann sollten Sie dieses Verhalten haben.
  3. Vergewissern Sie sich in jedem Fall, dass Ihr Nano-Fenster schmal ist (etwa 25 bis 50 Prozent des Ansichtsfensters) und dass Sie einen großen Teil des Textes einfügen.
5
Kommentare sind nicht für eine erweiterte Diskussion vorgesehen. Diese Konversation wurde [zum Chat verschoben] (http://chat.stackexchange.com/rooms/57946/discussion-on-question-by-benia-wsl-trailing-whitespaces-being-add-to-bash-c) . Journeyman Geek vor 6 Jahren 2

3 Antworten auf die Frage

5
Steven

Wie Sie gesagt haben, entsteht das Problem durch das Einfügen von Text in ein enges Fenster mit Unix-Zeilenenden (LF).

Erwägen Sie die Verwendung des folgenden AutoHotkey- Skripts, um den Text der Zwischenablage "auszugeben", sodass Windows die Zeilenumbrüche verarbeiten kann.

SendMode Input ; Recommended for superior speed and reliability.  ; Upon pressing Ctrl+Alt+v ^!v::  ; SendRaw "types" the contents of the variable. When it encounters either ; Cr (`r) or Lf (`n), it sends an "Enter", thus CrLf sends Enter twice.  ; Replace any CrLf with Lf (ironic, I know), leaving the clipboard as is newClip := StrReplace(clipboard,"`r`n","`n") SendRaw %newClip% return 
2
JohnDoea

Wie mir Benno Schulenberg vom Nano-Entwicklungsteam vorgeschlagen hatte, löste das Hinzufügen von folgendem Code am Ende von / etc / nanorc dieses Problem:

bind ^J enter main 

Auf der einen Seite wird dadurch die Bildung von Trailing-Whitespaces deaktiviert, und auf der anderen Seite werden den aus Windows kopierten Daten Zeilenvorschübe (LF-Zeichen) hinzugefügt, sodass sie nicht in einer langen Zeile erscheinen.

Lesen Sie hier für weitere Daten .

0
Astara

Im breiten Bild zeigen Sie: ....

...cd maldetect-* &&␠|<-window boundary bash ./install.sh 

(Das Zeichen vor dem vertikalen Balken ist HTML oder Unicode-Zeichen U + 2420 (Symbol für Leerzeichen).

Dieser Raum sollte (HAS) da sein. Wenn die Fenstergrenze nicht vorhanden ist, lautet die Zeile:

...cd maldetect-* && bash ./install.sh 

Wenn Sie nicht das Leerzeichen hätten, dann hätte && kein Leerzeichen zwischen dem Wort und dem Beginn des 'bash'-Wortes. Dies sollte nicht schaden, wenn Sie in bash laufen. ABER das ist nur ein Beispiel Normalerweise haben Sie ein Leerzeichen zwischen dem doppelten Et-Zeichen und dem Leerzeichen.

Wenn deine Räume da sein sollten, was könnte deine Probleme verursachen ... hmmmm .... ARG! Sie kleben dieses "in" ... bash ... Äh oh ...

Wenn Sie in bash einfügen, ist bash "Buggy" (eine Ansichtssache) für das Einfügen aufgrund von Änderungen, die vor einigen Jahren vorgenommen wurden. Wenn Sie in Ihrem eingefügten Text TABs (yup, Einrückung) haben, wird die "Autocomplete" -Funktion von bash aufgerufen (ich habe mich darüber beschwert, aber mir wurde gesagt, dass niemand Text in Bash einfügt ... Husten, Husten ) (sich beschweren) auf der 'bug-bash@gnu.org-Liste', obwohl ich bezweifle, dass es bald behoben sein wird). Wenn die Autovervollständigung aufgerufen wird, wird das nächste Zeichen des eingefügten Texts häufig verschluckt, da eine Frage gestellt wird:

> ls <'complete-key' pressed> Display all 199 possibilities? (y or n) 

In der Regel ist der eingefügte Text beschädigt. Das war für mich sowieso kein Problem, da meine Tabs normalerweise auf Leerzeilen stehen (weil sie Code einrücken). Früher gab es eine Option, um Code-Vervollständigungs-Pressevorgänge in einer leeren Zeile zu ignorieren (@ Zeilenanfang oder wenn nur Leerzeichen vor dem Drücken stehen). Dies wurde so geändert, dass das Abschlusszeichen nur in leeren Befehlszeilen ignoriert wird (nicht in einer leeren TTY-Zeile). Das Einfügen mehrerer Befehle in die Eingabe wird normalerweise als Bash als eine Art fortgesetzter Befehl betrachtet - NICHT als leere Befehlszeile. Es ist unnötig zu erwähnen, dass dies eine Menge Probleme verursacht.

Eine unvollkommene Lösung für mich bestand darin, den Code-Vervollständigungsschlüssel von TAB an Backquote umzuordnen (" ") (above tilde key). (same bug occurs if you havein Ihrem Text, aber für mich verwende ich dies viel seltener als TAB). Er wird in der .inputrc -Datei Ihres Home-Verzeichnisses festgelegt, die steuert wie sich 'readline' (von der bash zum Lesen von Zeilen, zum Editieren usw.) verhält, insbesondere ein Abschnitt in meinem ".inputrc" hat bash-spezifische Konfigurationsoptionen:

$if bash # use backquote as completion (yes, that's shift-'~') # not ideal, but quickest "hack" to get mostly  # transparent pasting (backquote isn't used nearly as often as TAB)  TAB:tab-insert "`":complete $endif 

Alternativen: 1) Konvertieren Sie vor dem Einfügen alle Tabulatoren in Leerzeichen, damit die TAB keinen Befehlsabschluss auslöst. 2) Schreibe den Text immer in eine Datei und quelle (.) Die Datei oder mache sie ausführbar und füge in der ersten Zeile '#! / Bin / bash' hinzu, um daraus ein Shell-Skript zu machen.

Theoretisch sollte es auch möglich sein, die Befehlsvollendung abzuschalten, aber ich verwende sie zu oft und habe es auch nie versucht, es zu versuchen.

Was ich normalerweise jetzt mache, ist, dass ich das Skript in einem Fenster bearbeite (normalerweise gvim), und in dem Fenster, in dem ich gvim gestartet habe, führe ich aufeinanderfolgende Iterationen des Skripts aus - und vermeide so das "Einfügen". Sicherlich nicht meine erste Wahl, aber bashs verdorbene Eingabe durch Schlucken von Dingen nach einem vollständigen Schlüssel hat mich in diese Richtung gedrängt.

Wenn Sie dies als Fehler melden, müssen Sie eine Lösung anbieten! ;-) Das ist das Problem:

> ls \<carriage return> >> [here people want to be able to hit 'TAB' and get an autocomplete of of the files in the current directory. It looks like an empty line, but it is a really a continued command line from the previous line. 

Das Gleiche passiert, wenn Sie Befehle in Bash einfügen ... einige haben Registerkarten, wo Sie sie nicht möchten ...

(Ps Hope, das hilft, und ich bin nicht ganz in das linke Feld gegangen, aber als Sie "Einfügen" erwähnt haben und es wie ein Bash-Skript aussieht ... und Sie erwähnen, dass Sie Tabs verwenden, die ebenfalls eingefügt werden), klangen wie das exakt gleiche Problem, dem ich begegnet bin.

Backquote als vollständigen Schlüssel zu verwenden, ist manchmal etwas umständlich, aber zu oft werden Registerkarten im eingefügten Text vorhanden sein.