Повторно используйте части `apt up` команд`apt update` и `apt upgrade`, чтобы выполнить обе последовательности в одной строке
Как использовать apt up
часть apt update
а также apt upgrade
Команды для выполнения обеих команд в последовательности в одну строку без псевдонима.
Что-то вроде: apt up{date,grade}
,
6 ответов
Простой способ (и более эффективный) - цикл for (в одну строку, но здесь для ясности он показан в несколько строк):
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, поскольку по умолчанию он обрабатывает позиционные параметры, если последовательность не указана в 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
для фактического выполнения команды
Вы также можете использовать расширение истории bash, чтобы получить части текущей командной строки и изменить ее:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
текущая строка:s/date/grade
это модификатор, который заменяетdate
сgrade
Еще один простой вариант использования xargs
вместо for
:
echo up{dat,grad}e | xargs -n1 apt
Тестовое задание:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Однако я бы предпочел псевдоним оболочки, такой как Сергей, потому что эти "простые" способы не достаточно просты, чтобы быть действительно полезными.
Создайте такую функцию:
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
,
Я использую apt-get up
часть команды, использующая следующую последовательность клавиш:
Стрелка вверхBackspaceBackspaceBackspaceBackspace