我如何将多行bash代码粘贴到终端并一次性运行它们?

142

我需要将一个多行的bash代码粘贴到终端,但每当我这样做时,每一行都会被立即运行为单独的命令。

13个回答

136

在复制代码之前,尝试在每行末尾加上\

例如:

echo "Hello world" && \
script_b.sh

echo $?

现在退出码($?)是完整的命令序列,而不仅仅是最后一个命令。


40
注意:请勿在文本末尾添加空格,否则会导致翻译错误! - Max Reeder

98

我很惊讶这个答案在这里没有被提供,我正在寻找一个解决这个问题的方法,我认为这是最简单的方法,而且更加灵活/宽容...

如果您想将来自网站/文本编辑器等的多行粘贴到bash中,无论是每行命令还是一个函数或整个脚本...只需以(开头、以)结尾并按Enter键,就像以下示例一样:

如果我有以下blob:

function hello {
    echo Hello!
}
hello

你可以使用bash在终端中粘贴和验证,方法如下:

  1. ( 开始

  2. 粘贴你的文本,然后按Enter键(使其变得美观)...或不美观都行

  3. ) 结尾并按Enter键

示例:

imac:~ home$ ( function hello {
>     echo Hello!
> }
> hello
> )
Hello!
imac:~ home$ 

每一行的文本都会自动添加一个前缀>。我已经测试过多行命令、函数和整个脚本。希望这能帮助其他人节省一些时间!


6
我认为最简单的方法是: - Hobroker
1
@Toolkit对于简单的事情会按照您描述的方式工作,但我提供的解决方案将适用于更复杂的情况(换行、多个函数、整个脚本等)。 - TryTryAgain
1
这将在子shell中运行粘贴的命令,因此通常不会实际执行您想要的操作。您可以使用大括号而不是圆括号来强制它在当前shell中运行;但实际上,两者都不要做。Shell可以应对。 - tripleee
我也非常喜欢这个选项。 - darul75

49
如果你按下 C-x C-e 命令,将打开默认编辑器,该编辑器定义在 .bashrc 中,之后您可以使用编辑器的所有强大功能。 当保存并退出后,这些行将等待您输入。
如果您想定义自己的编辑器,只需在 ~/.bashrc 中写入例如 EDITOR=emacs -nwEDITOR=vi

3
这项技术很实用,但请注意编辑器必须 _同步运行_(就像 emacsvi 一样),并且在保存和退出时命令会 _立即执行_。 - mklement0

20

另一个可能性:

bash << EOF
echo "Hello"
echo "World"
EOF

我喜欢的方法。此外,查看此答案,了解如何在使用heredocs时进行管道/重定向。 - eltbus

20

在这些行的周围添加括号。例如:

$ (
sudo apt-get update
dokku apps
dokku ps:stop APP # repeat to shut down each running app
sudo apt-get install -qq -y dokku herokuish sshcommand plugn
dokku ps:rebuildall # rebuilds all applications
)

2
请注意,与括号 ( 一样,在上面的示例中大括号 { 也可以起到同样的作用。 - GypsyCosmonaut
2
这似乎是在此页面上早期的答案的重复。 - tripleee

19

除了反斜杠外,如果一行以|&&||结尾,则会在下一行继续。


7
为了避免在文本文件中出现过长的命令行,我通常会像这样存储复制粘贴代码段:
echo a;\
echo b;\
echo c

这个答案似乎只用了2个而不是3个(&&)字符就实现了与被接受的答案相同的效果。为什么被接受的答案更可取呢? - al-ash

2

我认为对于非常长的命令(比如使用llvm编译文件!),与我过去尝试过的其他工具相比,这是最容易使用的。我经常在编辑器中使用它来分行输入命令:

cat | paste -sd " "  - | xargs echo

这将在终端中打开cat标准输入,粘贴代码,然后按下ctrl-d(在此之前提到添加EOF字符并结束CAT进程)。 粘贴接收cat输入并将所有多行内容汇集到一个空格字符中。这将仅回显命令。
要执行命令,只需在末尾添加sh:
cat | paste -sd " "  - | xargs echo | sh

或者,我喜欢将输出作为别名命令放在.zshrc文件中。

alias mcmd='cat | paste -sd " "  - | xargs echo'

然后执行

> mcmd | sh

这将打开cat,粘贴您的多行命令,按下ctrl d,将执行多行命令作为一行命令 :)

示例命令

>    mcmd;
# now paste in your long command
> llvm-g++
    main.mm
    -o
    buildApp
    -w
    -g
    -std=c++14
    -L/System/Library/Frameworks/
    -framework
    CoreServices
     # now key press ctrl + d

whoop! 输出单行

 llvm-g++ main.mm -o buildApp -w -g -std=c++14 -L/System/Library/Frameworks/ -framework CoreServices

这对我很有帮助 - 我需要为一个单一的命令粘贴一个长列表的参数。我认为还有其他的方法可以做到,但这对我所需的非常有用。 - Mat Carlson

2
我很惊讶没有人提到这一点,但是你可以使用 fc 命令将所有命令粘贴到编辑器中并一次性运行它们。

1
一个例子会很有帮助。 - ragurney
我不确定示例会是什么样子?你只需要在命令行中输入fc - Patrick Stetz
然后你接下来要做什么? - majorgear
1
你只需粘贴想要运行的所有命令,就可以了。我希望我能举例说明,但我认为在终端中运行 fc 就可以展示它有多简单了。 - Patrick Stetz

2
iTerm完美处理多行命令,将多行命令保存为一个命令,然后我们可以使用Cmd+Shift+;浏览历史记录。
此处查看更多iTerm提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接