에서 문서 , 내가 사용 두 가지를 참조하십시오
find . -type f -exec file '{}' \;
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
에서 문서 , 내가 사용 두 가지를 참조하십시오
find . -type f -exec file '{}' \;
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
답변:
를 들어 bash
쉘 '{}'
과 {}
교환 할 수있다. 모든 쉘 (예 :)에는 해당되지 않습니다 fish
.
작은 따옴표 안에 인수를 넣으면 중괄호가로 보내 져야 함을 명시 적으로 나타냅니다 find
. 사용법에 따라 bash 쉘은 때때로 중괄호의 내용을 대체합니다.
아래에서 볼 수 있듯이 bash는 빈 대괄호를 대체하지 않으며 명령으로 전달됩니다. 를 들어 find
명령, 그건 문제가되지 않습니다.
$ echo {}
{}
$ echo {1}
{1}
$ echo {1,3}
1 3
$ echo '{1,3}'
{1,3}
" 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"
(당신은 항상 (일어날 경우에도 올바른 방법을 사용하여 확인하여 좋은 습관 시작) 모호한 일을 할 수있는 시스템에있을?)
거의 모든 쉘 인터프리터를 사용할 수 있기 때문에 '{}'
와의 차이점은 전혀 없습니다 {}
.
작은 따옴표는 일반적으로 포함 된 문자열이 다른 것으로 대체되지 않도록 보호하는 데 사용됩니다.
'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
문서 {}
가 따옴표 나 백 슬래시로 해석하는 것을 막으라고 제안 하는 이유 일 것입니다 .
대부분의 사용자 (특히 POSIX 셸을 사용하는 사용자)에게는 차이가 없습니다.
GNU 매뉴얼 페이지의 예제 섹션에 따르면 find
:
중괄호는 작은 따옴표로 묶어 쉘 스크립트 문장 부호로 해석되지 않도록합니다.
나는 GNU 매뉴얼 페이지의 저자가주의를 기울이는 데 잘못되어 있다고 생각하지만 매뉴얼 페이지의 모든 예제가 중괄호를 인용하지는 않습니다. 이 공식 GNU 찾기 문서에서 예제 또한 인용 생략합니다.
POSIX / 단일 UNIX 사양 의 예에서 옵션 과 함께 사용 하면 중괄호가 인용되지 않습니다-exec
.
POSIX 쉘의 경우 매개 변수 확장 은 중괄호 안에 특수 매개 변수가있는 경우에만 발생하지만 빈 중괄호는 포함하지 않습니다 .
Bash 셸에는 이식 불가능한 기능으로 괄호 확장 이 포함되어 있지만 괄호 안에 쉼표 나 점이 포함 된 경우 에만 이러한 패턴이 확장 됩니다 . Bash는 또한 명령 그룹화에 중괄호를 사용 하지만 실제로 는 중괄호 내에 명령 그룹 이 없으면 발생하지 않습니다 .
마지막으로, 나는 실행 시도 find -exec ls -l {} \;
에서 sh
, dash
그리고 tcsh
하지만, 이러한 쉘 중 어느 것도 확장하지 {}
무엇에. 다른 사람들이 지적했듯이, fish
쉘은 {}
특별히 취급 하지만 POSIX 쉘은 아닙니다 (작성자와 사용자가 이점이라고 생각합니다). 그것은 괄호 인용 할 해하지 않습니다 를 생략 대해 죄책감을 느끼지한다 물고기 쉘을 사용하지 않는하지만 게으른 타이피스트를.
'{}'
대신 사용 {}
). 그들은 쉘이 {}
해석하지 않고 find 명령으로 보내도록 합니다 (위에서 @ Charles-Duffy가 언급했듯이 물고기를 사용하면) 그것은 해석합니다 {}
하지만 '{}'
당신이 쉘에 후자를 사용할 필요가 있으므로, 따라서, 항상 사용 (그리고 몇몇 다른 사람에!). '{}'
의 모호함에 물린 피하기 위해{}
이것은 쉘의 구문에 따라 다릅니다. 확실하지 않으면 반향하십시오!
이것을 실행
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» «» «;»
일반적인 조언으로 인용해도 결코 아프지 않습니다.