我一直在阅读“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
答案1
简单的答案是,因为前者需要它,而后者不需要。
该find
命令是一个单身的简单的 shell 命令,只需要一些不同的参数,并且有自己的结构。这些参数对 shell 来说没有意义,因此它不知道(
和 之间存在逻辑连接)
。整个命令可以写在一行上,只是更难阅读。
如果没有行延续,find
将使用默认的打印操作运行playground
,然后 shell 会尝试运行不带参数的命令(或者,如果您要从 中删除转义,则运行子 shell 中的(
命令):-type
(
find playground
\(
-type f
...
另一方面,if
复合语句是 shell 语法的一部分,并且 shell 知道需要哪些部分。在 the 之后then
必须有一个命令,最后是一个else
or fi
。整个结构也可以写在一行上,但是我们需要在else
和之前添加分号fi
。 (同样echo foo; echo bar
需要将分号或换行符视为两个命令。)
答案2
这是一个特别复杂的示例,因为其中一些\
是您所说的“行继续”,但其他一些是为了保护字符,因此 shell 不会解释它们,而是将它们传递给find
.具体来说,\(
、\)
和 的\;
存在是为了让 shell 不会解释转义字符并将它们按原样传递给find
。其余的,\
不是紧接在非空格字符之前的是行继续信号。
一般来说,如果你想破坏一个命令,你需要\
除非你打破其中之一“列表终止符”人物。因此,如果您在其中之一之后进行剪切,则不需要\
:
; & && || | |& ;;
例如,echo foo && echo bar
可以写为:
echo foo &&
echo bar
不需要\
。或者,同样的事情也可以写成:
echo \
foo \
&&
echo \
bar
\
请注意我如何在既不是命令结尾也不是列表终止符的地方使用when cut。
如果您在其他地方剪切命令,则需要\
.您不需要显示示例\
中的if ... then ... else ...
,因为在那里您没有剪切命令。每个命令都在自己的行上,这很好。\
如果你想打破一个,你只需要单身的命令到多行。
正如 @paul_pedant 在评论中正确指出的那样,如果使用单引号来转义以下内容,则可以使命令更加清晰find
:
find playground \
'(' \
-type f \
-not -perm 0600 \
-exec chmod 0600 {} ';' \
')' \
-or \
'('
other options...
')'