Bash - 跨多行的多个命令

Dev*_*Dev 9 bash shell command-line

我有一个很长的 Bash 命令。这个命令看起来像这样:

grunt build && mv file1.txt ../../results && mv file2.txt ../../logs && mv file3.txt ../home && mv file4.txt ../../../deployments
Run Code Online (Sandbox Code Playgroud)

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

我尝试了以下方法,但没有成功:

grunt build && \
  mv file1.txt ../../results && \ 
  mv file2.txt ../../logs && \ 
  mv file3.txt ../home && \
  mv file4.txt ../../../deployments
Run Code Online (Sandbox Code Playgroud)

谢谢。

Kam*_*ski 18

解释

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

&&行尾的note足以让 Bash继续从下一行读取命令,即使 后有未加引号、未转义的空格&&。但如果有一个逃逸的空间,就像你的情况一样。


例子

这将起作用:

true   && \
echo b   # ^ no space here, newline character immediately after \
Run Code Online (Sandbox Code Playgroud)

这会起作用:

true   &&         
echo b # ^^^^^^^^^ zero or more spaces, they don't matter
Run Code Online (Sandbox Code Playgroud)

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

但这行不通*:

true   && \ 
echo b   # ^ escaped space here, it breaks things
Run Code Online (Sandbox Code Playgroud)

转义的空格就像引用的空格。这也行不通*:

true   && ' '
echo b   # ^ quoted space here, it breaks things
Run Code Online (Sandbox Code Playgroud)

* 好吧,如果你的操作系统中有一个名为 (literal space) 的命令,它就会起作用。这在技术上是可行的,但非常非常不常见(如果我看到这样的可执行文件,我会立即闻到一些可疑的味道)。该代码片段仍然无法按照您希望的方式工作,因为&&将连接trueand ,而不是trueand echo


边注

代码如下:

foo && \
bar
Run Code Online (Sandbox Code Playgroud)

\正确转义换行符的地方)是有效的,但也是多余的。有可能:

foo &&
bar
Run Code Online (Sandbox Code Playgroud)

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

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

foo \
&& bar
Run Code Online (Sandbox Code Playgroud)

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