我有一个不太宽松的程序可以使用。不幸的是,这个程序不仅仅允许以下内容
"command -a -b -c"
或者
"command -abc"
所以我必须总是输入以下内容
command -a && command -b && command -c
我很确定有更有效的方法来输入它,但无法弄清楚。
答案1
你可以这样做:
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
答案2
command
您可以通过历史扩展来引用上一个命令行(在您的情况下)的第一个单词!!:0
,然后您可以向其中添加必要的参数。
command -a && !!:0 -b && !!:0 -c
例如:
% echo foobar && !!:0 spamegg && !!:0 baz
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz
请注意,如斯特凡·查泽拉斯 (Stéphane Chazelas) 指出,这也可能导致意外的扩展。
答案3
封装一个循环的 shell 函数怎么样?
yourcmd() {
local arg
for arg; do
thing "$arg" || return
done
}
其中“thing”是您要调用的实际命令。然后简单地
yourcmd -a -b -c
您甚至可以将其推广到任何命令:
splitargs() {
local cmd arg
cmd="$1"
shift
for arg; do
"$cmd" "$arg" || return
done
}
然后
splitargs somecommand -a -b -c
答案4
制作一个 shell 脚本多运行,它将第一个参数作为命令,并一次运行一个剩余参数。
./多运行卷曲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
这是一个非常灵活且可重用的解决方案。