将多个命令粘贴到终端在用户输入时停止

将多个命令粘贴到终端在用户输入时停止

将一些连续命令粘贴到终端会在用户输入的命令上停止,例如:

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

详细描述:

  1. 在终端中你开始(

    可选:按enter(仅出于格式原因)

  2. 现在您可以粘贴多行

    例如:
    echo hello
    echo world

    替代方法:逐行键入/粘贴(用enter键完成每一行)。

  3. 最后,键入终结)并再次点击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 

相关内容