Копировать-вставить 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. Мне не удалось сделать эту остановку без полного отключения завершения (поэтому я не могу предоставить "Вот что нужно сделать Линоде, чтобы исправить образ дистрибутива"), но есть довольно много обходных путей для вашего конкретного использования:
Самое простое исправление, без каких-либо изменений в самом Bash, - это создать не скрытый файл в каталоге (
$HOME
), до того, как начнется наследственность. Это заставит завершение имени файла соответствовать 0 символам. Вы могли бы сделать это, скажем,touch "$HOME"/myFile
,Запустите оболочку с отключенной readline и делайте свое дело там.
bash --noediting
Отключить завершение перед heredoc:
bind 'set disable-completion on'