xargs가 서브쉘에 전달될 때 첫 번째 인수를 건너뛰는 이유는 무엇입니까?

xargs가 서브쉘에 전달될 때 첫 번째 인수를 건너뛰는 이유는 무엇입니까?

xargs를 사용하여 한 줄에 여러 명령을 호출하는 방법을 찾았습니다.findutils에서는 xargs에서 쉘을 호출하는 것이 좋습니다.이와 같이:

$ find ... | xargs sh -c 'command $@'

흥미롭게도 xargs를 이와 같이 사용하면 어떤 이유로 첫 번째 인수를 건너뜁니다.

$ seq 10 | xargs bash -c 'echo $@'
2 3 4 5 6 7 8 9 10
$ seq 10 | xargs -n2 bash -c 'echo $@'
2
4
6
8
10

내 쉘 또는 xargs 버전에 문제가 있습니까? 문서가 부정확합니까?

사용xargs(GNU findutils) 4.4.2그리고GNU bash, 버전 4.3.11(1) - 출시됨.

답변1

[bash] 매뉴얼 페이지는 다음과 같이 말합니다: "-c string-c 옵션이 있으면 문자열에서 명령을 읽습니다. 문자열 뒤에 매개변수가 있으면 $0부터 시작하는 위치 매개변수에 할당됩니다." - 핵심은$0;이는 명령 이름이 첫 번째 인수가 되어야 함을 의미합니다.

seq 10 | xargs sh -c 'echo $@; echo $0' sh
1 2 3 4 5 6 7 8 9 10
sh

답변2

xargs가 서브쉘에 전달될 때 첫 번째 인수를 건너뛰는 이유는 무엇입니까?

그러나 실제로는 그렇지 않습니다. Bash는 첫 번째 인수를 $0에 할당합니다.

$ seq 10 | xargs -n2 bash -c 'echo $0'
1
3
5
7
9

$@... 로 확장됩니다 $1 $2 $3. 따라서 의 값은 $0에 포함되지 않습니다 $@.

관련 정보