使用不同的参数运行相同的命令

Dou*_*uda 8 command-line

我有一个不太宽松的程序可以使用。不幸的是,该程序不仅允许以下内容

"command -a -b -c"
Run Code Online (Sandbox Code Playgroud)

或者

"command -abc"
Run Code Online (Sandbox Code Playgroud)

所以我必须总是输入以下内容

command -a && command -b && command -c
Run Code Online (Sandbox Code Playgroud)

我很确定有更有效的输入方式,但无法弄清楚。

Sté*_*las 14

你可以这样做:

echo -a -b -c | xargs -n 1 command
Run Code Online (Sandbox Code Playgroud)

或者:

xargs -n1 command <<< '-a -b -c'
Run Code Online (Sandbox Code Playgroud)

有一些贝壳。

但请注意,它会影响command.

zsh

autoload zargs # best in ~/.zshrc
zargs -n 1 -- -a -b -c -- command
Run Code Online (Sandbox Code Playgroud)

或者干脆:

for o (-a -b -c) command $o
Run Code Online (Sandbox Code Playgroud)

如果任何command调用失败,这些都不会中止(除非它以 255 退出状态失败)。

为此,你会想要:

for o (-a -b -c) command $o || break
Run Code Online (Sandbox Code Playgroud)

这仍然无法到$?失败command调用的退出状态)。您可以将其更改为:

(){for o (-a -b -c) command $o || return}
Run Code Online (Sandbox Code Playgroud)

但到那个时候,它已经长于:

command -a && command -b && command -c
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 10

您可以command通过历史扩展来引用上一个命令行的第一个单词(在您的情况下)!!:0,然后您可以向其添加必要的参数。

command -a && !!:0 -b && !!:0 -c
Run Code Online (Sandbox Code Playgroud)

例如:

% echo foobar && !!:0 spamegg && !!:0 baz    
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz
Run Code Online (Sandbox Code Playgroud)

请注意,正如Stéphane Chazelas 指出的那样,这也可能导致意外的扩展。

  • `!!:0`(在支持 csh 历史扩展的 shell 中)将扩展到上一个命令 **行** 的第一个单词,而不是上一个命令。 (2认同)
  • 一个 `!` 就足够了:`!:0` 但对于 @StéphaneChazelas 来说更好的是使用 `!#:0`,其中 `!#` 的意思是*到目前为止输入的整个命令行*。 (2认同)