xargs -I가 제대로 작동하려면 sh에 인수를 전달하기 전에 이중 대시가 필요한 이유는 무엇입니까?

xargs -I가 제대로 작동하려면 sh에 인수를 전달하기 전에 이중 대시가 필요한 이유는 무엇입니까?

문제의 명령어입니다

 find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename $1) ' -- file

따라서 이중 대시가 없으면 file으로 전달되지 않고 sh그대로 인식 됩니다 $1. 왜 그런 겁니까? 이로 인해 --후속 매개변수가 명령줄 옵션으로 인식되지 않는다는 것을 알고 있습니다 . 하지만 file앞에 대시가 없기 때문에 명령줄 옵션으로 인식할 이유는 없어 보입니다.

답변1

옵션이 아닌 첫 번째 매개변수는 sh가 됩니다 $0. sh스크립트에서 호출 되면 이는 스크립트의 경로입니다. 를 실행하면 sh -c SOMECOMMAND쉘은 매개변수를 에 넣는 것 외에는 매개변수에 대해 아무 작업도 수행하지 않습니다 $0. 관례적으로 -cwhere is the name or path of the script 와 유사하게 에 전달된 스크립트의 이름입니다 sh /path/to/script.$0

대부분의 명령과 달리 --특수 목적 플래그가 아닌 일반 매개변수로 처리됩니다. 따라서 --실제로 는 $0다음 매개변수 대신으로 사용됩니다.

$ sh -c 'echo $1' hello            

$ sh -c 'echo $0' hello
hello
$ sh -c 'echo $0; echo $1' hello world
hello
world
$ sh -c 'echo $0; echo $1' -- hello
--
hello

xargs이는 모든 인수를 명령 sh에 전달하는 것과 관련이 없습니다 .sh

답변2

위의 예에서 는 과 사이의 차단기 --역할을 합니다 . 문자열을 인수 로 강제합니다 .sh -c 'echo $(basename $1) 'filefile$1sh

위의 내용은 다음과 같이 단순화될 수 있습니다.

$ find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename file) '

관련 정보