사용자 정의 작업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.