bash 和 find 中的 \ 是什么意思?

bash 和 find 中的 \ 是什么意思?

我知道这\是一个转义字符,但是当我\在 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-execfind-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它解释为字面上的新行。

这里难题的第二部分是认识到命令和参数可以包含换行符。没有规定说他们不能。大多数人只是避免使用它们,因为它们不方便。

但是,以下是有效的文件名和lscd等的有效参数:

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

相关内容