Come riutilizzare la apt up
parte dei comandi apt update
e apt upgrade
per eseguire entrambi i comandi in sequenza in una sola riga senza un alias.
Qualcosa come: apt up{date,grade}
.
Come riutilizzare la apt up
parte dei comandi apt update
e apt upgrade
per eseguire entrambi i comandi in sequenza in una sola riga senza un alias.
Qualcosa come: apt up{date,grade}
.
Risposte:
Il modo semplice (e più efficiente) è via per il ciclo (su una riga ma qui è mostrato in più righe per chiarezza):
for i in {date,grade}; do
apt up${i}
done
Il modo intelligente è creare un alias ~/.bashrc
per questi due comandi e dimenticare di riscriverlo mai più:
alias upgrade=' sudo apt update && sudo apt upgrade'
Il modo elaborato è di fare questo:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Vedi cosa sta succedendo? Stiamo creando una stringa di testo valida per essere eseguita dalla shell. Ora tutto ciò che devi fare è usare eval
invece di echo
. Ma eval
generalmente non è raccomandato negli script di shell e questo comando è molto più contorto e non portatile rispetto al ciclo for. Variazione sul tema, senza eval (e più breve finora, ma non a causa efficiente per tubo e comandi multipli echo
, due apt
, sudo
e sh
quindi un sacco di fork):
$ echo "apt "{update,upgrade}";"|sudo sh
Possiamo anche usare set
per trasformare la sequenza desiderata in parametri posizionali ed eseguire semplicemente apt
con $1
e $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Oppure, in alternativa, utilizzare nuovamente per il ciclo, poiché per impostazione predefinita elabora i parametri posizionali se non si specifica una sequenza in for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
L'uso set
è una tecnica molto comune che vedo tra i professionisti che lavorano molto con le shell e, per una buona ragione, è molto portatile e funzionerà /bin/sh
dove non ci sono array o {a,b,c}
espansioni. Quindi il modo portatile POSIX sarebbe set update upgrade ; for i; do echo apt $i ;done
. Inoltre, questo dovrebbe essere efficiente.
Oppure possiamo seguire il while
percorso ad anello:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Ovviamente ricordati di eseguirlo senza echo
che abbia luogo l'esecuzione effettiva del comando
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. Questo file dovrebbe essere di provenienza automatica ~/.bashrc
.
apt
comandi) con argomenti diversi (aggiornamento e aggiornamento), quindi continuerò a dire che il ciclo è la strada da percorrere
for i in date grade; do
upgrate
.
Puoi anche usare l' espansione della cronologia di bash per ottenere parti della riga di comando corrente e modificarla:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
è la linea corrente:s/date/grade
è un modificatore che sostituisce date
congrade
!#:s/dat/grad
invece
Un'altra semplice opzione che utilizza xargs
invece di for
:
echo up{dat,grad}e | xargs -n1 apt
Test:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Tuttavia, preferirei un alias di shell proprio come Sergiy perché questi modi "semplici" non sono abbastanza semplici per essere effettivamente utili.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
anche se questo è un po 'più lungo
printf '%s'
è generalmente una buona pratica poiché non puoi evitarlo, ad esempio con --help
o -e
.
printf '%s\0'
sarebbe ancora meglio, xargs
ha una bandiera per gestire argomenti con terminazione nulla
Crea una funzione come questa:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Quindi puoi correre repeat 'apt up' {date,grade}
. Questo ha il vantaggio di essere riutilizzabile per comandi totalmente diversi, anche se non ti fa risparmiare alcuna digitazione per questo.
Concordo certamente con alcune delle altre risposte che qualcosa del genere è probabilmente più utile:
alias apt-up='apt update && apt upgrade'
La risposta di @ muru mi ha portato a leggere l' espansione della storia e ho trovato un'altra variante
$ sudo apt update
$ ^dat^grad^
^string1^string2^
è equivalente a !!:s/string1/string2/
, che accetta l'ultimo comando e lo sostituisce string1
con string2
.