Перезапис тієї ж команди з іншим параметром


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 обробляють кілька аргументів файлів послідовно.
фонбранд

Відповіді:


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
або якщо у вас є багато чого ви хочете запустити, ви можете використовувати розширення bash, як так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ключового слова.
джимп

@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/

Bash зробить заміну і біжить

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.