Використовуйте частину команд `apt up` команд` apt update` та `apt upgrade` для виконання обох послідовностей лише в одному рядку


11

Як повторно використовувати apt upчастину apt updateта apt upgradeкоманди для виконання обох команд послідовно лише в одному рядку без псевдоніму.

Що - щось на кшталт: apt up{date,grade}.


Яка б насправді була мета цього досягти? Чому це може бути цікаво / актуально?
ванадій

25
@vanadium ми користувачі Linux, спроба безглуздих речей дозволяє нам вивчити методи, які можна застосувати пізніше до складніших речей, якщо ніхто з нас ніколи цього не робив, будьмо чесними, ніхто з нас не був би тут
Даррен Н

1
@DarrenH Це те, що я справді думав :-)
ванадій

Відповіді:


19

Найпростіший спосіб (і більш ефективний) - це для циклу (на одному рядку, але тут він показаний у кількох рядках для наочності):

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фактичного виконання команди


7
Просто зробіть цикл for в одному рядку. for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
Якщо ви віддаєте перевагу зберегти свої файли красивими та охайними, ви також можете помістити псевдоніми ~/.bash_aliases. Цей файл повинен бути автоматично отриманий ~/.bashrc.
francescop21

2
Я оновив свою відповідь, можливо, того, що ви хочете. Це однолінійний, але я не думаю, що це полегшить його. Відверто кажучи, немає сенсу робити це, коли ви хочете запустити дві команди (так, це дві aptкоманди) з різними аргументами (оновлення та оновлення), тому я все одно скажу, що для циклу це шлях
Сергій Колодяжний,

1
Немає потреби в розширенні рядків для заголовка циклу, просто назвіть ітерації:for i in date grade; do
rexkogitans

5
Такий псевдонім, очевидно, слід назвати upgrate.
труба

14

Ви також можете використовувати розширення історії bash, щоб отримати частини поточного командного рядка та змінити його:

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# - поточний рядок
  • :s/date/gradeце модифікатор , який замінює dateзgrade

6
Ви навіть можете зберегти більше 2 символів, використовуючи !#:s/dat/gradзамість цього
Dan

9

Ще один простий варіант використання xargsзамість for:

echo up{dat,grad}e | xargs -n1 apt

Тест:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

Однак я вважаю за краще псевдонім оболонки, як Сергій, тому що ці "прості" способи не є простими, щоб бути корисними.


1
Дуже хороша. Варіації теми можуть бути, printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%хоча це трохи довше
Сергій Колодяжний

printf '%s'як правило, є хорошою практикою, оскільки ви не можете цього уникнути, наприклад, з --helpабо -e.
yyny

@YoYoYonnY Так. Можливо printf '%s\0', ще краще, xargsмає прапор для обробки нульових закінчених арг
Сергій Колодяжний

2

Створіть таку функцію:

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

Тоді можна бігти repeat 'apt up' {date,grade}. Це має перевагу в тому, що можна використовувати повторно для абсолютно різних команд, хоча це не економить жодного набору тексту для цієї команди.

Я, безумовно, погоджуюся з деякими іншими відповідями, що щось подібне, мабуть, корисніше:

alias apt-up='apt update && apt upgrade'

0

Відповідь @ muru змусив мене прочитати історію розширення, і я знайшов інший варіант

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^еквівалентний !!:s/string1/string2/, який приймає останню команду і замінює string1на string2.


-2

Я повторно використовую apt-get upчастину команди, використовуючи таку послідовність клавіш:

Up ArrowBackspaceBackspaceBackspaceBackspace

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.