Запустите одну и ту же команду с разными параметрами

8

У меня не очень разрешительная программа для работы. К сожалению, эта программа не только позволяет

"command -a -b -c"

или

"command -abc"

Поэтому я всегда должен набрать следующее

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

Я уверен, что есть более эффективный способ напечатать это, но не могу понять это.

Douda
источник
5
Это будет полностью зависеть от команды. Пожалуйста, включите это в свой вопрос.
Joepd
1
У вас много разных ответов, но держу пари, что вы будете придерживаться cmd -a; cmd -b; cmd -cв долгосрочной перспективе, как и все люди.
Джимми
Этот вопрос слишком широк без подробностей command. В общем случае command -a -b -c, command -abcи command -a && command -b && command -cимеют различный смысл ..
Дмитрий Григорьев

Ответы:

14

Вы могли бы сделать:

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

Или:

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

с некоторыми снарядами.

Но будьте осторожны, что это влияет на stdin 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
Стефан Шазелас
источник
Спасибо Стефану за этот вариант. Комбинация !!: 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

Обратите внимание, что, как указал Стефан Шазелас , это также может привести к неожиданным расширениям.

heemayl
источник
1
Именно то, что мне было нужно! Большое спасибо heemayl
Дуда
2
!!:0(в оболочках, которые поддерживают расширение истории csh) будет расширен до первого слова предыдущей командной строки , а не предыдущей команды.
Стефан Шазелас
@ StéphaneChazelas уточнил ..
Heemayl
Мы не знаем, каким было первое слово предыдущей командной строки. Попробуйте войти, unameа затем echo foobar && !!:0 spamegg && !!:0 baz, что расширится до echo foobar && uname spamegg && uname baz.
Стефан Шазелас
2
Одного !достаточно: !:0но с точками @ StéphaneChazelas лучше использовать !#:0где !#среднее значение Вся командная строка набрана до сих пор .
Костас
3

Как насчет функции оболочки, оборачивающей цикл?

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

Создайте сценарий оболочки MultiRun , который принимает первый параметр в качестве команды и запускает его с остальными параметрами по одному.

./ MultiRun curl ABCD

Ваш скрипт должен принять curl в качестве команды и запустить "curl A", "curl B", "curl C", "curl D". Теперь, поскольку ваш сценарий находится под контролем, вы можете решить, будет ли сбой в какой-либо одной команде завершать сценарий, или переходить к следующему параметру, или ждать ввода пользователя или что-то еще. Вы даже можете выбрать статус завершения всего сценария, основываясь на выполнении отдельных команд.

MultiRun Script может быть примерно таким:

#! /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

Это очень гибкое и многоразовое решение.

Prem
источник