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应该取决于前一行,即使前一行很长并且人们不会立即发现反斜杠。