将一些连续命令粘贴到终端会在用户输入的命令上停止,例如:
read VAR
echo $VAR
或者
select VAR in 1 2 3; do break; done
echo $VAR
echo $VAR
没有被粘贴/执行。
不过,将所有命令放在一行上是可行的:
read VAR; echo $VAR
但当有更多命令跟随时,这不是首选。
为什么会出现这种情况以及如何解决这个问题?
我的用例是在服务文档中包含一些重复出现的命令。
我当然可以编写一个脚本,但这不是我打算做的,并且在仅具有读取访问权限的系统上可能无法实现。
答案1
一个非常舒服的方法是以下:
只需在终端中输入以下内容:
(
paste-your-multiline-script-here
)
enter
详细描述:
在终端中你开始
(
可选:按enter(仅出于格式原因)
现在您可以粘贴多行
例如:
echo hello
echo world
替代方法:逐行键入/粘贴(用enter键完成每一行)。
最后,键入终结
)
并再次点击enter,这将执行整个粘贴/输入的行。
小工作示例(用于逐行粘贴enter):
anderson@tp ~ % (
\`subsh> echo hello
\`subsh> echo world
\`subsh> )
hello
world
anderson@tp ~ %
小工作示例(用于粘贴整个脚本):
anderson@tp ~ % (
\`subsh> echo hello
echo world
\`subsh> )
hello
world
anderson@tp ~ %
忽略格式的小工作示例(用于粘贴整个脚本):
anderson@tp ~ % (echo hello
echo world)
hello
world
anderson@tp ~ %
答案2
将以下两个命令粘贴到 shell 中时:
read VAR
echo $VAR
...第一个告诉 shell 将一行文本读入名为 的变量中VAR
。您在下一行提供该值;它只是碰巧是您认为会执行的命令。
打印变量的值VAR
,您将看到:
$ printf '%s\n' "$VAR"
echo $VAR
菜单上也会发生同样的情况select
。
我建议,如果您的文档/命令期望用户输入一个值,您可以插入这样的注释:
read VAR
(用户输入一个值)
echo $VAR
答案3
\
这可以通过在复制之前放在每行的末尾来完成。
答案4
您可以像您想要的那样完成这项工作。我一直这样做。
如果您使用 zsh 和一个用特殊转义序列(如 urxvt)将其粘贴括起来的终端,那么默认情况下它已经按照您想要的方式工作了。如果您使用的是 bash,则只需通过执行 来激活其对粘贴括号的解释 bind 'set enable-bracketed-paste on'
。然后,它会等待您按 Enter 键,然后再执行您粘贴的内容。在这方面,bash 和 zsh 之间的区别在于 bash 会将您粘贴到历史记录中的命令分开,这样对于 2 行,您需要按 Up、Up、Enter、Up、Up、Enter,而 zsh 保留命令粘贴到历史记录中,无论有多少行,向上,回车。
以下答案中写了更多内容。第二个是我的,包括一张支持括号粘贴的终端表。如果您最终使用 urxvt,我建议安装我在答案中包含的扩展,以避免问题所涉及的漏洞:
https://security.stackexchange.com/a/52655/132634
https://security.stackexchange.com/a/184112/132634
编辑:顺便说一下,为了更明确地防止您错过它,如果您不这样做(使用括号粘贴),那么当您从网站粘贴时,您会接受 shell 代码注入。毕竟,网站可以通过各种方式隐藏代码,并让您在不知情的情况下复制它。
检查此网站,看看您是否容易受到攻击:
http://thejh.net/misc/website-terminal-copy-paste
看起来你会执行:
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git
实际上,你会运行这样的东西(我删除了一个不可打印的转义字节):
git clone [201~/dev/null; clear; echo -n "Hello ";whoami|tr -d '\n';echo -e '!\nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!
Here'"'"'s the first line of your /etc/passwd: ';head -n1 /etc/passwd
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git