
문서에는 플래그가 사용하는 xargs
"replstr"에 대한 언급이 있습니다 -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은 {}
. 이는 발견된 각 파일 이름으로 대체되는 find
명령 절로 처음 도입되었습니다 . 예:exec
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
각 줄을 가져와 in 대신 대체했습니다 .a
b
c
f
echo 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}
로 확장 ) 과 같은 목록과 (숫자 , ... , 로 확장 ) 또는 문자 ( , , , ) 와 같은 일련의 숫자를 지원합니다 . (중괄호 확장은 에서 사용하는 자리 표시자 와 아무 관련이 없습니다 ).a
b
c
{0..13}
0
1
12
13
{a..d}
a
b
c
d
{}
xargs
확장되는 다소 이상한 순서 {a..3}
는ASCII 문자 테이블. 숫자가 아니기 때문에 둘 다 문자로 간주되며 확장은 문자 코드의 숫자 값 사이 a
의 모든 문자입니다 . 공교롭게도 가 뒤에 오므 로 시퀀스는 대문자와 숫자 9에서 3을 거쳐 아래쪽으로 진행됩니다.a
3
a
3
보시다시피, 이와 같은 범위에서 문자와 숫자를 혼합하는 것은 그다지 유용하지 않지만 {a..z}
유사 {A..Z}
하고 정규 표현식 및 쉘 글로브에서도 유용할 수 [a-z]
있습니다 [A-Z]
. (즉, 나머지 문자를 무시할 수 있는 경우입니다.)