将此处文档复制粘贴到 Bash 中,将制表符转换为点

将此处文档复制粘贴到 Bash 中,将制表符转换为点

我使用 Windows 10 家庭版(内部版本 16299.248),并使用各种 SSH 客户端(如 Putty/MobaXterm)通过 SSH 连接到远程 Ubuntu 16.04 机器。

我将以下代码从我的个人 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)。我也不使用 Windows 10 中的任何类型的粘贴板/剪贴板管理器。

  • 也没有证据表明 GitHub 使用任何非常规制表符。

  • 当我从 Mozilla Firefox 或 Google Chrome 复制时就会发生这种情况。

  • 安装 DigitalOcean Ubuntu Bash 后(在 DigitalOcean 术语中创建我的“droplet”之后),我没有对其进行任何更改。

这似乎是 中的一个错误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 GUI 或 Web 浏览器;它很可能来自 Debian 存储库、4.3/5.2/其他版本的 Bash,或 Debian-Bash 的组合。

我的问题

解决这个问题的正确方法是什么?我当然可以删除此处文档标签,但这绝对是我不想要的。标签可以帮助我更好地组织此处文档。

答案1

Bash 正在 heredoc 内进行文件名补全。您的目录没有非隐藏文件(不以“。”开头的文件),因此最长的子字符串与目录中所有文件名开头匹配的字符是“。”,这就是所提供并留在您的输入中的内容。

在我尝试过的所有地方,同一版本的 Bash 都表现出这种行为,因此它显然不仅限于特定的 VPS 提供商。我无法在不完全禁用完成的情况下停止此操作(因此我无法提供“这是 Linode 需要执行的操作来修复发行版映像”),但对于您的特定用途,有相当多的解决方法:

  1. 最简单的解决方法是创建一个非隐藏在 heredoc 开始之前,将文件放入目录 ( $HOME) 中。这将导致文件名补全匹配 0 个字符。您可以使用 来执行此操作touch "$HOME"/myFile

  2. 启动一个禁用 readline 的 shell 并在那里执行你的操作。bash --noediting

  3. 在 heredoc 之前关闭完成:bind 'set disable-completion on'

相关内容