Como reutilizar a apt up
parte dos comandos apt update
e apt upgrade
para executar os dois comandos em sequência em apenas uma linha sem um alias.
Algo como: apt up{date,grade}
.
Como reutilizar a apt up
parte dos comandos apt update
e apt upgrade
para executar os dois comandos em sequência em apenas uma linha sem um alias.
Algo como: apt up{date,grade}
.
Respostas:
A maneira simples (e mais eficiente) é via loop for (em uma linha, mas aqui é mostrada em várias linhas para maior clareza):
for i in {date,grade}; do
apt up${i}
done
A maneira inteligente é criar um alias ~/.bashrc
para esses dois comandos e esquecer de digitá-lo novamente:
alias upgrade=' sudo apt update && sudo apt upgrade'
A maneira elaborada é fazer isso:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Veja o que está acontecendo? Estamos construindo uma sequência de texto válida para ser executada pelo shell. Agora tudo que você precisa fazer é usar em eval
vez de echo
. Mas eval
geralmente não é recomendado em scripts de shell e esse comando é muito mais complicado e não portátil do que o loop for. Variação sobre o tema sem eval (e mais curto até agora, mas não é eficiente devido à tubulação e comandos múltiplas echo
, dois apt
, sudo
e sh
assim que os lotes de bifurcação):
$ echo "apt "{update,upgrade}";"|sudo sh
Também podemos usar set
para transformar a sequência desejada em parâmetros posicionais e apenas executar apt
com $1
e $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Ou use alternativamente o loop for novamente, pois o padrão é o processamento de parâmetros posicionais se você não especificar uma sequência no for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
O uso set
é uma técnica muito comum que eu vejo entre profissionais que trabalham muito com conchas, e por uma boa razão - é muito portátil e funcionará /bin/sh
onde você não tem matrizes ou {a,b,c}
expansão. Maneira POSIX-ly portátil seria set update upgrade ; for i; do echo apt $i ;done
. Além disso, isso deve ser eficiente.
Ou podemos seguir a while
rota do loop:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
É claro que lembre-se de executá-lo sem echo
que a execução real do comando ocorra
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Este arquivo deve ser gerado automaticamente por ~/.bashrc
.
apt
comandos) com argumentos diferentes (atualização e atualização), então ainda direi que o loop é o caminho a seguir
for i in date grade; do
upgrate
.
Você também pode usar a expansão do histórico do bash para obter partes da linha de comando atual e modificá-la:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
é a linha atual:s/date/grade
é um modificador que substitui date
porgrade
!#:s/dat/grad
vez disso
Outra opção simples usando, em xargs
vez de for
:
echo up{dat,grad}e | xargs -n1 apt
Teste:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
No entanto, eu preferiria um apelido de shell como Sergiy, porque essas maneiras "simples" não são simples o suficiente para serem realmente úteis.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
embora isso seja um pouco mais longo
printf '%s'
geralmente é uma boa prática, pois você não pode escapar dela, por exemplo, com --help
ou -e
.
printf '%s\0'
seria ainda melhor, xargs
tem uma bandeira para lidar com argumentos terminados nulos #
Crie uma função como esta:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Então você pode correr repeat 'apt up' {date,grade}
. Isso tem o benefício de ser reutilizável para comandos totalmente diferentes, embora não esteja poupando a digitação deste.
Eu certamente concordaria com algumas das outras respostas de que algo como isso é provavelmente mais útil:
alias apt-up='apt update && apt upgrade'
A resposta de @ muru me levou a ler sobre a expansão do histórico e encontrei outra variante
$ sudo apt update
$ ^dat^grad^
^string1^string2^
é equivalente a !!:s/string1/string2/
, que pega o último comando e substitui string1
por string2
.