Як повторно використовувати apt up
частину apt update
та apt upgrade
команди для виконання обох команд послідовно лише в одному рядку без псевдоніму.
Що - щось на кшталт: apt up{date,grade}
.
Як повторно використовувати apt up
частину apt update
та apt upgrade
команди для виконання обох команд послідовно лише в одному рядку без псевдоніму.
Що - щось на кшталт: apt up{date,grade}
.
Відповіді:
Найпростіший спосіб (і більш ефективний) - це для циклу (на одному рядку, але тут він показаний у кількох рядках для наочності):
for i in {date,grade}; do
apt up${i}
done
Розумний спосіб - створити псевдонім ~/.bashrc
для цих двох команд і забути про його повторне введення:
alias upgrade=' sudo apt update && sudo apt upgrade'
Докладний спосіб зробити це:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Бачите, що відбувається? Ми будуємо дійсний рядок тексту для запуску оболонки. Тепер все, що вам потрібно зробити, це використовувати eval
замість echo
. Але, eval
як правило, не рекомендується в сценаріях оболонок, і ця команда набагато складніша і не портативна, ніж цикл for. Варіації на тему без Eval (і найкоротшим до сих пір, але не ефективно з - за труби і кілька команд echo
, два apt
, sudo
і sh
так багато розгалуження):
$ echo "apt "{update,upgrade}";"|sudo sh
Ми також можемо використовувати set
для перетворення потрібної послідовності в позиційні параметри і просто виконати за apt
допомогою $1
та $2
аргументів:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Або ж знову використовувати цикл, оскільки він за замовчуванням обробляє позиційні параметри, якщо не вказати послідовність у for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
Використання set
- це дуже поширена техніка, яку я бачу серед професіоналів, які багато працюють із снарядами, і з поважної причини - це дуже портативно і працюватиме /bin/sh
там, де у вас немає масивів чи {a,b,c}
розширень. Тож портативний спосіб POSIX був би set update upgrade ; for i; do echo apt $i ;done
. Крім того, це повинно бути ефективним.
Або ми можемо пройти while
цикл маршруту:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Звичайно, пам’ятайте, що запускати його без echo
фактичного виконання команди
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Цей файл повинен бути автоматично отриманий ~/.bashrc
.
apt
команди) з різними аргументами (оновлення та оновлення), тому я все одно скажу, що для циклу це шлях
for i in date grade; do
upgrate
.
Ви також можете використовувати розширення історії bash, щоб отримати частини поточного командного рядка та змінити його:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
- поточний рядок:s/date/grade
це модифікатор , який замінює date
зgrade
!#:s/dat/grad
замість цього
Ще один простий варіант використання xargs
замість for
:
echo up{dat,grad}e | xargs -n1 apt
Тест:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Однак я вважаю за краще псевдонім оболонки, як Сергій, тому що ці "прості" способи не є простими, щоб бути корисними.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
хоча це трохи довше
printf '%s'
як правило, є хорошою практикою, оскільки ви не можете цього уникнути, наприклад, з --help
або -e
.
printf '%s\0'
, ще краще, xargs
має прапор для обробки нульових закінчених арг
Створіть таку функцію:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Тоді можна бігти repeat 'apt up' {date,grade}
. Це має перевагу в тому, що можна використовувати повторно для абсолютно різних команд, хоча це не економить жодного набору тексту для цієї команди.
Я, безумовно, погоджуюся з деякими іншими відповідями, що щось подібне, мабуть, корисніше:
alias apt-up='apt update && apt upgrade'
Відповідь @ muru змусив мене прочитати історію розширення, і я знайшов інший варіант
$ sudo apt update
$ ^dat^grad^
^string1^string2^
еквівалентний !!:s/string1/string2/
, який приймає останню команду і замінює string1
на string2
.