Назад | Перейти на главную страницу

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

Я использую домашнюю Windows 10 (сборка 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

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

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

Факты

Кажется, это ошибка в GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu). Я также смог воспроизвести ошибку в стабильной версии Debian 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.

Мой вопрос

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

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

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

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

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

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