WSL - 将尾随空格添加到 Bash 代码中,根据窗口大小粘贴到 CMD WSL TTY 中

6 bash tty carriage-return cmd.exe windows-subsystem-for-linux

我在 Windows 上有一些 Bash 脚本,有时我会将它们从 Notepad++ 复制到 WSL(基于 CMD)终端仿真器 (TTY) 中以执行它们。

问题:

当我通过以下命令将其复制并粘贴到 WSL Nano 中时,尾随空格(nano 中的绿色框)会添加到每个脚本中:

nano ~/script.sh
Run Code Online (Sandbox Code Playgroud)

这些尾随空格字符不是脚本的一部分,实际上会破坏它在 Linux 中的执行,因此不应该在脚本中。

WSL TTY 窗口越窄,粘贴时形成的回车就越多。

当我用 Nano 打开脚本时,脚本一直包含这些绿色框,当文件被保存时,它似乎没有去掉这些字符(应该是这样),所以有人可以声称这是 Nano 中的一个错误,但实际上dos2unix是在文件上执行也不会去除尾随的空格。

在此处输入图片说明

在此处输入图片说明

想要的情况:

我希望在将 Bash 脚本(或任何其他数据)从 Windows 复制和粘贴到 WSL Nano 时,复制时不会形成尾随空格。

更多信息:

https://github.com/Microsoft/BashOnWindows/issues/2006

https://savannah.gnu.org/bugs/?50879

如果您尝试在 WSL 中重现:

  1. 确保从 Notepad++ 复制脚本,该脚本具有 Unix EOL (LF),并且仅包含制表缩进。
  2. 确保您的 nano 脚本文件以 结尾.sh,因此您将获得 Bash 突出显示。如果您仍然没有它,请尝试通过 SSH 隧道连接到远程 Ubuntu 服务器(如果您有)并在那里以相同的方式创建脚本文件,那么您肯定会有这种行为。
  3. 无论哪种方式,请确保您的 Nano 窗口很窄(大约占视口的 25-50%)并且您粘贴了大部分文本)。

Ste*_*ven 5

正如您所说,问题是由于在带有 Unix 行结尾 (LF) 的狭窄窗口中粘贴文本而引起的。

考虑使用以下AutoHotkey脚本“键入”剪贴板文本,让 Windows 处理换行符。

SendMode Input  ; Recommended for superior speed and reliability.

; Upon pressing Ctrl+Alt+v
^!v::  
    ; SendRaw "types" the contents of the variable.  When it encounters either
    ; Cr (`r) or Lf (`n), it sends an "Enter", thus CrLf sends Enter twice.

    ; Replace any CrLf with Lf (ironic, I know), leaving the clipboard as is
    newClip := StrReplace(clipboard,"`r`n","`n")
    SendRaw %newClip%
return
Run Code Online (Sandbox Code Playgroud)


小智 3

根据 Nano 开发团队的 Benno Schulenberg 的建议,在 /etc/nanorc 末尾添加以下代码解决了这个问题:

bind ^J enter main
Run Code Online (Sandbox Code Playgroud)

一方面,这将禁用尾随空格的形成,另一方面,将为从 Windows 复制的数据添加换行符(LF 字符),因此它不会出现在长行中。

阅读此处了解更多数据