Как повторно использовать apt up
часть apt update
и apt upgrade
команды для выполнения обеих команд в последовательности в одну строку без псевдонима.
Что - то вроде: apt up{date,grade}
.
Как повторно использовать apt up
часть apt update
и apt upgrade
команды для выполнения обеих команд в последовательности в одну строку без псевдонима.
Что - то вроде: apt up{date,grade}
.
Ответы:
Простой способ (и более эффективный) - цикл 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
фактического выполнения команды.
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'
Ответ @ Муру привел меня к чтению истории расширения, и я нашел другой вариант
$ sudo apt update
$ ^dat^grad^
^string1^string2^
эквивалентно тому !!:s/string1/string2/
, что принимает последнюю команду и заменяет string1
на string2
.