명령 및 옵션에 대한 인수로 묶는 중괄호 {} 사용


11

최근 {}에 여는 중괄호와 닫는 중괄호 사이에 명령과 옵션에 대한 인수로 아무것도 사용하지 않는 괄호 쌍을 사용하는 예를 찾았습니다 .

cat foo | xargs -I{} echo {}

find . -size 0 -exec rm -i {} \;

문서가 없습니다

내 문제는 GNU Bash Manual{} 에서 위 예제와 같은 컨텍스트에서 사용법을 설명 하는 문서를 찾을 수 없다는 것 입니다.

필자는 매개 변수 확장 에서 달러 기호를 묶는 중괄호 앞에 와야하므로 매개 변수 확장 이라고 생각하지 않습니다 ${}.

그것은 될 수 없습니다 중괄호 확장 이의 형태를 취하고 있기 때문에 어느 {x..y[..incr]}xy선택 사항이 아니다.

인수로 사용 되기 때문에 명령 그룹화 도 될 수 없습니다 {}.

질문

  1. {}일반적으로 한 쌍의 묶는 중괄호 는 그것을 받아들이는 명령에 대한 인수로 무엇을 의미합니까?

  2. {}인수 사용법을 설명하는 설명서는 어디서 찾을 수 있습니까 ?


일부 명령이 옵션을 사용할 수 있습니다 {}- 의미 targets와 함께,에 행동 find명령, 그것의 제거는 / rm파일을 발견했다.
Tuyen Pham

답변:


16

이 중괄호는 배쉬에 의해 홀로 남겨집니다. 이들은 각각 find및 에 속하며 xargs해당 맨 페이지에 설명되어 있습니다.

man find

-exec 명령 ;

명령을 실행 ; 0 상태가 반환되면 true입니다. 찾은 다음의 모든 인수는 구성된 인수 ;가 발생할 때까지 명령에 대한 인수로 간주 됩니다. 문자열 {}은 일부 버전에서와 같이 단독 인수가 아닌 명령 인수에서 발생하는 모든 위치에서 처리되는 현재 파일 이름으로 바뀝니다 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

초기 인수에서 replace-str 발생을 표준 입력에서 읽은 이름 으로 바꾸 십시오. 또한 인용되지 않은 공백은 입력 항목을 종료하지 않습니다. 대신 구분 기호는 개행 문자입니다. 의미 -x-L 1.

-i[ replace-str ], --replace[ =replace-str ]

이 옵션은 동의어입니다 -I-str에 교체 할 경우 교체-STR이 지정됩니다. 는 IF 교체-STR 인수가없는, 효과는 동일하다 -I{}. 이 옵션은 더 이상 사용되지 않습니다. 사용하는 -I대신.

편집 : 여기 배쉬 그 중괄호를 무시가 :

man bash

{ 명부; }

list 는 단순히 현재 쉘 환경에서 실행됩니다. 리스트 는 개행 또는 세미콜론으로 끝나야합니다. 이것을 그룹 명령이라고합니다. 반환 상태는 list의 종료 상태입니다. 메타 문자와 달리주의 () , {} 예약 된 단어와 예약 된 단어가 인식 할 수 있도록 허용되는 경우 발생해야합니다. 단어 분리를 일으키지 않기 때문에 공백이나 다른 쉘 메타 문자로 목록에서 분리해야합니다.

강조 : list는 개행 또는 세미콜론으로 끝나야 합니다.


1
감사합니다! 나는 글을 쓴 사람이 실제로 의미 man xargs하는 바를 설명 {}하지도 않았고, 저자 -exec가의 맨 페이지에 있는 설명으로 독자를 방향을 바꾸지 않았거나 말장난하지도 않았다 find.
Niko Gambt 2019 년

@NikoGambt-동정합니다 ...
tink

5
@NikoGambt 음, {}는 더 이상 사용되지 않는 -i의 기본값을 제외하고는 xargs에 아무런 의미가 없습니다. 그 이상으로 어떤 설명이 필요한지 잘 모르겠습니다. 당신이 게시 한 예제에서, 그것은 또한 xargs -Iab echo ab; 순전히 임의의 선택입니다.
Random832

@ Random832로 더 많은 테스트를 수행 한 후 -I해당 옵션이 실제로 수행하는 작업을 이해합니다. 예, {}당신이 말한대로 임의적입니다. 나는 단지 설명에 혼란 스러웠다 If the replace-str argument is missing, the effect is the same as -I{}. 경우 -I인수없이 동일하게했다 -I{}, 다음 cat foo | xargs -I echo {}실행하는 것과 동일한 결과를 것이다 cat foo | xargs -I{} echo {}. 그러나 그것들은 동일하지 않습니다. 전자는 오류이며 오류 메시지를 더 혼란스럽게 한 것은 xargs: {}: No such file or directory구현 때문입니다.
Niko Gambt

1
@NikoGambt -I(대문자 I) 는 인수없이 실행할 수 없습니다 . 의 주장 -Iecho입니다. 이것은와의 주요 차이점 -I이며 -i(필수 인수가없는 옵션이 일반적이지 않고 혼동되기 때문에 -i가 더 이상 사용되지 않는 이유)
Random832
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.