Cómo reutilizar la apt up
parte de los comandos apt update
y apt upgrade
para ejecutar ambos comandos en secuencia en una sola línea sin un alias.
Algo así como: apt up{date,grade}
.
Cómo reutilizar la apt up
parte de los comandos apt update
y apt upgrade
para ejecutar ambos comandos en secuencia en una sola línea sin un alias.
Algo así como: apt up{date,grade}
.
Respuestas:
La forma simple (y más eficiente) es a través del bucle for (en una línea, pero aquí se muestra en varias líneas para mayor claridad):
for i in {date,grade}; do
apt up${i}
done
La forma inteligente es crear un alias ~/.bashrc
para estos dos comandos y olvidarse de volver a escribirlo de nuevo:
alias upgrade=' sudo apt update && sudo apt upgrade'
La forma elaborada es hacer esto:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
¿Ves lo que está pasando? Estamos creando una cadena de texto válida para que Shell la ejecute. Ahora todo lo que necesita hacer es usar en eval
lugar de echo
. Pero eval
generalmente no se recomienda en las secuencias de comandos de shell y este comando es mucho más complicado y no portátil que el bucle for. Variación sobre el tema sin evaluación (y la más corta hasta ahora, pero no eficiente debido a la tubería y múltiples comandos echo
, dos apt
, sudo
y sh
mucho bifurcación):
$ echo "apt "{update,upgrade}";"|sudo sh
También podemos usar set
para convertir la secuencia deseada en parámetros posicionales y simplemente ejecutar apt
con $1
y $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
O, alternativamente, use for loop nuevamente, ya que el valor predeterminado es procesar parámetros posicionales si no especifica una secuencia en el for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
El uso set
es una técnica muy común que veo entre los profesionales que trabajan mucho con los shells, y por una buena razón: es muy portátil y funcionará /bin/sh
donde no hay arrays ni {a,b,c}
expansión. Así sería POSIX-ly portátil set update upgrade ; for i; do echo apt $i ;done
. Además, esto debería ser eficiente.
O podemos ir a la while
ruta del bucle:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Por supuesto, recuerde ejecutarlo sin echo
que tenga lugar la ejecución real del comando
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Este archivo debe ser obtenido automáticamente por ~/.bashrc
.
apt
comandos) con diferentes argumentos (actualizar y actualizar), así que todavía diré que el bucle es el camino a seguir
for i in date grade; do
upgrate
.
También puede usar la expansión del historial de bash para obtener partes de la línea de comando actual y modificarla:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
es la línea actual:s/date/grade
es un modificador que sustituye date
congrade
!#:s/dat/grad
en su lugar
Otra opción simple usando en xargs
lugar de for
:
echo up{dat,grad}e | xargs -n1 apt
Prueba:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Sin embargo, preferiría un alias de shell como Sergiy porque estas formas "simples" no son lo suficientemente simples como para ser realmente útiles.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
aunque esto sea un poco más largo
printf '%s'
generalmente es una buena práctica ya que no puede escapar de ella, por ejemplo, con --help
o -e
.
printf '%s\0'
sería aún mejor, xargs
tiene una bandera para manejar args terminados nulos
Crea una función como esta:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Entonces puedes correr repeat 'apt up' {date,grade}
. Esto tiene la ventaja de ser reutilizable para comandos totalmente diferentes, aunque no le ahorra ningún tipo de escritura para este.
Ciertamente estoy de acuerdo con algunas de las otras respuestas de que algo como esto probablemente sea más útil:
alias apt-up='apt update && apt upgrade'
La respuesta de @ muru me llevó a leer sobre la expansión de la historia y encontré otra variante
$ sudo apt update
$ ^dat^grad^
^string1^string2^
es equivalente a !!:s/string1/string2/
, que toma el último comando y lo reemplaza string1
con string2
.