Why are the backslash and semicolon required with the find command's -exec option?

隐身守侯 提交于 2019-11-26 07:36:09

问题


I have begun to combine different commands in the linux terminal. I am wondering why the backslash and semicolon are required for a command such as:

find ./ -name \'blabla\' -exec cp {} ./test \\;

when a simple cp command is simply:

cp randomfile ./test

without the \\;

Are they to clearly indicate the end of a command, or is it simply required in the documentation? What is the underlying principle?

Thank you!


回答1:


The backslash before the semicolon is used, because ; is one of list operators (or &&, ||) for separating shell commands. In example:

command1; command2

The find utility is using ; or + to terminate the shell commands invoked by -exec.

So to avoid special shell characters from interpretation, they need to be escaped with a backslash to remove any special meaning for the next character read and for line continuation.

Therefore the following example syntax is allowed for find command:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

See also:

  • Using semicolon (;) vs plus (+) with exec in find
  • Simple unix command, what is the {} and \; for



回答2:


from "man find":

All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encountered.

find needs to know when the arguments of exec are terminated. It is natural to terminate a shell command with ; because also the shell uses this character. For the very same reason such a character must be escaped when inserted through the shell.



来源:https://stackoverflow.com/questions/20913198/why-are-the-backslash-and-semicolon-required-with-the-find-commands-exec-optio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!