我一直在阅读“The Linux command line book”,我遇到了这个行继续符,我很困惑为什么我们将它与这个 find 命令一起使用:
find playground \
\( \
-type f \
-not -perm 0600 \
-exec chmod 0600 {} \; \
\) \
-or \
\(
other options...
\)
以及为什么我们没有在这个 if 语句中使用它:
if [ $x -eq 5 ]; then
echo "x equals 5."
else
echo "x does not equal 5."
fi
简单的答案是,因为前者需要它,而后者不需要。
该
find
命令是一个简单的shell 命令,它只接受许多不同的参数,并且有自己的结构。这些参数对shell没有意义,所以它不知道在(
和之间有逻辑联系)
。整个命令可以写在一行上,只是更难阅读。如果没有续行,
find
将playground
使用默认打印操作继续运行,然后 shell 将尝试运行(
不带参数的命令(或者,-type
如果要从 . 中删除转义符,则为子 shell 中的命令(
):另一方面,
if
复合语句是 shell 语法的一部分,shell 知道需要哪些部分。之后then
必须有一个命令,最后是一个else
orfi
。整个结构也可以写在一行上,但是我们需要在else
和之前添加分号fi
。(同样echo foo; echo bar
需要分号或换行符作为两个命令。)这是一个特别复杂的示例,因为其中一些
\
是您所谓的“行继续”,而另一些则是为了保护字符,因此 shell 不会解释它们,而是将它们传递给find
. 具体来说,\(
,\)
和\;
在那里,以便 shell 不会解释转义字符并将它们按原样传递给find
. 其余的\
,不在非空格字符之前的那些是行继续信号。通常,如果要中断命令,则需要使用 ,
\
除非您在“列表终止符”字符之一上中断。因此,如果您在其中之一之后削减,则不需要\
:例如,
echo foo && echo bar
可以写成:不需要
\
。或者,同样的事情也可以写成:\
请注意,在既不是命令结尾也不是列表终止符的地方切割时,我是如何使用的。如果您在其他任何地方剪切命令,则需要
\
. 您不需要显示示例\
中的if ... then ... else ...
,因为在那里,您没有剪切命令。每个命令都在自己的行中,这很好。\
如果您想将单个命令分成多行,您只需要。正如@paul_pedant 在评论中正确指出的那样,如果您使用单引号对以下内容进行转义,则可以使命令更加清晰
find
: