Bash Alias - Öncelik / Gölgeleme (/ gizleme / başarısızlık)
.Bashrc'de bazı takma adlar kurulumum (bu sırayla) var:
alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'
Satın alias
aldıktan sonra bunları onaylamak :
alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'
Yeni takma adı olanı ls
gayet iyi çalıştırabilirim ve lsc takma adına zincirlenir ve sonra lsc takma adıyla ilişkili komutu çalıştırır. Ben de koşabilirim lscR
ve beklendiği gibi çalışıyor.
lsc
Yine de kendi kendine koşmaya çalışırsam , şunu elde ederim:
$ lsc
lsc: command not found
Bu senaryoda, kabuğun lsc takma adını neden gölgelediği / gizlediği hakkında bir fikriniz var mı? (Burada aynı sonucu elde etmek için sadece 'ls'yi çalıştırabildiğimde' lsc 'çalıştırmanın anlamsız olduğunun farkındayım, ama bu senaryodaki mermilerin davranışını anlamaya çalışıyorum).
DÜZENLEME: Soru yanıtlarında sağlanan (bash) kabuğu davranışı için aşağıdaki geçici çözümler.
Orijinal soruya gerçekten yararlı bazı cevaplar verilmiştir. Cevaplarda açıklanan genişletme davranışını kısa devre yapmak için, ikinci bir takma adın, zaten takma ad verdiğiniz bir komutu genişletmeye çalışmasını önlemenin en az iki yolu var gibi görünüyor. Örneğin, alias cmd='cmd --stuff'
çağrılan yerel bir komutu geçersiz kılan bir komutunuz cmd
varsa, 'cmd' takma adının cmd
diğer takma adlar içinde yerel yerine kullanılmasını şu şekilde engelleyebilirsiniz :
(wjandrea'nın bu ilk yaklaşım için yaptığı yorum sayesinde)
cmd
diğer takma adda 'command' ön eki , örn.alias other-cmd-alias='command cmd --other-stuff'
veya,
- Benzer şekilde, diğer adlar içinde ters eğik çizgi ile ön ek olarak takma adlardan kaçabilirsiniz (komut satırında da yapabileceğiniz gibi) '', örn
alias other-cmd-alias='\cmd --other-stuff'
.
Yanıtlar
Bash, takma adların takma adlar içermesine izin verir, ancak sonsuz döngülere karşı yerleşik korumalara sahiptir. Sizin durumunuzda, yazdığınızda lsc
, bash önce takma adı şu şekilde genişletir:
ls -Flatr --color=always
Yana ls
da bir diğer adıdır, bash bunu genişler:
lsc -Flatr --color=always
lsc
bir takma addır, ancak oldukça mantıklı bir şekilde, bash onu ikinci kez genişletmeyi reddediyor . lsc
Adında bir program varsa , bash onu çalıştırır. Ama yok ve bu yüzden alıyorsun command not found
.
Ek
Çalışırken farklıdır lscR
. lscR
şuna genişler:
ls -FlatrR --color=always
Yana ls
bir takma bu genişlediğinde şudur:
lsc -FlatrR --color=always
Yana lsc
bir takma bu genişlediğinde şudur:
ls -Flatr --color=always -FlatrR --color=always
Yana ls
zaten kez genişletildi, bash bunu genişletmek reddeden ikinci kez . Adlı gerçek bir komut ls
var olduğu için çalıştırılır.
Tarih
Tarafından belirtildiği gibi Schilly yorumlarda, bash bir takma gelen ikinci kez genişleyen kavramını ödünç ksh .
Bir yana
Takma adlar kullanışlıdır ancak çok güçlü değildir. Eğer bir takma adla karmaşık bir şey yapma eğilimindeyseniz, örneğin argüman ikamesi gibi, yapmayın; bunun yerine bir kabuk işlevi kullanın.
Gönderen bash kılavuzu :
Değiştirilen metnin ilk sözcüğü takma adlar için test edilir, ancak genişleyen bir takma adla aynı olan sözcük ikinci kez genişletilmez. Bu , örneğin bir
ls
kişinin "ls -F
" takma adının kullanılabileceği ve Bash'in değiştirme metnini tekrar tekrar genişletmeye çalışmadığı anlamına gelir .
Diğer ls
adda, ls
olarak genişletilir lsc
ve sonra tekrar olarak genişletilir ls -Flatr --color=always
ve orada başlangıçta genişletildiği için takma ad genişletme durur ls
. Bu nedenle, komut ls
artık harici bir komuta çözümlenerek sorunsuz çalışıyor .
In lsc
takma, lsc
genişletilir ls -Flatr --color=always
, sonra ve ls
şimdi genişletilir lsc
ve orada beri, takma genişleme durur lsc
başlangıçta arttırıldığını açıkladı. Bu nedenle, bash başka birini bilmediği için komut başarısız olur lsc
.