Повторный запуск той же команды с другим параметром


13

Я знаю, что могу запустить следующую команду

ls Some{File,Folder}

И это эквивалентно запуску этого:

ls SomeFile SomeFolder

(Я также часто использую его для таких вещей, как mv place_{a,b})

Тем не менее, мне было интересно, если бы был другой ярлык, где я мог бы сделать что-то вроде этого:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

И мне оставалось только напечатать run-command --a --whole --lot --of --flags parameter {a,b}или что-то подобное.


Это зависит от того run-command, многие команды Unix обрабатывают несколько файловых аргументов последовательно.
vonbrand

Ответы:


13

Предполагая, что вы используете GNU bashили что-то подобное:

Возможно forпетля?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

который также может быть записан в одну строку как for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
или если у вас есть много вы хотите запустить вы можете использовать расширение Баш как такfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

То, что идет туда, может быть разделенным пробелами списком, сгенерированным разными способами. Так что да, {a..z}, *.pdf, $(find ...)...
njsg

Я не знаю, почему мой разум не прыгнул в петли. Благодарность! Это, вероятно, будет то, что я использую. Идея функции хороша, но мне она нравится больше.
Ashays

1
Однострочник работал только после удаления ;следующего doключевого слова.
16:00

@jimp Спасибо, я изменил код, чтобы удалить это ;.
njsg

5

Если вы не пишете сценарий и просто хотите запустить его из командной строки, то, xargsвероятно, вам нужна команда.

xargs будет извлекать кучу содержимого из стандартного ввода и использовать его в качестве аргументов для команды, выполняя эту команду несколько раз, если это необходимо.

Попробуйте следующее:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

В этом примере вы просто даете xargs перестановки, которые вы хотите запустить.

Флаг "-n 1" указывает xargs использовать только 1 аргумент за запуск.

Флаг «-d,» указывает xargs искать «,» на входе в качестве разделителя между аргументами для запуска. (Обратите внимание, что если в аргументе есть «,», вам нужно изменить его на что-то другое. Если в ваших аргументах нет пробелов, вы можете вообще пропустить этот флаг.)

Смотрите man xargsдля получения дополнительной информации.


4

Вы также можете использовать функцию, которая не ограничивает вас изменением аргумента в конце:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

Вы можете выполнить замены в предыдущей команде. Это не будет работать с вашим примером {a, b}, потому что все экземпляры 'a' будут заменены на 'b'. Но представьте, что вы хотите выполнить следующие команды:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

Вы можете сделать это с

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Баш сделает замену и запустит

run-command --a --whole --lot --of --parameter --format json

Используйте gs (глобальное замещение) для выполнения нескольких подстановок, а не только одного.


1

В aliasbash есть команда:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

Использование: $ shotcommand a


Есть также функции, если код немного сложнее :-)
njsg

2
Это решение работает, только если мой изменяющийся параметр является последним, верно?
Ashays

Да. Вы правы.
дчириков
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.