'{}' ';' 특별한 의미 및 검색

'{}' ';' 특별한 의미 및 검색

사용자 정의 작업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 쉘도 필요하지 않습니다. 예를 들어, bash와 잘 작동 fish하지만 POSIX와 호환되지 않으며 bash와 동일한 구문 규칙을 따르지 않습니다. 실제로 쉘 없이도 사용할 수 있습니다(예: 프로그래밍 컨텍스트에서).

그렇기 때문에 (POSIX 쉘을 사용하거나 이 경우 유사한 규칙이 있는 쉘을 사용하는 경우) 일부 매개변수와 함께 따옴표를 사용하려는 것입니다. find예를 들어 find . -name '*foo'작은따옴표 안의 문자열은 대체 또는 확장을 수행하지 않고 전달됩니다. 쉘은 이에 대해 아무것도 하지 않습니다. bash와 함께 사용 find . name *foo하고 해당 glob과 일치하는 파일이 현재 디렉터리에 존재한다면 원하는 일이 발생하지 않을 수 있습니다.

다른 규칙이 있는 쉘을 사용하는 경우 이를 사용할 때 이러한 규칙을 고려해야 합니다 find. 예를 들어 실제로 {}를 사용하여 인용할 필요는 없지만 bash을 사용하여 동일한 작업을 수행하면 fish을 얻게 됩니다 find: missing argument to '-exec'.

중괄호는 bash에서 의미가 있습니다. 매개변수 대체/확장 및 명령 그룹화에 사용됩니다. 에서는 유사한 목적을 수행 find하지만 에서 구문 분석하는 것은 find가 아니라 입니다 bash.

답변2

{중괄호 와 }세미콜론이 있지만; 하다bash에서는 특별한 의미를 가집니다. 이 경우 find이를 해석하는 것은 쉘이 아니라 명령 자체입니다. 명령은 해당 명령과 동일한 구문을 사용하므로 -ok매뉴얼 find페이지()의 이 섹션에서 -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.

관련 정보