예
{}
나는 최근에 여는 중괄호와 닫는 중괄호 사이에 아무 것도 없이 중괄호 쌍을 명령이나 옵션에 대한 인수로 사용하는 예를 발견했습니다 .
cat foo | xargs -I{} echo {}
find . -size 0 -exec rm -i {} \;
문서 없음
내 문제는 문서를 찾을 수 없다는 것입니다GNU 배쉬 매뉴얼{}
위 예제의 맥락에서 사용법을 설명합니다.
내 생각엔 이건 아닌 것 같아매개변수 확장, 매개변수 확장에서는 에 표시된 대로 달러 기호가 중괄호 앞에 있어야 하기 때문입니다 ${}
.
그건 하나가 될 수 없어버팀대 확장둘 중 하나 는 및가 {x..y[..incr]}
선택 사항이 아닌 형식을 취하기 때문입니다 .x
y
또한 그것은명령 그룹화또는 for가 {}
매개변수로 사용됩니다.
질문
{}
일반적으로 중괄호 쌍은 이를 허용하는 명령에 대한 인수로서 무엇을 의미합니까?as 매개변수의 사용법을 설명하는 문서는 어디에서 찾을 수 있나요
{}
?
답변1
이 중괄호는 bash에 의해 예약되어 있으며 find
각각 xargs
및 매뉴얼 페이지에 설명되어 있습니다.
man find
-exec
주문하다;
구현하다주문하다;반환 상태가 0이면 참입니다. find에 대한 다음 인수는
;
다음으로 구성된 인수가 발견될 때까지 명령에 대한 인수로 처리됩니다 . 문자열은{}
일부 버전에서와 같이 별도의 인수뿐만 아니라 명령 인수에 나타나는 모든 곳에서 처리되는 현재 파일 이름으로 대체 됩니다find
.\
이 옵션을 사용하는 방법에 대한 예는 예 섹션을 참조하십시오-exec
. 지정됨 주문하다일치하는 각 파일에 대해 한 번씩 실행합니다. 이 명령은 시작 디렉터리에서 실행됩니다. 이 작업을 사용하면 피할 수 없는 보안 문제가 있으므로-exec
이 옵션을 사용해야 합니다-execdir
.
-exec
주문하다{}
+
이 작업의 변형은
-exec
지정된 작업을 실행합니다.주문하다그러나 명령줄은 선택된 각 파일 이름을 끝에 추가하여 작성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령줄은xargs
해당 명령줄과 거의 동일한 방식으로 구축됩니다.{}
이 인스턴스는 명령에 하나만 허용됩니다. 이 명령은 시작 디렉터리에서 실행됩니다. 오류가 발생 하면find
즉시 종료되는 경우가 있으므로 보류 중인 일부 명령이 전혀 실행되지 않을 수도 있습니다. 이 변형은-exec
항상 true를 반환합니다.
-execdir
주문하다;
-execdir
주문하다{}
+
와 유사
-exec
하지만 지정된 명령은 일반적으로 검색을 시작한 디렉터리가 아닌 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다. 이는 일치하는 파일에 대한 경로를 구문 분석하는 동안 경쟁 조건을 방지하므로 명령을 호출하는 더 안전한 방법입니다.-exec
작업 과 마찬가지로+
양식은-execdir
일치하는 여러 파일을 처리하기 위해 명령줄을 작성하지만 지정된 명령 호출은 동일한 하위 디렉터리에 존재하는 파일만 나열합니다. 이 옵션을 사용하는 경우$PATH
환경 변수가 참조되지 않도록 해야 합니다.
. 그렇지 않으면 공격자가 실행할 디렉터리에 적절한 이름의 파일을 남겨두어 원하는 명령을 실행할 수 있습니다-execdir
. 항목이$PATH
비어 있거나 절대 디렉터리 이름이 아닌 경우에도 마찬가지입니다 . 오류가 발생 하면find
즉시 종료되는 경우가 있으므로 보류 중인 일부 명령이 전혀 실행되지 않을 수도 있습니다. 작업의 결과는 해당 작업이 사용되는지+
아니면 변형이 사용되는지 에 따라 달라집니다.;
-execdir
주문하다{}
+
항상 true를 반환하지만-execdir
주문하다{}
;
다음의 경우에만 true를 반환합니다.주문하다0을 반환합니다.
man xargs
-I
교체-str발생 교체교체-str초기 인수에서는 표준 입력에서 이름을 읽습니다. 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다. 의미
-x
하고-L
1
.
-i
[교체-str],--replace
[=
교체-str]이 옵션의 동의어는 다음과 같습니다.
-I
교체-str만약에교체-str지정됨. 만약에교체-str누락된 매개변수는 와 동일한 효과를 갖습니다-I{}
. 이 옵션은 더 이상 사용되지 않습니다-I
. 대신 사용하세요.
편집 : 그리고 여기왜bash는 중괄호를 무시합니다.
man bash
{
목록;
}
목록 현재 쉘 환경에서 실행하면 됩니다. 목록개행 또는 세미콜론으로 종료되어야 합니다. 이를 그룹 명령이라고 합니다. 반환 상태는 목록의 종료 상태입니다. 메타 문자와는 달리(그리고),{그리고}은 예약어이므로 예약어 인식이 허용되는 곳에 나타나야 합니다. 단어 분리를 유발하지 않으므로 공백이나 기타 쉘 메타 문자로 목록과 구분해야 합니다.
강조하기 위해:목록은 줄 바꿈 또는 세미콜론으로 끝나야 합니다..