Her ikisini de yalnızca tek bir satırda yürütmek için `` apt update`` ve `` apt upgrade '' komutlarının `` apt up '' bölümünü yeniden kullanın


11

Takma ad olmadan her iki komutu sırayla tek bir satırda yürütmek apt upiçin apt updateve apt upgradekomutlarının bir kısmını yeniden kullanma .

Gibi bir şey: apt up{date,grade}.


Aslında bunu başarmanın amacı ne olurdu? Bu neden ilginç / alakalı olabilir?
vanadium

25
@vanadium Biz linux kullanıcısıyız, anlamsız şeyler denemek daha karmaşık şeylere daha sonra uygulanabilecek teknikleri öğrenmemize izin veriyor, eğer hiçbirimiz dürüst olmayalım, hiçbirimiz burada olmaz
Darren H

1
@DarrenH Gerçekten de böyle düşündüm :-)
vanadium

Yanıtlar:


19

Basit yol (ve daha verimli) döngü için (bir satırda ancak burada açıklık için birden çok satırda gösterilmiştir):

for i in {date,grade}; do
     apt up${i}
done

Akıllı yol, ~/.bashrcbu iki komut için bir takma ad oluşturmak ve bir daha tekrar yazmayı unutmaktır:

alias upgrade=' sudo apt update && sudo apt upgrade'

Ayrıntılı yol, bunu yapmaktır:

$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update &&  sudo apt upgrade &&  :

Ne olduğunu görüyor musun? Kabuk tarafından çalıştırılacak geçerli bir metin dizesi oluşturuyoruz. Şimdi tek yapmanız gereken kullanmak evalyerine kullanmak echo. Ancak evalgenellikle kabuk komut dosyalarında önerilmez ve bu komut for döngüsünden çok daha kıvrımlı ve taşınabilir değildir. Eval olmadan tema üzerinde Varyasyon (ve en kısa şimdiye kadar, ancak verimli nedeniyle boru ve çoklu komutlara echoiki apt, sudove shçatallama sürü böylece):

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

Biz de kullanabilirsiniz setkonumsal parametrelere istenen dizisini açmak ve sadece yürütülecek aptolan $1ve $2args:

$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade

Alternatif olarak, döngü için bir sıra belirtmezseniz, varsayılan olarak konum parametrelerini işlemeye ayarlandığından döngü için tekrar kullanın. for variable (sequence)

$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade

Kullanılması setBen kabukları ile kim iş çok profesyoneller arasında bakın çok yaygın bir tekniktir ve iyi bir neden için - bu çok taşınabilir ve çalışacak /bin/shEğer bu dizi ya da sahip olduğu {a,b,c}genişleme. POSIX-ly taşınabilir yolu olurdu set update upgrade ; for i; do echo apt $i ;done. Ayrıca, bu verimli olmalıdır.


Veya whiledöngü yoluna gidebiliriz :

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

Tabii ki echogerçek komut yürütmesi olmadan çalıştırmayı unutmayın


7
Sadece for döngüsünü tek bir satırda yapın. for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
Dosyalarınızı güzel ve düzenli tutmayı tercih ederseniz, takma adlar da ekleyebilirsiniz ~/.bash_aliases. Bu dosyanın kaynağı otomatik olmalıdır ~/.bashrc.
francescop21

2
Cevabımı belki de istediğin şeyle güncelledim. Tek astarlı, ama bunu kolaylaştırır mı diye düşünmüyorum. Açıkçası, aptfarklı argümanlarla (güncelleme ve yükseltme) iki komut (evet, bu iki komut) çalıştırmak istediğinizde bunu yapmanın bir anlamı yok , bu yüzden hala döngü için yol olduğunu söyleyeceğim
Sergiy Kolodyazhnyy

1
Döngü üstbilgisi için dize genişletmeye gerek yok, sadece yinelemeleri adlandırın:for i in date grade; do
rexkogitans

5
Böyle bir takma ad açıkça belirtilmelidir upgrate.
boru

14

Geçerli komut satırının bölümlerini almak ve değiştirmek için bash geçmişi genişletmesini de kullanabilirsiniz :

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# şu anki satır
  • :s/date/gradeBir modifiye edici olduğu yerine olup dateilegrade

6
Bunun !#:s/dat/gradyerine kullanarak 2 karakter daha kaydedebilirsiniz
Dan

9

xargsBunun yerine kullanan başka bir basit seçenek for:

echo up{dat,grad}e | xargs -n1 apt

Ölçek:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

Ancak, Sergiy gibi bir kabuk takma adını tercih ederim, çünkü bu “basit” yollar aslında kullanışlı olacak kadar basit değildir.


1
Çok hoş. printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%Bu biraz daha uzun olmasına rağmen tema varyasyonu olabilir
Sergiy Kolodyazhnyy

printf '%s'genellikle iyi bir uygulamadır, çünkü ondan kaçamazsınız, örneğin --helpveya ile -e.
yyny

@YoYoYonnY Evet. Belki printf '%s\0'daha da iyi olurdu, xargsboş sonlandırılmış argümanlarla başa çıkmak için bir bayrağı var
Sergiy Kolodyazhnyy

2

Bunun gibi bir işlev oluşturun:

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

Sonra koşabilirsiniz repeat 'apt up' {date,grade}. Bu, tamamen farklı komutlar için tekrar kullanılabilir olma avantajına sahiptir, ancak bu komut için herhangi bir yazmayı kurtarmaz.

Böyle bir şeyin muhtemelen daha yararlı olduğuna dair diğer cevaplara kesinlikle katılıyorum:

alias apt-up='apt update && apt upgrade'

0

@ muru'nun cevabı beni tarihin genişlemesine dair okumaya yönlendirdi ve başka bir varyant buldum

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^eşdeğer etmektir !!:s/string1/string2/son komuta ve yerine geçer alır string1ile string2.


-2

Komutun bir apt-get upkısmını aşağıdaki anahtar dizisini kullanarak yeniden kullanıyorum:

Up ArrowBackspaceBackspaceBackspaceBackspace

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.