문제의 명령어입니다
find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename $1) ' -- file
따라서 이중 대시가 없으면 file
으로 전달되지 않고 sh
그대로 인식 됩니다 $1
. 왜 그런 겁니까? 이로 인해 --
후속 매개변수가 명령줄 옵션으로 인식되지 않는다는 것을 알고 있습니다 . 하지만 file
앞에 대시가 없기 때문에 명령줄 옵션으로 인식할 이유는 없어 보입니다.
답변1
옵션이 아닌 첫 번째 매개변수는 sh
가 됩니다 $0
. sh
스크립트에서 호출 되면 이는 스크립트의 경로입니다. 를 실행하면 sh -c SOMECOMMAND
쉘은 매개변수를 에 넣는 것 외에는 매개변수에 대해 아무 작업도 수행하지 않습니다 $0
. 관례적으로 -c
where 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) '
file
file
$1
sh
위의 내용은 다음과 같이 단순화될 수 있습니다.
$ find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename file) '