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.
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'
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 :
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)
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.
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:
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:
Antworten:
Der einfache (und effizientere) Weg ist die Via-for-Schleife (in einer Zeile, hier wird sie jedoch der Übersichtlichkeit halber in mehreren Zeilen angezeigt):
Der clevere Weg ist, einen Alias
~/.bashrc
für diese beiden Befehle zu erstellen und zu vergessen, ihn immer wieder neu einzugeben:Der aufwändige Weg ist, dies zu tun:
Sehen Sie, was passiert? Wir erstellen eine gültige Textzeichenfolge, die von der Shell ausgeführt werden soll. Jetzt müssen Sie nur noch verwenden
eval
anstelle von verwendenecho
. Aber ineval
der 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 Befehleecho
, zweiapt
,sudo
undsh
so viele Forking):Wir können auch verwenden
set
, um die gewünschte Sequenz in Positionsparameter umzuwandeln und einfachapt
mit$1
und$2
args auszuführen :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)
Die Verwendung
set
ist 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/sh
wo Sie keine Arrays oder{a,b,c}
Erweiterungen haben. So wäre POSIX-ly tragbarer Wegset update upgrade ; for i; do echo apt $i ;done
. Darüber hinaus sollte dies effizient sein.Oder wir können die
while
Rundstrecke gehen :Denken Sie natürlich daran, es auszuführen, ohne
echo
dass die eigentliche Befehlsausführung stattfinden sollquelle
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Diese Datei sollte automatisch von bezogen werden~/.bashrc
.apt
Befehle) mit unterschiedlichen Argumenten (Aktualisieren und Aktualisieren) ausführen möchten. Ich sage also immer noch, dass die Schleife derfor i in date grade; do
upgrate
.Sie können auch die Bash- Verlaufserweiterung verwenden , um Teile der aktuellen Befehlszeile abzurufen und zu ändern:
!#
ist die aktuelle Zeile:s/date/grade
ist ein Modifikator, derdate
durch ersetztgrade
quelle
!#:s/dat/grad
stattdessenEine weitere einfache Option
xargs
anstelle vonfor
:Prüfung:
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.
quelle
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
obwohl dies etwas länger istprintf '%s'
ist im Allgemeinen eine gute Praxis, da Sie nicht entkommen können, z . B. mit--help
oder-e
.printf '%s\0'
wäre es sogar noch besser,xargs
hat eine Flagge, um null terminierteErstellen Sie eine Funktion wie folgt:
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:
quelle
Die Antwort von @ muru veranlasste mich, mich über die Erweiterung der Geschichte zu informieren, und ich fand eine andere Variante
^string1^string2^
entspricht!!:s/string1/string2/
, welche den letzten Befehl und ersetzt nimmtstring1
mitstring2
.quelle
Ich verwende den
apt-get up
Teil des Befehls mit der folgenden Tastenfolge erneut:Up ArrowBackspaceBackspaceBackspaceBackspace
quelle