Riutilizzare la parte `apt up` dei comandi` apt update` e `apt upgrade` per eseguire entrambi in sequenza in una sola riga


11

Come riutilizzare la apt upparte dei comandi apt updatee apt upgradeper eseguire entrambi i comandi in sequenza in una sola riga senza un alias.

Qualcosa come: apt up{date,grade}.


Quale sarebbe effettivamente l'obiettivo di raggiungere questo obiettivo? Perché questo può essere interessante / rilevante?
vanadio,

25
@vanadium siamo utenti di Linux, provare cose inutili ci consente di apprendere tecniche che possono essere applicate in seguito a cose più complesse, se nessuno di noi lo avesse mai fatto, siamo onesti, nessuno di noi sarebbe qui
Darren H

1
@DarrenH Questo è quello che ho pensato davvero :-)
vanadio il

Risposte:


19

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 ~/.bashrcper 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 evalinvece di echo. Ma evalgeneralmente 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, sudoe shquindi un sacco di fork):

$ echo "apt "{update,upgrade}";"|sudo sh

Possiamo anche usare setper trasformare la sequenza desiderata in parametri posizionali ed eseguire semplicemente aptcon $1e $2args:

$ 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/shdove 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 whilepercorso ad anello:

$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done 
apt update
apt upgrade

Ovviamente ricordati di eseguirlo senza echoche abbia luogo l'esecuzione effettiva del comando


7
Basta fare il ciclo for in una riga. for i in {date,grade}; do sudo apt up${i}; done
Videonauth,

3
Se preferisci mantenere i tuoi file belli e ordinati, puoi inserire anche degli alias ~/.bash_aliases. Questo file dovrebbe essere di provenienza automatica ~/.bashrc.
francescop21

2
Ho aggiornato la mia risposta con forse quello che vuoi. È un liner, ma non credo che lo renda più facile. Francamente, non ha senso farlo quando si desidera eseguire due comandi (sì, sono due aptcomandi) con argomenti diversi (aggiornamento e aggiornamento), quindi continuerò a dire che il ciclo è la strada da percorrere
Sergiy Kolodyazhnyy,

1
Non è necessario l'espansione della stringa nell'intestazione del ciclo, basta dare un nome alle iterazioni:for i in date grade; do
rexkogitans,

5
Un tale alias dovrebbe ovviamente essere chiamato upgrate.
pipe il

14

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 datecongrade

6
Puoi anche salvare altri 2 personaggi usando !#:s/dat/gradinvece
Dan

9

Un'altra semplice opzione che utilizza xargsinvece 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.


1
Molto bella. La variazione sul tema potrebbe essere printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%anche se questo è un po 'più lungo
Sergiy Kolodyazhnyy

printf '%s'è generalmente una buona pratica poiché non puoi evitarlo, ad esempio con --helpo -e.
yyny,

@YoYoYonnY Sì. Forse printf '%s\0'sarebbe ancora meglio, xargsha una bandiera per gestire argomenti con terminazione nulla
Sergiy Kolodyazhnyy,

2

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'

0

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 string1con string2.


-2

Ripristino la apt-get upparte del comando usando la seguente sequenza di tasti:

Up ArrowBackspaceBackspaceBackspaceBackspace

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.