我有一个很长的 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
和,而不是
true
和echo
。
边注
代码如下:
foo && \
bar
(其中\
正确地转义了换行符)是有效的,但却是多余的。它可以是:
foo &&
bar
有些用户不喜欢上述任何一种情况,因为通过检查行的开头,无法判断是否bar
应该有条件地或无条件地运行。需要检查第一行(可能很长)的结尾才能找到&&
。
因此人们可能更喜欢这样:
foo \
&& bar
这里\
是强制性的,但显然bar
应该取决于前一行,即使前一行很长而且不能立即发现反斜杠。