使用 xargs 修复了最后一个参数

PSk*_*cik 5 xargs

是否可以使用 xargs 来调用命令,以便修复命令的最后一个参数?

我的尝试:

printf '%s\n' a b c d | xargs -I{} echo {} LAST
Run Code Online (Sandbox Code Playgroud)

最终做

echo a LAST  
echo b LAST  
echo c LAST  
echo d LAST  
Run Code Online (Sandbox Code Playgroud)

我想让 xargs 调用

echo a b c d LAST
#fit as many as you can but always finish wiht LAST
Run Code Online (Sandbox Code Playgroud)

这是否可以做到,最好以便携式方式进行?

mos*_*svy 11

tl;博士; 这就是你可以便携地做到这一点的方法,没有-I和其他破碎的花哨选项:

$ echo a b c d f g | xargs -n 2 sh -c 'echo "$@" LAST' sh
a b LAST
c d LAST
f g LAST

$ seq 1 100000 | xargs sh -c 'echo "$#" LAST' sh
23692 LAST
21841 LAST
21841 LAST
21841 LAST
10785 LAST
Run Code Online (Sandbox Code Playgroud)

-I选项的问题在于它被设计破坏了,并且没有办法绕过它:

$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a b c d f g LAST
$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
{} LAST a b
{} LAST c d
{} LAST f g
Run Code Online (Sandbox Code Playgroud)

但它们可能已被覆盖,因为这就是标准所说的:

-I replstr ^[XSI] [Option Start] 插入模式:对标准输入中的每一行执行实用程序,将整行作为单个参数,将其插入到每次出现 replstr 的参数中。

它没有说明与-n-d选项的交互,因此他们可以随心所欲地做任何事情。

这是在(较旧的)FreeBSD 上的情况,不太意外但非标准:

fzu$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
a b LAST
c d LAST
f g LAST
fzu$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a LAST
b LAST
c LAST
d LAST
f LAST
g LAST
Run Code Online (Sandbox Code Playgroud)

  • 我不禁想到可能有一种更中立的方式来表达这个答案。指出一个操作系统(Linux)也让人感觉很奇怪,因为您似乎认为这是标准要求的行为造成的问题。 (3认同)
  • @CarlosMendoza 如果你的意思是 `-c'...'` 后面的 `sh` 没有调用任何东西,它只是设置了 `argv[0]`/`$0`;你可以用`argv0`或任何你喜欢的东西替换它。没有它,回声就不会回应它的第一个论点。要了解这个想法,请尝试不带 `argv0` 的 `sh -c 'echo "$@"' argv0 1 2 3`。 (2认同)