Копировать-вставить heredocument в Bash превращает вкладки в точки

Я использую Windows 10 home (сборка 16299.248) и использую SSHing на удаленной машине 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 raw.

Моя проблема

Результат в удаленном 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 для Linux (WSL), у меня нет точек (будь то Powershell или CMD). Я также не использую менеджеры вставки / буфера обмена в 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 / other или из комбинации Debian-Bash.

Мой вопрос

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам