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}.
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}.
Yanıtlar:
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
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases. Bu dosyanın kaynağı otomatik olmalıdır ~/.bashrc.
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
for i in date grade; do
upgrate.
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!#:s/dat/gradyerine kullanarak 2 karakter daha kaydedebilirsiniz
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.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%Bu biraz daha uzun olmasına rağmen tema varyasyonu olabilir
printf '%s'genellikle iyi bir uygulamadır, çünkü ondan kaçamazsınız, örneğin --helpveya ile -e.
printf '%s\0'daha da iyi olurdu, xargsboş sonlandırılmış argümanlarla başa çıkmak için bir bayrağı var
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'
@ 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.