Bash Alias ​​- Öncelik / Gölgeleme (/ gizleme / başarısızlık)

Aug 17 2020

.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 aliasaldıktan sonra bunları onaylamak :

alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

Yeni takma adı olanı lsgayet 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 lscRve beklendiği gibi çalışıyor.

lscYine 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 cmdvarsa, 'cmd' takma adının cmddiğ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)

  1. cmddiğer takma adda 'command' ön eki , örn.alias other-cmd-alias='command cmd --other-stuff'

veya,

  1. 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

13 John1024 Aug 17 2020 at 11:58

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 lsda bir diğer adıdır, bash bunu genişler:

lsc -Flatr --color=always

lscbir takma addır, ancak oldukça mantıklı bir şekilde, bash onu ikinci kez genişletmeyi reddediyor . lscAdı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 lsbir takma bu genişlediğinde şudur:

lsc -FlatrR --color=always

Yana lscbir takma bu genişlediğinde şudur:

ls -Flatr --color=always -FlatrR --color=always

Yana lszaten kez genişletildi, bash bunu genişletmek reddeden ikinci kez . Adlı gerçek bir komut lsvar 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.

6 muru Aug 17 2020 at 12:00

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 lskiş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 lsadda, lsolarak genişletilir lscve sonra tekrar olarak genişletilir ls -Flatr --color=alwaysve orada başlangıçta genişletildiği için takma ad genişletme durur ls. Bu nedenle, komut lsartık harici bir komuta çözümlenerek sorunsuz çalışıyor .

In lsctakma, lscgenişletilir ls -Flatr --color=always, sonra ve lsşimdi genişletilir lscve orada beri, takma genişleme durur lscbaş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.