为什么在 xargs -I 传递给 sh 的参数之前需要双破折号才能正常工作?

For*_*ker 5 shell bash arguments

这是有问题的命令

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

因此,如果没有双破折号,file则不会传递给sh然后被识别为$1. 这是为什么?我知道这会--阻止随后的参数被识别为命令行选项。但是由于file没有以破折号开头,因此似乎没有理由将其识别为命令行选项。

Gil*_*il' 8

第一个非选项参数sh变为$0。当sh在脚本上调用时,这就是脚本的路径。当您运行 时sh -c SOMECOMMAND,shell 不会将参数用于除了放入$0. 按照惯例,它是传递给 的脚本的名称-c,类似于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
Run Code Online (Sandbox Code Playgroud)

这与 无关xargs,它将所有参数传递shsh命令。