在用户输入的命令上将一些连续的命令粘贴到终端停止,例如:
read VAR
echo $VAR
或者
select VAR in 1 2 3; do break; done
echo $VAR
echo $VAR
没有被粘贴/执行。
但是,将所有命令放在一行上是可行的:
read VAR; echo $VAR
但是当有更多命令跟随时,这不是首选。
为什么会出现这种情况以及如何解决它?
我的用例是在服务文档中有一些重复出现的命令。
我当然可以编写一个脚本,但这不是我打算做的,并且在只有读取访问权限的系统上可能是不可能的。
一个非常舒适的方法如下:
只需在终端中输入以下内容:
(
paste-your-multiline-script-here
)
enter详细说明:
在您开始的终端中
(
可选:按enter(仅出于格式化原因)
现在您可以粘贴多行
例如:
echo hello
echo world
替代方案:您逐行键入/粘贴(用enter键完成每一个)。
最后,键入 finalizing
)
并enter再次点击,这将执行整个粘贴/输入的行。小工作示例(用于逐行粘贴enter):
小工作示例(用于粘贴整个脚本):
忽略格式化的小工作示例(用于粘贴整个脚本):
当您将以下两个命令粘贴到 shell 中时:
...第一个告诉 shell 将一行文本读入名为
VAR
. 您在下一行提供该值;它恰好是您认为会执行的命令。打印
VAR
变量的值,你会看到:select
菜单也会发生同样的事情。我建议如果您的文档/命令希望用户输入一个值,您可以插入注释:
(用户输入一个值)
这可以通过
\
在复制之前放在每行的末尾来完成。您可以按照自己的意愿完成这项工作。我一直这样做。
如果您使用的是 zsh 和一个终端,它使用特殊的转义序列(如 urxvt)将其粘贴括起来,默认情况下它已经按照您的意愿工作了。如果你使用 bash,你只需要激活它对粘贴括号的解释
bind 'set enable-bracketed-paste on'
。然后它会等待您在执行您粘贴的内容之前按 Enter 键。在这方面,bash 和 zsh 之间的区别在于 bash 会将您粘贴在历史记录中的命令分开,因此对于 2 行,您需要按 Up、Up、Enter、Up、Up、Enter,而 zsh 会保留命令粘贴在历史记录中分组为一个,无论有多少行,Up,Enter。以下答案中有更多内容。第二个是我的,包括一个支持括号粘贴的终端表。如果您最终使用 urxvt,我建议您安装答案中包含的扩展程序,以避免问题所涉及的漏洞:
https://security.stackexchange.com/a/52655/132634
https://security.stackexchange.com/a/184112/132634
编辑:顺便说一下,如果你不这样做(使用括号粘贴),为了更明确地说,如果你不这样做(使用括号粘贴),当你从网站粘贴时,你可以接受 shell 代码注入。毕竟,网站可以以各种方式隐藏代码,让你在不知情的情况下复制它。
检查这个网站,看看你是否容易受到攻击:
http://thejh.net/misc/website-terminal-copy-paste
看起来你会执行:
在现实中,你会运行这样的东西(我删除了一个不可打印的转义字节):