Копирование-вставка heredocument в Bash преобразует табуляции в точки

Копирование-вставка heredocument в Bash преобразует табуляции в точки

Я использую Windows 10 Home (сборка 16299.248) и подключаюсь по SSH к удаленной машине Ubuntu 16.04 с помощью различных SSH-клиентов (например, Putty/MobaXterm).

Я копирую и вставляю следующий код из своего личного аккаунта GitHub в сеанс SSH:

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

Я копирую это.прямо с моего аккаунта GitHub здесь (несырая версия)хотя следующая проблема возникает даже если я копирую с GitHub сырую версию.

Моя проблема

Результат в удаленном Bash следующий:

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

Обратите внимание на точку в начале почти каждой строки.

Что-то преобразует таблицы в отдельные точки.

Факты

  • Проблема, которую я только что описал, возникает с различными типами SSH-клиентов.

  • Люди также смогли воспроизвести проблему в системах Linux (Debian, Ubuntu), более того, если я использую Windows 10 Subsystem for Linux (WSL), у меня нет точек (ни из Powershell, ни из CMD). Я также не использую менеджеры Pasteboard/Clipboard любого вида в Windows 10.

  • Также нет никаких доказательств того, что GitHub использует какой-либо нетрадиционный символ табуляции.

  • Это происходит, когда я копирую из Mozilla Firefox или Google Chrome.

  • Я ничего не менял в DigitalOcean Ubuntu Bash после его установки (после создания своего «дроплета» в терминологии DigitalOcean).

Похоже, это ошибка в GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu). Мне удалось воспроизвести ошибку в Debian stable 9.3 с Bash 5.2. Однако эта проблема не возникает в Arch, так что она, скорее всего, уникальна для дистрибутивов Debian.

Дальнейшая информация

Проблема возникает не только в DigitalOcean, но и в Linode — инженер Linode смог воспроизвести ее в Ubuntu 14.04, 16.04 и 17.04.

Вполне возможно, что DigitalOcean и Linode настраивают Ubuntu одинаково, и ошибка не в Bash, а уникальна для DigitalOcean и Linode.

Краткое содержание

Крайне маловероятно, что указанная выше проблема возникнет в Windows 10, SSH-клиентах, графическом интерфейсе GitHub или веб-браузерах. Скорее всего, она возникнет либо в репозиториях Debian, либо в Bash версии 4.3 / 5.2 / других, либо в комбинации Debian-Bash.

Мой вопрос

Как правильно справиться с этой проблемой? Я, конечно, мог бы удалить вкладки heredocument, но это определенно то, чего я не хочу. Вкладки помогают мне лучше организовать heredocument.

решение1

Bash выполняет автодополнение имени файла внутри heredoc. В вашем каталоге нетне скрытыйфайлы (файлы, которые не начинаются с «.»), поэтому самый длинныйподстрокасимволов, которые соответствуют началу всех имен файлов в каталоге, это «.», и именно он предоставляется и остается в ваших входных данных.

Та же версия Bash демонстрирует это поведение везде, где я его пробовал, так что это явно не ограничивается определенным провайдером VPS. Мне не удалось остановить это без полного отключения завершения (поэтому я не могу предоставить "Вот что Linode нужно сделать, чтобы исправить образ дистрибутива"), но есть довольно много обходных путей для вашего конкретного использования:

  1. Самый простой способ исправить это, не меняя ничего в самом Bash, — создатьне скрытыйfile в каталоге ( $HOME), перед началом heredoc. Это приведет к тому, что завершение имени файла будет соответствовать 0 символам. Вы можете сделать это с помощью, скажем touch "$HOME"/myFile, .

  2. Запустите оболочку с отключенным readline и делайте там свои дела.bash --noediting

  3. Отключить автодополнение перед heredoc:bind 'set disable-completion on'

Связанный контент