Verwenden Sie den Teil "apt up" der Befehle "apt update" und "apt upgrade" erneut, um beide nacheinander in nur einer Zeile auszuführen

11

So verwenden Sie den apt upTeil der Befehle apt updateund wieder apt upgrade, um beide Befehle nacheinander in nur einer Zeile ohne Alias ​​auszuführen.

So etwas wie : apt up{date,grade}.

e200
quelle
Was wäre eigentlich das Ziel, um dies zu erreichen? Warum kann dies interessant / relevant sein?
Vanadium
25
@vanadium Wir sind Linux-Benutzer. Wenn wir sinnlose Dinge ausprobieren, können wir Techniken lernen, die später auf komplexere Dinge angewendet werden können. Wenn keiner von uns dies jemals getan hat, seien wir ehrlich, keiner von uns wäre hier
Darren H
1
@DarrenH Das habe ich mir in der Tat gedacht :-)
Vanadium

Antworten:

19

Der einfache (und effizientere) Weg ist die Via-for-Schleife (in einer Zeile, hier wird sie jedoch der Übersichtlichkeit halber in mehreren Zeilen angezeigt):

for i in {date,grade}; do
     apt up${i}
done

Der clevere Weg ist, einen Alias ~/.bashrcfür diese beiden Befehle zu erstellen und zu vergessen, ihn immer wieder neu einzugeben:

alias upgrade=' sudo apt update && sudo apt upgrade'

Der aufwändige Weg ist, dies zu tun:

$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update &&  sudo apt upgrade &&  :

Sehen Sie, was passiert? Wir erstellen eine gültige Textzeichenfolge, die von der Shell ausgeführt werden soll. Jetzt müssen Sie nur noch verwendeneval anstelle von verwenden echo. Aber in evalder Regel nicht in Shell - Skripten empfohlen und dieser Befehl ist viel mehr gewunden und nicht tragbar als die for - Schleife. Variation des Themas ohne eval (und kürzeste so weit, aber nicht effizient durch Rohr und mehrere Befehle echo, zwei apt, sudound shso viele Forking):

$ echo "apt "{update,upgrade}";"|sudo sh

Wir können auch verwenden set, um die gewünschte Sequenz in Positionsparameter umzuwandeln und einfach aptmit $1und $2args auszuführen :

$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade

Oder verwenden Sie alternativ erneut die for-Schleife, da standardmäßig Positionsparameter verarbeitet werden, wenn Sie keine Sequenz in der Schleife angeben for variable (sequence)

$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade

Die Verwendung setist eine sehr verbreitete Technik, die ich unter Fachleuten sehe, die viel mit Muscheln arbeiten, und das aus gutem Grund - sie ist sehr portabel und funktioniert dort, /bin/shwo Sie keine Arrays oder {a,b,c}Erweiterungen haben. So wäre POSIX-ly tragbarer Weg set update upgrade ; for i; do echo apt $i ;done. Darüber hinaus sollte dies effizient sein.


Oder wir können die whileRundstrecke gehen :

$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done 
apt update
apt upgrade

Denken Sie natürlich daran, es auszuführen, ohne echodass die eigentliche Befehlsausführung stattfinden soll

Sergiy Kolodyazhnyy
quelle
7
Machen Sie einfach die for-Schleife in einer Zeile. for i in {date,grade}; do sudo apt up${i}; done
Videonauth
3
Wenn Sie es vorziehen, Ihre Dateien schön und ordentlich zu halten, können Sie auch Aliase eingeben ~/.bash_aliases. Diese Datei sollte automatisch von bezogen werden ~/.bashrc.
francescop21
2
Ich habe meine Antwort mit vielleicht aktualisiert, was Sie wollen. Es ist ein Einzeiler, aber ich denke nicht, ob es einfacher ist. Ehrlich gesagt macht es keinen Sinn, dies zu tun, wenn Sie zwei Befehle (ja, das sind zwei aptBefehle) mit unterschiedlichen Argumenten (Aktualisieren und Aktualisieren) ausführen möchten. Ich sage also immer noch, dass die Schleife der
richtige
1
Keine Notwendigkeit für eine String-Erweiterung für den Loop-Header, nennen Sie einfach die Iterationen:for i in date grade; do
Rexkogitans
5
Ein solcher Alias ​​sollte natürlich benannt werden upgrate.
Pipe
14

Sie können auch die Bash- Verlaufserweiterung verwenden , um Teile der aktuellen Befehlszeile abzurufen und zu ändern:

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# ist die aktuelle Zeile
  • :s/date/gradeist ein Modifikator, der datedurch ersetztgrade
muru
quelle
6
Sie können sogar 2 weitere Zeichen speichern, indem Sie !#:s/dat/gradstattdessen
Dan
9

Eine weitere einfache Option xargsanstelle von for:

echo up{dat,grad}e | xargs -n1 apt

Prüfung:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

Ich würde jedoch einen Shell-Alias wie Sergiy bevorzugen, da diese „einfachen“ Methoden nicht einfach genug sind, um tatsächlich nützlich zu sein.

Melebius
quelle
1
Sehr schön. Variation des Themas könnte sein, printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%obwohl dies etwas länger ist
Sergiy Kolodyazhnyy
printf '%s'ist im Allgemeinen eine gute Praxis, da Sie nicht entkommen können, z . B. mit --helpoder -e.
YoYoYonnY
@YoYoYonnY Ja. Vielleicht printf '%s\0'wäre es sogar noch besser, xargshat eine Flagge, um null terminierte
Argumente
2

Erstellen Sie eine Funktion wie folgt:

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

Dann kannst du rennen repeat 'apt up' {date,grade} . Dies hat den Vorteil, dass es für völlig andere Befehle wiederverwendbar ist, obwohl Sie dadurch keine Eingabe für diesen Befehl ersparen müssen.

Ich würde sicherlich einigen der anderen Antworten zustimmen, dass so etwas wahrscheinlich nützlicher ist:

alias apt-up='apt update && apt upgrade'
Matthew Read
quelle
0

Die Antwort von @ muru veranlasste mich, mich über die Erweiterung der Geschichte zu informieren, und ich fand eine andere Variante

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^entspricht !!:s/string1/string2/, welche den letzten Befehl und ersetzt nimmt string1mit string2.

guntbert
quelle
-2

Ich verwende den apt-get upTeil des Befehls mit der folgenden Tastenfolge erneut:

Up ArrowBackspaceBackspaceBackspaceBackspace

jdgregson
quelle