Sat*_*ura 18

一种方法:

echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand
Run Code Online (Sandbox Code Playgroud)

这假定a,bc不包含空格、换行符、引号或反斜杠。:)

使用 GNU,findutil您可以处理一般情况,但稍微复杂一些:

echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand
Run Code Online (Sandbox Code Playgroud)

您可以取代|一些其他字符分隔符,没有出现在abc

编辑:正如@MichaelMol 所指出的,如果参数列表很长,则存在溢出可以传递给mycommand. 发生这种情况时,最后一个xargs将拆分列表并运行 的另一个副本mycommand,并且存在留下未终止的-f. 如果你担心这种情况,你可以用这样xargs -0的东西替换上面的最后一个:

... | xargs -x -0 mycommand
Run Code Online (Sandbox Code Playgroud)

这不会解决问题,但是mycommand当参数列表太长时它会中止运行。

  • 您面临着超过“ARG_MAX”并且将“-f”与其配对参数分开的相当严重的风险。 (2认同)

Sté*_*las 6

解决它的更好方法(IMO)是:

(AFAIK,rc并且fish没有数组压缩)

使用旧式的类似 Bourne 的 shell bash,你总是可以这样做(仍然允许$@数组元素中的任何字符):

set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"
Run Code Online (Sandbox Code Playgroud)