WSL - Додано бічні пробіли до коду Bash, вставленого в CMD WSL TTY за розмір вікна


6

У мене є кілька скриптів Bash на Windows, і я іноді копію їх з Notepad ++ в емулятор терміналу WSL (CMD) (TTY), щоб виконати їх.

Проблема:

Проміжні пробіли (Зелені коробки в нано) додаються до кожного скрипта, коли я копію та вставляю його в WSL Nano через цю команду:

nano ~/script.sh

Ці символи пробілів не є частиною сценарію і фактично порушують його виконання в Linux, отже, не повинні бути в ньому.

Чим вужче буде вікно WSL TTY, тим більше повертань каретки буде сформовано при вставці.

Сценарій зберігає їх Зелені коробки коли я відкриваю його за допомогою Nano, який, здається, не позбавляє цих символів, коли файл зберігається (як і повинен був бути), щоб можна було стверджувати, що це помилка в Nano, але насправді Виконання dos2unix у файлі також не видаляє пробіли.

enter image description here

enter image description here

Бажана ситуація:

Я бажаю, щоб при копіюванні та вставці скриптів Bash (або будь-яких інших даних) з Windows у WSL Nano у копіюванні не формувалося жодних пробілів.

Додаткова інформація:

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

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

Якщо ви намагаєтеся відтворити у вашому WSL:

  1. Переконайтеся, що скопіюйте скрипт з Notepad ++, який має Unix EOL (LF), і містить лише відступи.
  2. Переконайтеся, що файл nano-скрипта закінчується .sh, тому ви будете підсвічувати Bash. Якщо ви все ще не маєте цього, спробуйте SSH тунель на віддалений сервер Ubuntu, якщо у вас є один, і створіть файл сценарію там же, і тоді вам доведеться це робити.
  3. У будь-якому випадку переконайтеся, що ваше вікно Nano є вузьким (близько 25-50% вікна перегляду) і що ви вставляєте велику частину тексту).

2
Коментарі не для розширеного обговорення; Ця розмова була переміщено до чату .
Journeyman Geek

Відповіді:


5

Як ви стверджували, проблема виникає в результаті вставки тексту в вузьке вікно з закінченням рядків Unix (LF).

Розглянемо наступне AutoHotkey Сценарій "набирає" текст буфера обміну, дозволяючи Windows обробляти символи нового рядка.

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

Як мені запропонував Бенно Шуленберг з команди розробників Nano, додавши наступний код наприкінці / etc / nanorc вирішив цю проблему:

bind ^J enter main

З одного боку, це вимкне формування проміжних проміжків, а з іншого боку, додаватиме рядки каналів (LF-символи) до даних, скопійованих з Windows, тому вона не з'явиться в одному довгому рядку.

Прочитайте тут для отримання додаткових даних .


0

У широкому зображенні, яке відображається: ....

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

(символ перед вертикальною смугою - HTML ␠) або unicode char U + 2420 (символ для простору).

Цей простір повинен бути там. Якщо межі вікна не було, тоді лінія буде:

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

Якщо ви не мали місця, & amp; & amp; не було б місця між ним і початком слова «Баш» - який не повинні боляче, якщо ви працюєте в bash, але це тільки 1 приклад .. тобто, звичайно, ви б мали простір між подвійним амперсандом і простором.

Якщо ваші пробіли повинні бути там, що може бути причиною ваших проблем ... ARG! Ви вставляєте цю "в" ... bash ... Uh oh ...

Якщо ви вставляєте у bash, bash є "помилковим" (це питання думки) для вставки через зміни автозаповнення, зроблені кілька років тому. Якщо у вашому вставленому тексті є якісь "TAB" (yup, відступ), це призведе до виклику функції "автозаповнення" bash (я скаржився на це, але мені сказали, що ніхто не вкладає текст у bash ... кашель , кашель ) (скаржиться на список 'bug-bash@gnu.org', хоча я сумніваюся, що це буде виправлено в будь-який час найближчим часом). Коли він викликає автозаповнення - багато разів він проковтне наступний символ вашого вставленого тексту, оскільки він задає запитання:

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

Як правило, це пошкоджує вставлений текст. Раніше це не було проблемою для мене, так як мої вкладки зазвичай знаходяться на порожніх рядках (тому що вони є відступним кодом). Раніше існувала можливість ігнорувати натискання клавіші завершення коду на порожньому рядку (@ початок рядка або коли тільки ті прогалини передують, де він натискається). Це було змінено, щоб проігнорувати лише символ завершення у порожніх рядках команд (не порожній рядок tty). Вставлення декількох команд у вхідні дані зазвичай розглядаються як bash як якась продовжена команда - НЕ порожній командний рядок. Зайве говорити, що це викликає багато проблем.

Недосконалим рішенням для мене було перепризначення ключа завершення коду з TAB до Backquote (" ") (above tilde key). (same bug occurs if you have у вашому тексті, але для мене я використовую це значно рідше, ніж TAB). Він встановлюється у файлі ".inputrc" вашого домашнього каталогу, який керує тим, як "readline" (використовується bash для читання ліній, дозволу редагування тощо). Зокрема, розділ у моєму ".inputrc" має опції конфігурації, специфічні для bash:

$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

Альтернативи: 1) конвертувати всі вкладки в пробіли перед вставкою, тому TAB не запускатиме завершення команди. 2) завжди пишіть текст у файл і джерело (.) файл або зробити його виконуваним і додати '#! / bin / bash' на 1-й рядок, щоб зробити його скриптом оболонки.

Теоретично ви також повинні мати можливість завершити завершення команд, але я використовую його занадто багато, тому ніколи не намагалися спробувати.

Те, що я зазвичай роблю зараз, це редагувати скрипт у 1 вікні (зазвичай gvim), а у вікні, де я почав gvim, я запускаю послідовні ітерації сценарію - таким чином уникаючи 'вставляти'. Звичайно, це був не мій перший вибір, але корумпований вхід bash, ковтаючи речі після повного ключа, підштовхнув мене в цьому напрямку.

Зауважте, якщо ви повідомляєте про це як про помилку, будьте готові запропонувати рішення! ;-) Це руб:

> 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.

Те ж саме відбувається, коли ви вставляєте команди в bash ... деякі будуть мати вкладки, де ви їх не хочете ...

(Ps Сподіваюся, що це допоможе, і я не зовсім увійшов у ліве поле, але коли ви згадали "вставлення", і це виглядає як bash-script ... подібно до тієї самої проблеми, в якій я зіткнувся.

Використання зворотного відбитка як повної клавіші іноді трохи незручно, але занадто часто буде мати вкладки в вставленому тексті ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.