我将以下 100 行复制/粘贴到我的终端(xterm)中,以在我连接到的服务器上执行那些ssh
:
mv /long/path/to/file1 /longer/path/to/file1
mv /long/path/to/file2 /longer/path/to/file2
...
mv /long/path/to/file99 /longer/path/to/file99
mv /long/path/to/file100 /longer/path/to/file100
不幸的是,在复制/粘贴之后,我在下面找不到我的 100 个文件/longer/path/to/
查看我通过 ssh 连接到的服务器上的 bash 历史记录,我可以看到在前 20 个命令之后,大多数命令都被截断了:
mv /long/path/to/file1 /longer/path/to/file1
...
mv /long/path/to/file20 /longer/path/to/file20
mv /long/path/to/fi
mv /long/path/to/fi
mv /long/path/to/file23 /longer/p
mv /long/path/to/file24 /longer/path
mv /long/path/to/file25 /longer/p
mv /long/path/to/file26 /longer/p
mv /long/path/to/file27 /longer/path/t
mv /long/path/to/file28 /longer/path/to/fil
mv /long/path/to/file29 /longer/path/to/fil
mv /long/path/to/file30 /longer/path/to/file
mv /long/path/to/file31 /longer/path/to/file
...
我可以找到有关如何解决此问题的答案:
但我找不到关于到底发生了什么的解释。尤其:
- 这是与终端相关的问题(在我的情况下为 Xterm)?
- 复制/粘贴发生在
ssh
:这是否会产生或放大问题? - 这是服务器上与 bash 相关的问题吗?另一个外壳可能不会发生吗?
似乎你遇到了这个错误:
https://lkml.org/lkml/2013/7/25/205
它于 2013 年 12 月 10 日应用于内核,即 linux 内核 3.14。你使用的是比这更老的 Linux 发行版吗?你的发行版是什么?您可能替换了文件的真实路径,所以我无法计算字符数。你能做到吗:
用你的真实路径 - 它会真的接近 4k 吗?如果是这样,上面的错误可能是你的。
如果是,请回答您的问题:
不
不
不,是 - 这不是 bash 或 bash 使用的任何库中的错误。错误在内核中。
可能是,如果 shell 没有使用 readline。像zsh。
关于相关问题“如何粘贴多个...”似乎与您的问题无关 - 原因是某些应用程序可能会读取您粘贴的命令。最著名的例子是 ssh,如果你在远程服务器上运行 ssh 命令。但是鉴于您只丢失了部分线路,您的情况不太可能。
第二个问题“粘贴到终端的命令...”于 2013 年 9 月 25 日问,当时补丁不存在,这绝对看起来像你有的错误,我怀疑我是内核的错误。
如何确定?在此处粘贴 uname -a 的输出。
手头的问题
您想了解为什么复制和粘贴的代码行会被截断。
我调查了您的问题,发现 Bash 默认情况下通常有行数限制。这很可能是您的问题。但是,您给出的示例显示行被截断的长度不同。我会尽力打破这个。
解决方案
1. 是否是终端相关问题(我的情况是 Xterm)?
很可能是这样,但这是由于默认 Bash 环境而不是 xterm 的限制。(除非您更改了许多 xterm 的默认值)
我正在参考以下帖子,这些帖子提供了增加行长以希望减少截断的解决方案。此 U&L 堆栈交换答案涵盖更改窗口大小以匹配终端仿真器的期望。用户saketrp 提供了这个解决方案,以确保您的终端正确解释您的窗口大小。
但是,这只会影响对窗口大小的解释,而不影响实际的行长。如果您已正确设置,则使用此 AskUbuntu 帖子中提供的信息,
shopt
您可以添加以下行以.bashrc
增加行长。并运行
source .bashrc
以更新您的 Bash 配置文件。2. 通过 ssh 进行复制/粘贴:这会产生或放大问题吗?
我想说这是问题的一部分,如果不是根本原因的一部分。您链接的解决方法是防止这种情况发生的可靠解决方案。
我建议如果您需要复制和粘贴一组命令(您需要多次使用它们吗?)创建一组命令的 Bash 脚本。然后使用
scp
,sftp
,curl
, 电子邮件或任何您想要使用的远程传输文件的方法。这完全避免了链接解决方法中概述的截断问题,您甚至可以编写脚本创建脚本和/或一次将脚本传输到多个服务器。
3. 是服务器上bash相关的问题吗?另一个外壳可能不会发生吗?
如前所述,是的,这可能是 Bash 配置文件设置设置的行限制的问题。其他shell可能没有这个问题,但我自己只熟悉Dash/Bash。但是,如果这些是生产服务器或遗留系统,如果您开始更改环境变量,它可能并不总是很好。并不是说这不是不可能的,但是如果某些软件包/软件/以前的脚本/cronjobs 依赖 Bash 作为默认 shell,则存在风险,更改它可能会产生后果。
同样,我建议您创建一个您希望运行的命令的脚本并将其传输到远程服务器以在那里运行以解决此问题。
结论
为什么您的命令被截断取决于您的环境、Bash 配置文件设置、您的终端仿真器设置以及复制和粘贴命令的方法。正如您所指出的,有一些解决方法,我建议您将它们与脚本结合使用以避免该问题。我还包括一个联机帮助页的链接,
xterm
以便您查看是否有任何其他设置或选项可以更改。如果您对此答案有任何疑问或问题,请发表评论。我感谢反馈以纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。
祝你好运!
我建议使用 gzip 和 base64 将命令从一个终端复制到另一个终端。如果问题来自元字符或制表符扩展,您应该以这种方式克服它。
例子:
然后将编码结果复制到