Bash - 多行多命令

Bash - 多行多命令

我有一个很长的 Bash 命令。此命令如下所示:

grunt build && mv file1.txt ../../results && mv file2.txt ../../logs && mv file3.txt ../home && mv file4.txt ../../../deployments

我正在将此命令添加到README.md文件中。我想使它 a) 易于阅读和 b) 可复制粘贴。我的问题是,如何为 Bash 制作一个易于阅读的多命令行?

我尝试了以下方法,但没有效果:

grunt build && \
  mv file1.txt ../../results && \ 
  mv file2.txt ../../logs && \ 
  mv file3.txt ../home && \
  mv file4.txt ../../../deployments

谢谢。

答案1

解释

您可以在下一行使用反斜杠 ( \) 继续命令,但前提是反斜杠紧接在终止行的换行符之前。在您的代码中,几个反斜杠后有空格。请删除它们。

注意&&行末对于 Bash 来说已经足够了继续从下一行读取命令,即使在后面有未加引号且未转义的空格&&。但如果有转义空格则不行,就像你的情况一样。


例子

这将起作用:

true   && \
echo b   # ^ no space here, newline character immediately after \

这会起作用:

true   &&         
echo b # ^^^^^^^^^ zero or more spaces, they don't matter

(改为true学习false确实&&能起到作用。)

但这不起作用*:

true   && \ 
echo b   # ^ escaped space here, it breaks things

转义空格就像引号内的空格。这也不起作用*:

true   && ' '
echo b   # ^ quoted space here, it breaks things

* 好吧,如果你的操作系统中有一个名为(文字空间) 的命令,它就会起作用。这在技术上是可行的,但非常非常罕见(如果我看到这样的可执行文件,我会立刻闻到一些可疑的东西)。仍然是代码片段不会按你希望的方式工作因为&&将连接true,而不是trueecho


边注

代码如下:

foo && \
bar

(其中\正确地转义了换行符)是有效的,但却是多余的。它可以是:

foo &&
bar

有些用户不喜欢上述任何一种情况,因为通过检查行的开头,无法判断是否bar应该有条件地或无条件地运行。需要检查第一行(可能很长)的结尾才能找到&&

因此人们可能更喜欢这样:

foo \
&& bar

这里\是强制性的,但显然bar应该取决于前一行,即使前一行很长而且不能立即发现反斜杠。

相关内容