Як повторно використовувати 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.