Jak ponownie wykorzystać apt up
część poleceń apt update
i apt upgrade
do wykonania obu poleceń w jednym wierszu bez aliasu.
Coś jak: apt up{date,grade}
.
Jak ponownie wykorzystać apt up
część poleceń apt update
i apt upgrade
do wykonania obu poleceń w jednym wierszu bez aliasu.
Coś jak: apt up{date,grade}
.
Odpowiedzi:
Prostym sposobem (i bardziej wydajnym) jest przejście przez pętlę for (w jednej linii, ale tutaj jest pokazane w wielu liniach dla przejrzystości):
for i in {date,grade}; do
apt up${i}
done
Sprytnym sposobem jest utworzenie aliasu ~/.bashrc
dla tych dwóch poleceń i zapomnienie o ponownym wpisywaniu go ponownie:
alias upgrade=' sudo apt update && sudo apt upgrade'
Skomplikowany sposób to zrobić:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Zobacz co się dzieje? Budujemy prawidłowy ciąg tekstu do uruchomienia przez powłokę. Teraz wystarczy użyć eval
zamiast echo
. Ale eval
generalnie nie jest zalecane w skryptach powłoki, a to polecenie jest znacznie bardziej skomplikowane i nieprzenośne niż pętla for. Wariacja na temat bez eval (i najkrótsza tak daleko, ale nie efektywne ze względu na rury i wielu poleceń echo
, dwa apt
, sudo
i sh
tak wiele rozwidlone):
$ echo "apt "{update,upgrade}";"|sudo sh
Możemy również użyć, set
aby zmienić żądaną sekwencję w parametry pozycyjne i po prostu wykonać za apt
pomocą $1
i $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Lub użyj ponownie pętli for, ponieważ domyślnie przetwarza parametry pozycyjne, jeśli nie określisz sekwencji w for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
Używanie set
jest bardzo popularną techniką, którą widzę wśród profesjonalistów, którzy często pracują z powłokami, i nie bez powodu - jest to bardzo przenośne i będzie działać /bin/sh
tam, gdzie nie masz tablic ani {a,b,c}
rozszerzeń. Tak więc POSIX-ly przenośny sposób byłby set update upgrade ; for i; do echo apt $i ;done
. Dodatkowo powinno to być skuteczne.
Lub możemy przejść while
trasę pętli:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Oczywiście pamiętaj, aby uruchomić go bez echo
rzeczywistego wykonania polecenia
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Ten plik powinien zostać automatycznie pobrany przez ~/.bashrc
.
apt
polecenia) z różnymi argumentami (aktualizacja i aktualizacja), więc nadal powiem, że droga do pętli jest
for i in date grade; do
upgrate
.
Możesz także użyć rozszerzenia historii bash, aby uzyskać części bieżącego wiersza poleceń i zmodyfikować go:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
jest bieżącą linią:s/date/grade
jest modyfikatorem, który zastępuje date
sięgrade
!#:s/dat/grad
zamiast tego
Kolejna prosta opcja xargs
zamiast zamiast for
:
echo up{dat,grad}e | xargs -n1 apt
Test:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Wolałbym jednak alias powłoki, tak jak Sergiy, ponieważ te „proste” sposoby nie są wystarczająco proste, aby były przydatne.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
nieco dłuższe
printf '%s'
jest ogólnie dobrą praktyką, ponieważ nie można uciec, np. przy pomocy --help
lub -e
.
printf '%s\0'
byłoby jeszcze lepiej, xargs
ma flagę do obsługi argumentów zakończonych
Utwórz taką funkcję:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Potem możesz biec repeat 'apt up' {date,grade}
. Ma to tę zaletę, że można go używać do zupełnie różnych poleceń, chociaż nie oszczędza to pisania na klawiaturze.
Z pewnością zgodziłbym się z niektórymi innymi odpowiedziami, że coś takiego jest prawdopodobnie bardziej przydatne:
alias apt-up='apt update && apt upgrade'
Odpowiedź @ muru doprowadziła mnie do przeczytania o rozszerzeniu historii i znalazłem inny wariant
$ sudo apt update
$ ^dat^grad^
^string1^string2^
jest równoważne z !!:s/string1/string2/
, które przyjmuje ostatnie polecenie i zastępuje string1
je string2
.