{}와 같은 replstr은 무엇인가요?

{}와 같은 replstr은 무엇인가요?

이 플래그에 의해 취해진 "replstr"에 대한 언급이 문서에 xargs있습니다 . -I나는 다음 명령을 실행하고 싶다는 것을 알았을 때 그것에 대해 읽기 시작했습니다 fswatch.

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

그리고 매뉴얼 페이지를 읽기 시작하세요xargs

-I replstr
        Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
        specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
        allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
        the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
        contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

생각해보면 "replstr"이라는 용어는 "인쇄 루프 문자열 평가 읽기"를 의미하는 것 같습니다. 이것이 그것의 약어입니까? 나는 그것을 가지고 놀기 시작했고, {}무슨 일이 일어나고 있는지 이해하려고 노력했지만, 내가 정말로 이해하고 있는지 확신할 수 없습니다.

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

예를 들어, echo {a..3}그것은 나에게 정말로 이해가 되지 않습니다. "여기서 이 문자열 목록을 교체"하는 작업을 수행하는 것처럼 보이지만 이것이 올바른 관점인지는 확실하지 않습니다. 또한 {}replstr이 특정 유형인지, 더 많은 유형이 있는지 또는 replstr이 중괄호 쌍 사이에 있는 것인지 확실하지 않습니다 . replstr에 대한 지침과 이를 처리하는 방법을 알고 싶습니다.

답변1

replstr"문자열 바꾸기" 또는 "문자열 바꾸기"를 의미합니다.

원래 replstr은 발견된 각 파일 이름으로 대체되는 명령 절로 {}처음 소개되었습니다 .findexec

find /tmp -name "foo*" -exec echo file {} found \;

두 파일이 패턴과 일치한다고 가정하면 다음과 같이 표시됩니다.

file foo1 found
file foo2 found 

xargs명령을 사용하면 표준 입력에 전달된 문자열에서 작성된 인수로 동일한 작업을 수행할 수 있으며 {}대체 문자열과 다른 것을 지정할 수도 있습니다.

기본 replstr에는 {}중괄호 안에 아무것도 없습니다. 후자는 이미 알고 있듯이 범위 또는 매개변수 확장과 같은 다른 목적으로 사용됩니다.

답변2

-I매개변수는 다음과 같이 작동합니다. -I whatever이는 리터럴 발생이 whatever명령 매개변수로 대체됨을 의미합니다. 데모:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

바라보다? xargs각 행 a, b및 를 가져와서 in c으로 바꿉니다 .fecho hey f hey f

관련 없는 {}.

-I옵션은 POSIX입니다. GNU는 호출되면 .. 처럼 동작하는 xargs더 이상 사용되지 않는 옵션을 문서화합니다 . 직접 호출하면 .. 처럼 동작합니다 . 이 경우 발생 항목이 대체됩니다. 분명히 다음 기능에서 영감을 얻었습니다 . 해당 술어.-i-iwhatever-I whatever-i-I {}{}{}find-exec

{a..b}반면 Bash 구문은 foo{a,b,c}bar"중괄호 확장"을 통해 처리됩니다. {}특별한 의미는 없으며 있는 그대로 명령에 전달됩니다. (그렇지 않으면 표준을 준수하는 일반적인 호출이 중단됩니다 find.)

답변3

{...}쉘 버팀대 확장는 목록 ( , 및 {a,b,c}으로 확장됨 )과 숫자 시퀀스 (숫자 , ... , , 로 확장됨 ) 또는 문자 ( , , , )를 지원합니다. (대괄호 확장은 사용된 자리표시자 와 무관합니다 ).abc{0..13}011213{a..d}abcd{}xargs

다소 이상한 순서로 확장 {a..3}ASCII 문자 테이블. a숫자가 아니기 때문에 둘 다 문자로 처리되며 a문자 코드 숫자 값 안과 사이의 모든 문자로 확장됩니다. 우연히 뒤에 나오 3므로 대문자와 숫자 9~3을 거쳐서 순서가 내려갑니다.a3

보시다시피, 이와 같은 범위에서 문자와 숫자를 혼합하는 것은 별로 유용하지 않지만 유사하고 정규 표현식 및 쉘 전역 변수에서는 유용 {a..z}할 수 있습니다 . (즉, 나머지 문자를 무시할 수 있는 경우입니다.){A..Z}[a-z][A-Z]

관련 정보