我使用 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 需要执行的操作来修复发行版映像”),但对于您的特定用途,有相当多的解决方法:
最简单的解决方法是创建一个非隐藏在 heredoc 开始之前,将文件放入目录 (
$HOME
) 中。这将导致文件名补全匹配 0 个字符。您可以使用 来执行此操作touch "$HOME"/myFile
。启动一个禁用 readline 的 shell 并在那里执行你的操作。
bash --noediting
在 heredoc 之前关闭完成:
bind 'set disable-completion on'