find 명령에서 '{}'과 {}의 차이점은 무엇입니까?


18

에서 문서 , 내가 사용 두 가지를 참조하십시오

find . -type f -exec file '{}' \;

find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \

4
물론 찾기, 명령과는 아무런 관련이없는 것으로 보이며 대신 명령을 호출하기위한 적절한 인용과 관련이 있습니다.
Zoredache

1
배쉬보다는 생선으로 먹어보십시오.
Charles Duffy

답변:


24

를 들어 bash'{}'{}교환 할 수있다. 모든 쉘 (예 :)에는 해당되지 않습니다 fish.

작은 따옴표 안에 인수를 넣으면 중괄호가로 보내 져야 함을 명시 적으로 나타냅니다 find. 사용법에 따라 bash 쉘은 때때로 중괄호의 내용을 대체합니다.

아래에서 볼 수 있듯이 bash는 빈 대괄호를 대체하지 않으며 명령으로 전달됩니다. 를 들어 find명령, 그건 문제가되지 않습니다.

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

4
bash는 중요하지 않습니다. 물고기와 상관 없습니다.
Charles Duffy

1
나는 대체 할 것 " are interchangeable"와 함께 " are interchangeable in some shells, not in all of them. ALWAYS use the single quotes to make sure they get passed as-is to the find command"(당신은 항상 (일어날 경우에도 올바른 방법을 사용하여 확인하여 좋은 습관 시작) 모호한 일을 할 수있는 시스템에있을?)
올리비에 Dulac

9

거의 모든 쉘 인터프리터를 사용할 수 있기 때문에 '{}'와의 차이점은 전혀 없습니다 {}.

작은 따옴표는 일반적으로 포함 된 문자열이 다른 것으로 대체되지 않도록 보호하는 데 사용됩니다.

  • 'a b' 따옴표없이 두 개의 단일 문자 매개 변수가되는 단일 세 문자 매개 변수입니다.
  • '$b' 문자 그대로 달러 기호 다음에 문자 b가옵니다. 따옴표가 없으면 b 변수에 무엇이든지 포함되어 있고 설정되지 않은 경우에는 아무것도 없습니다.
  • '!!' 인용 부호가없는 상태에서 문자 그대로 느낌표가 표시되고 일부 대화식 쉘을 사용하면 기록에있는 마지막 명령으로 확장됩니다.
  • '*' 인용되지 않은 문자 별표로, 현재 디렉토리에서 숨겨진 파일 이름 목록으로 대체됩니다.

POSIX 표준이나 주류 껍질도로 ( sh(Bourne의), ksh, bash, ash, dash, zsh, csh, tcsh)를 확장{} 뭔가 다른, 따옴표는 필요하지 않습니다.

그러나 빈 문자열 fish로 확장되는 이국적인 쉘 ( {}예 :

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

아마도 GNU find문서 {}가 따옴표 나 백 슬래시로 해석하는 것을 막으라고 제안 하는 이유 일 것입니다 .


9

대부분의 사용자 (특히 POSIX 셸을 사용하는 사용자)에게는 차이가 없습니다.

GNU 매뉴얼 페이지의 예제 섹션에 따르면 find:

중괄호는 작은 따옴표로 묶어 쉘 스크립트 문장 부호로 해석되지 않도록합니다.

나는 GNU 매뉴얼 페이지의 저자가주의를 기울이는 데 잘못되어 있다고 생각하지만 매뉴얼 페이지의 모든 예제가 중괄호를 인용하지는 않습니다. 이 공식 GNU 찾기 문서에서 예제 또한 인용 생략합니다.

POSIX / 단일 UNIX 사양예에서 옵션 과 함께 사용 하면 중괄호가 인용되지 않습니다-exec .

POSIX 쉘의 경우 매개 변수 확장 은 중괄호 안에 특수 매개 변수가있는 경우에만 발생하지만 빈 중괄호는 포함하지 않습니다 .

Bash 셸에는 이식 불가능한 기능으로 괄호 확장 이 포함되어 있지만 괄호 안에 쉼표 나 점이 포함경우 에만 이러한 패턴이 확장 됩니다 . Bash는 또한 명령 그룹화에 중괄호를 사용 하지만 실제로 중괄호 내에 명령 그룹 이 없으면 발생하지 않습니다 .

마지막으로, 나는 실행 시도 find -exec ls -l {} \;에서 sh, dash그리고 tcsh하지만, 이러한 쉘 중 어느 것도 확장하지 {}무엇에. 다른 사람들이 지적했듯이, fish쉘은 {}특별히 취급 하지만 POSIX 쉘은 아닙니다 (작성자와 사용자가 이점이라고 생각합니다). 그것은 괄호 인용 할 해하지 않습니다 를 생략 대해 죄책감을 느끼지한다 물고기 쉘을 사용하지 않는하지만 게으른 타이피스트를.


그들은 잘못하지 않고 사람들이 올바른 방법을 사용하도록 노력하고 있습니다 (즉, '{}'대신 사용 {}). 그들은 쉘이 {}해석하지 않고 find 명령으로 보내도록 합니다 (위에서 @ Charles-Duffy가 언급했듯이 물고기를 사용하면) 그것은 해석합니다 {}하지만 '{}'당신이 쉘에 후자를 사용할 필요가 있으므로, 따라서, 항상 사용 (그리고 몇몇 다른 사람에!). '{}'의 모호함에 물린 피하기 위해{}
올리비에 Dulac

6

이것은 쉘의 구문에 따라 다릅니다. 확실하지 않으면 반향하십시오!

이것을 실행

echo '{}'

이.

echo {}

동일한 출력을 생성하면 쉘에 대한 대답은 예입니다. 다른 사람들이 지적했듯이, 적어도 배쉬에서는 그렇고 물고기에서는 그렇지 않습니다. 출력은 주어진 명령의 맨 페이지를 참조해야합니다.


편리하게 사용 echo하려면 전체 명령 행을 접두사 로 사용하여 실제 명령과 모든 인수가 포함 된 쉘이 실제로 호출하는지 확인할 수 있습니다. 그러나 명령과 인수로 구성된 목록은 각각 비어 있거나 공백이있는 실제 문자열 배열이지만 에코는 공백으로 구분 된 목록으로 모호하게 인쇄합니다.

이 좀 더 장황한 에코 명령으로 확인할 수있는 것처럼 (길레 멧 인용 인수 표시),

#!/bin/sh
for a in "$@"; do
    printf '«%s» ' "$a"
done
echo ''

이것을 명령 행에 입력하면

find 'My Documents and Settings' -type f -exec file {} \;

이것은 bash를 의미합니다.

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «{}» «;»

그리고 이것은 물고기에서 :

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «» «;»

일반적인 조언으로 인용해도 결코 아프지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.