Повторно используйте части `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

Другие вопросы по тегам