Как снова использовать 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
обычно не рекомендуется в сценариях оболочки, и эта команда является намного более замысловатой и не портативной, чем для цикла. Вариация на тему без оценки (и самый короткий до сих пор, но не эффективный должный передать по каналу и несколько команд echo
, два apt
,sudo
и sh
так большое разветвление):
$ echo "apt "{update,upgrade}";"|sudo sh
Мы можем также использовать set
превратить желаемую последовательность в позиционные параметры и просто выполниться apt
с $1
и $2
args:
$ 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-ly портативный путь был бы 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
Однако я бы предпочел псевдоним оболочки так же, как Сергей , потому что эти «простые» способы не достаточно просты, чтобы быть действительно полезными.
@ ответ Муру привел меня к прочтению расширения истории , и я нашел другой вариант
$ sudo apt update
$ ^dat^grad^
^string1^string2^
, эквивалентный !!:s/string1/string2/
, который принимает последнюю команду и заменяет string1
на string2
.
Создайте функцию как это:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Затем можно работать repeat 'apt up' {date,grade}
. Это обладает преимуществом того, чтобы быть допускающим повторное использование для полностью различных команд, хотя оно не сохраняет Вас никакой ввод для этого.
Я, конечно, согласился бы с некоторыми из других ответов, что что-то вроде этого, вероятно, более полезно:
alias apt-up='apt update && apt upgrade'
Я resuse apt-get up
часть команды с помощью следующего сочетания клавиш:
ArrowBackspaceBackspaceBackspaceBackspace