it-swarm.com.de

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

So verwenden Sie den Teil apt up der Befehle apt update und apt upgrade erneut, um beide Befehle nacheinander in nur einer Zeile ohne Alias ​​auszuführen.

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

11
e200

Der einfache (und effizientere) Weg ist die for-Schleife (in einer Zeile, hier jedoch zur Verdeutlichung in mehreren Zeilen):

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

Der clevere Weg ist, in ~/.bashrc einen Alias ​​fü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 Shell ausgeführt werden soll. Jetzt müssen Sie nur noch eval anstelle von echo verwenden. Aber eval wird in Shell-Skripten im Allgemeinen nicht empfohlen, und dieser Befehl ist weitaus komplexer und nicht portierbar als die for-Schleife. Variation über das Thema ohne eval (und kürzeste bisher, aber nicht effizient aufgrund von Pipe- und Mehrfachbefehlen echo, zwei apt, Sudo und sh so viele Gabeln) :

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

Wir können auch set verwenden, um die gewünschte Sequenz in Positionsparameter umzuwandeln, und einfach apt mit $1- und $2-Argumenten ausführen:

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

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

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

Die Verwendung von set ist eine sehr verbreitete Technik, die ich unter Fachleuten sehe, die häufig mit Shells arbeiten, und das aus gutem Grund - dies ist sehr portabel und funktioniert in /bin/sh, wo es keine Arrays oder {a,b,c} -Erweiterungen gibt. Eine tragbare POSIX-Methode wäre also set update upgrade ; for i; do echo apt $i ;done. Darüber hinaus sollte dies effizient sein.


Oder wir können die while -Route gehen:

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

Denken Sie natürlich daran, es ohne echo auszuführen, damit der eigentliche Befehl ausgeführt wird

19

Sie können auch bash Protokollerweiterung 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/grade ist ein Modifikator, der date durch grade ersetzt
14
muru

Eine andere einfache Option, die xargs anstelle von for verwendet:

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

Prüfung:

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

Ich bevorzuge jedoch einen Shell-Alias ​​ genau wie Sergiy , da diese "einfachen" Methoden nicht einfach genug sind, um tatsächlich nützlich zu sein.

9
Melebius

Erstellen Sie eine Funktion wie folgt:

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

Dann können Sie repeat 'apt up' {date,grade} ausführen. Dies hat den Vorteil, dass es für völlig andere Befehle wiederverwendbar ist, obwohl Sie dadurch keine Eingaben für diesen Befehl sparen.

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

alias apt-up='apt update && apt upgrade'
2
Matthew Read

@ murus Antwort hat mich dazu gebracht, nachzulesen History-Erweiterung und ich habe eine andere Variante gefunden

 $ Sudo apt update
 $ ^dat^grad^

^string1^string2^ entspricht !!:s/string1/string2/, das den letzten Befehl entgegennimmt und string1 durch string2 ersetzt.

0
guntbert