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


8

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

"command -a -b -c"

要么

"command -abc"

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

command -a && command -b && command -c

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


5
这将完全取决于命令。请在您的问题中包括它。
2016年

1
您有许多不同的答案,但我敢打赌,cmd -a; cmd -b; cmd -c从长远来看,您将像所有人类一样坚持下去。
jimmij

这个问题太笼统了,没有细节command。在一般的情况下,command -a -b -ccommand -abccommand -a && command -b && command -c有不同的含义..
梅德格里戈里耶夫

Answers:


14

您可以这样做:

echo -a -b -c | xargs -n 1 command

要么:

xargs -n1 command <<< '-a -b -c'

有一些贝壳。

但要注意,它会影响的标准输入command

zsh

autoload zargs # best in ~/.zshrc
zargs -n 1 -- -a -b -c -- command

或者简单地:

for o (-a -b -c) command $o

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

为此,您需要:

for o (-a -b -c) command $o || break

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

(){for o (-a -b -c) command $o || return}

但是到那时,它已经超过了:

command -a && command -b && command -c

谢谢斯特凡(Stéphane)的选择。!!:0和xargs的组合就成功了。
杜达

10

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

command -a && !!:0 -b && !!:0 -c

例如:

% echo foobar && !!:0 spamegg && !!:0 baz    
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz

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


1
正是我需要的!谢谢合租多少heemayl
Douda

2
!!:0(在支持csh历史记录扩展的shell中)将扩展为上一个命令的第一个单词,而不是前一个命令。
斯特凡Chazelas

@StéphaneChazelas澄清..
heemayl

我们不知道上一个命令行的第一个单词是什么。尝试进入uname,然后echo foobar && !!:0 spamegg && !!:0 baz将扩展为echo foobar && uname spamegg && uname baz
斯特凡Chazelas

2
一个!就足够了:!:0但是使用@StéphaneChazelas要点要好一点!#:0,那就是在其中!#均值地方输入整个命令行
Costas

3

封装循环的shell函数如何?

yourcmd() {
    local arg
    for arg; do
        thing "$arg" || return
    done
}

其中“事物”是您要调用的实际命令。然后简单地

yourcmd -a -b -c

您甚至可以将其推广到任何命令:

splitargs() {
    local cmd arg 
    cmd="$1"
    shift
    for arg; do
        "$cmd" "$arg" || return
    done
}

然后

splitargs somecommand -a -b -c

1

在富有创造力和独到见解的答案中,这里有一些简单的事情,就是键入更少的字符:

# under the assumption that you have a frequently-used set of flags: -a -b -c
alias c='command -a && command -b && command -c'

# slightly more generally, name some aliases according to the set of flags
alias cabc='command -a && command -b && command -c'
alias cdef='command -d && command -e && command -f'

# more generally, just shorten the command name and then pass whatever flags you want
alias c=command
c -e && c -f && c -f

0

制作一个Shell脚本MultiRun,该脚本以第一个Parameter作为Command并一次运行其余的Parameters。

./ MultiRun卷曲ABCD

您的脚本应将curl作为命令并运行“ curl A”,“ curl B”,“ curl C”,“ curl D”。现在,由于脚本处于受控状态,因此您可以确定任何一个命令中的失败将终止脚本还是继续执行下一个参数,还是等待用户输入或执行其他操作。您甚至可以根据各个命令的执行情况来决定整个脚本的退出状态。

MultiRun脚本可以是这样的:

#! /bin/bash
COMMAND=$1
shift #### Remove COMMAND from existing Parameters
for PARAMETER in "$@" ; #### Process all remaining Parameters
do
  # echo Executing "$COMMAND $PARAMETER" now #### Uncomment this line to see what command is getting executed.
  $COMMAND $PARAMETER
  # Check exit status and take action or wait for user input , if required.
  # read -p "finished executing command. press enter to continue. waiting..." #### Uncomment this line to pause between commands.
done
# Depending on the individual exit statuses , choose your exit status N with "exit $N".

现在执行以下命令:
./MultiRun echo 1 2 3 4
获得“ echo 1”,“ echo 2”,“ echo 3”,“ echo 4”的输出,如下所示:
1
2
3
4

这是一个非常灵活且可重复使用的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.