Takma ad olmadan her iki komutu sırayla tek bir satırda yürütmek apt up
için apt update
ve apt upgrade
komutları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 up
için apt update
ve apt upgrade
komutları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, ~/.bashrc
bu 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 eval
yerine kullanmak echo
. Ancak eval
genellikle 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 echo
iki apt
, sudo
ve sh
çatallama sürü böylece):
$ echo "apt "{update,upgrade}";"|sudo sh
Biz de kullanabilirsiniz set
konumsal parametrelere istenen dizisini açmak ve sadece yürütülecek apt
olan $1
ve $2
args:
$ 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ı set
Ben 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/sh
Eğ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 while
döngü yoluna gidebiliriz :
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Tabii ki echo
gerç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
.
apt
farklı 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/grade
Bir modifiye edici olduğu yerine olup date
ilegrade
!#:s/dat/grad
yerine kullanarak 2 karakter daha kaydedebilirsiniz
xargs
Bunun 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 --help
veya ile -e
.
printf '%s\0'
daha da iyi olurdu, xargs
boş 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 string1
ile string2
.