我知道这\
是一个转义字符,但是当我\
在 bash 中编写时,我有这样的东西:
System-Product-Name:~$ \
>
那么 bash 会等待一些指令吗?当我使用
System-Product-Name:~$ \
> ls
这是工作。但是当我使用
System-Product-Name:~$ cd Wideo \
> ls
bash: cd: too many arguments
那么反斜杠就像管道一样工作吗|
?我不这么认为。
当我使用这个命令时:
find . -name "FILENAME" -exec rm {} \;
为什么我需要终止它?我认为该命令find
找到了正确的文件,并将exec
它们从找到它们的路径中删除。如果没有这个,我所得到的信息-exec
就没有任何论据,我就无法理解。为什么我不能只使用
find . -name "FILENAME" -exec rm {}
?
我只有有关 man find 中 exec 的信息:
exec 显示与 -exec、-execdir、-ok 和 -okdir 相关的诊断信息
那么为什么我在使用 exec 时需要终止呢?例如当我使用
find . -name "FILENAME"
我不需要终止。
答案1
您应该区分行\
末尾的 ,这意味着“这不是行的末尾,该行继续下一行”(那么您的cd
命令有 2 个参数,太多了),而\
行内部则阻止下一个字符具有特殊含义。
然后,\;
在您的示例中,意味着给出find
一个文字;
作为参数。如果没有\
,则;
将对 shell 具有特殊含义,并将用作find
命令和下一个命令之间的分隔符。
当您与选项一起;
使用时,需要使用该参数,以便知道 with 给出的命令在哪里结束。另一种选择是两个参数和。您应该阅读手册以获取更多信息。find
-exec
find
-exec
{}
+
find(1)
答案2
以这种方式使用的 \ 字符通常称为“转义”下一个字符,以便 bash 将删除后面的字符的任何特殊含义,并将其视为文字字符,而不是将其作为 bash 命令行的一部分进行处理。看https://stackoverflow.com/a/3871336/1663987参考 bash 手册和其他信息。
因此对于
find . -name "FILENAME" -exec rm {} \;
它告诉 bash 在 find 命令参数中插入一个文字分号,而不是将其作为 bash 命令之间的分隔符进行处理(ala echo hello; echo world
)
为了
ls some\ file
它告诉 bash 将空格视为文件名的一部分,而不是分隔 ls 参数的字符。因此,它将显示ls
名为“some file”的单个文件的输出(而不是像刚刚ls some file
使用时那样的两个名为“some”和“file”的不同文件)。
为了
cd Wideo \
> ls
它告诉 bash 继续寻找参数而不是将换行符作为命令的结尾处理,以便命令最终像cd Wideo ls
.这种效果通常称为行延续。
答案3
“In bash”,它正在转义换行符。在 find 中,它正在逃逸;
。
通常,当您键入 时Enter
,shell 会将其读取为命令的结尾。如果你把\Enter
它解释为字面上的新行。
这里难题的第二部分是认识到命令和参数可以包含换行符。没有规定说他们不能。大多数人只是避免使用它们,因为它们不方便。
但是,以下是有效的文件名和ls
、cd
等的有效参数:
foo
bar
你不能只输入
cd foo
bar
在你的 shell 中,因为它会尝试cd foo
然后运行bar
.但你应该能够做到
cd 'foo
bar'
有了find
,你就有了像 这样的语法find -exec some_command
。由于some_command
可以包含空格,find
因此将查找;
以找出命令结束的位置。如果你只是输入find -exec bar ;
,bash 会认为调用;
结束find
,所以它只会传递-exec bar
给 find 。
您需要告诉 shell 您的意思是字面字符;
。您可以使用\;
, 也可以使用 来执行此操作find -exec bar ';'
。man find
说:
find 的所有以下参数都被视为命令的参数,直到出现由 ';' 组成的参数遇到。
这意味着参数;
必须遵循 的命令-exec
。