Comment réutiliser la apt up
partie des commandes apt update
et apt upgrade
pour exécuter les deux commandes en séquence sur une seule ligne sans alias.
Quelque chose comme: apt up{date,grade}
.
Comment réutiliser la apt up
partie des commandes apt update
et apt upgrade
pour exécuter les deux commandes en séquence sur une seule ligne sans alias.
Quelque chose comme: apt up{date,grade}
.
Réponses:
La manière simple (et plus efficace) est via une boucle for (sur une ligne, mais ici, elle est affichée sur plusieurs lignes pour plus de clarté):
for i in {date,grade}; do
apt up${i}
done
La façon intelligente consiste à créer un alias ~/.bashrc
pour ces deux commandes et à ne plus jamais le retaper:
alias upgrade=' sudo apt update && sudo apt upgrade'
La façon la plus élaborée est de le faire:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Vous voyez ce qui se passe? Nous construisons une chaîne de texte valide à exécuter par shell. Il ne vous reste plus qu'à utiliser à la eval
place de echo
. Mais elle eval
n'est généralement pas recommandée dans les scripts shell et cette commande est beaucoup plus compliquée et non portable que la boucle for. Variation sur le thème sans eval (et la plus courte jusqu'à présent, mais pas efficace en raison de la pipe et de plusieurs commandes echo
, deux apt
, sudo
et sh
donc beaucoup de fourches):
$ echo "apt "{update,upgrade}";"|sudo sh
Nous pouvons également utiliser set
pour transformer la séquence souhaitée en paramètres positionnels et simplement exécuter apt
avec $1
et $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Ou utilisez à nouveau pour la boucle, car elle revient par défaut au traitement des paramètres de position si vous ne spécifiez pas de séquence dans le for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
L'utilisation set
est une technique très courante que je vois chez les professionnels qui travaillent beaucoup avec des coques, et pour une bonne raison - c'est très portable et fonctionnera /bin/sh
là où vous n'avez pas de baies ou d' {a,b,c}
expansion. Donc, la manière portable POSIX serait set update upgrade ; for i; do echo apt $i ;done
. De plus, cela devrait être efficace.
Ou nous pouvons emprunter la while
boucle:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Bien sûr, n'oubliez pas de l'exécuter sans echo
pour que l'exécution de la commande ait lieu
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Ce fichier doit provenir automatiquement de ~/.bashrc
.
apt
commandes) avec des arguments différents (mise à jour et mise à niveau), donc je dirai toujours que la boucle est la voie à suivre
for i in date grade; do
upgrate
.
Vous pouvez également utiliser l'expansion de l'historique bash pour obtenir des parties de la ligne de commande actuelle et la modifier:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
est la ligne actuelle:s/date/grade
est un modificateur qui se substitue date
àgrade
!#:s/dat/grad
place
Une autre option simple utilisant xargs
au lieu de for
:
echo up{dat,grad}e | xargs -n1 apt
Tester:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Cependant, je préférerais un alias de shell tout comme Sergiy parce que ces méthodes «simples» ne sont pas assez simples pour être réellement utiles.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
bien que ce soit un peu plus long
printf '%s'
est généralement une bonne pratique car vous ne pouvez pas y échapper, par exemple avec --help
ou -e
.
printf '%s\0'
serait peut -être encore mieux, xargs
a un drapeau pour gérer les
Créez une fonction comme celle-ci:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Ensuite, vous pouvez courir repeat 'apt up' {date,grade}
. Cela a l'avantage d'être réutilisable pour des commandes totalement différentes, bien que cela ne vous évite pas de taper pour celle-ci.
Je suis certainement d'accord avec certaines des autres réponses que quelque chose comme ça est probablement plus utile:
alias apt-up='apt update && apt upgrade'
La réponse de @ muru m'a amené à lire sur l'expansion de l'histoire et j'ai trouvé une autre variante
$ sudo apt update
$ ^dat^grad^
^string1^string2^
est équivalent à !!:s/string1/string2/
, qui prend la dernière commande et remplace string1
par string2
.