'{}' ';' 的特殊含义与查找

'{}' ';' 的特殊含义与查找

用户定义动作是 Linux 中 Bash 的一个功能。在 Linux 终端中如果我写

root@localhost: find ~ -type f -name 'foo*' -ok ls -l '{}' ';'

然后它检查是否有任何以以下开头的文件名foo并显示文件详细信息,如下所示:

< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2011-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2012-09-19 12:53 /home/me/foo.txt

只要我按下y它就会显示这些结果。

我的问题是这些字符的特殊含义是什么'{}' ';'

{}我在代表当前路径的地方读到并';'结束命令,但在 bash 中我从来没有以';'.

答案1

这些不是 bash 的一部分;find是一个独立程序并且不需要 bash 甚至 POSIX shell 来运行。例如,它可以很好地与 配合使用fish,但它不符合 POSIX 标准,并且不遵循与 bash 相同的语法规则。事实上,您完全可以在没有 shell 的情况下使用它(例如,在编程上下文中)。

这就是为什么(如果您使用的是 POSIX shell,或者在本例中具有类似规则的 shell)您希望使用带有某些参数的引号,find例如find . -name '*foo'.单引号中的字符串将被传递,而不执行任何替换或扩展。 shell 对此不做任何事情。如果您find . name *foo与 bash 一起使用,并且当前目录中恰好存在与该 glob 匹配的文件,那么您想要发生的事情可能不会发生。

如果您使用具有不同规则的 shell,则在使用 时必须考虑这些规则find。例如,您实际上不需要引用{}with bash,但如果您对 with 做同样的事情fish,您将得到find: missing argument to '-exec'.

大括号在 bash 中确实有意义——它们用于参数替换/扩展以及对命令进行分组。它们在 中具有类似的目的find,但解析它们的是find它们,而不是bash

答案2

虽然都有大括号{}分号; 在 bash 中具有特殊含义,在这种情况下,find解释它们的是命令本身,而不是 shell。命令使用与其命令相同-okfind语法,因此您可以在其手册页 ( )-exec的该部分找到完整的说明:man find

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a `\') or quoted to
          protect them from expansion by the shell.

相关内容