![Копирование-вставка heredocument в Bash преобразует табуляции в точки](https://rvso.com/image/718156/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20heredocument%20%D0%B2%20Bash%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D0%B5%D1%82%20%D1%82%D0%B0%D0%B1%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D0%B8%20%D0%B2%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8.png)
Я использую 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 нужно сделать, чтобы исправить образ дистрибутива"), но есть довольно много обходных путей для вашего конкретного использования:
Самый простой способ исправить это, не меняя ничего в самом Bash, — создатьне скрытыйfile в каталоге (
$HOME
), перед началом heredoc. Это приведет к тому, что завершение имени файла будет соответствовать 0 символам. Вы можете сделать это с помощью, скажемtouch "$HOME"/myFile
, .Запустите оболочку с отключенным readline и делайте там свои дела.
bash --noediting
Отключить автодополнение перед heredoc:
bind 'set disable-completion on'