Kabuk takma adlarını nasıl “istifleyebilirim”?


12

Benim .profile( benim shöykünme modunda kaynaklı .zshrc) aşağıdaki snippet var:

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

Ancak, ikinci takma ad her zaman birinciyi geçersiz kılar:

% type pacman
pacman is an alias for pacman --color auto

İkinci takma atamanın ilk atamayı "devralması" için nasıl yapabilirim, böylece /usr/bin/pacmaticvarsa takma ad olur pacmatic --color auto?

Takma adlar yerine işlevleri kullanmaktan kaçınmıyorum, ancak mantık her pacmançağrıldığında gerçekleştirilmediyse tercih ederim (bir pacmatickez, kabuk başlangıcında, her seferinde pacmançalıştırılmadığını kontrol etmek istiyorum ). Ayrıca shtaşınabilir bir komut dosyasını tercih ederim , ancak bu mümkün değilse, tam zshsözdizimini kullanabilirsiniz .

(Evet, --color autobunun pacmatictakma adı ekleyerek kolayca çözülebileceğini biliyorum. Ama bunu Right Way ™ ile yapmak istiyorum.)

Googling'i denedim ve sayfalara baktım, ama boşuna.


Doğru Yol'un takma adlar yerine işlevleri kullanmak olduğunu düşündüm. Takma adlardan daha hızlı olduklarını duydum (en azından bashiçeri) ve kolayca birbirlerini arayabilirler.
Wutaz

Yanıtlar:


5

Bir kabuk aliasa'ya benzer şekilde davranır #define, yani bir kabuk takma adını yeniden tanımlamak öncekini geçersiz kılar.

Doğru Yol TM ne olacağından emin değilim , ancak bir yaklaşım parametreleri kabul eden bir kabuk işlevi kullanmak ve bunu bir takma ad oluşturmak için kullanmak olurdu. Kod snippet'iniz şu şekilde yeniden yazılabilir:

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


Ayrıca, farklı takma adlar kullanıyor olsanız ve diğerini tanımlamak için bir tane kullanmaya çalışsanız bile, takma adlar varsayılan olarak etkileşimli olmayan modda genişletilmediğinden çalışmaz. Ayarlayarak etkinleştirmeniz gerekir expand_aliases:

shopt -s expand_aliases

Kılavuzdan alıntı:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).

bu istediğime en yakın gibi görünüyor, ama çalışmıyor. hem öykünme modunda hem de yerel modda type pacmandöner . Ancak, yaptığım düzenleme gibi görünüyor. pacman is an alias for pacman --color autoshzsh
strugee

FWIW, zsh eşdeğeri setopt aliases.
strugee

OP kullanıyor zsh. Ve kabuk zaten etkileşimli görünüyor.
Mikel

6

Takma ad ikamesi yalnızca etkileşimli kaynaklardan satır okurken yapılır. Yani ikinci takma ad ilkinden etkilenmez, dolayısıyla değişmez değiştirme.

Belki de benzer bir şey:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

Bu, 'pacman' değerini uygun değere ayarlayacaktır, PACMAN env değişkeni dışa aktarılmaz, bu yüzden komut dosyası bittiğinde kaybolur ve "çift tırnak" kullanılması, takma ad bildirimlerinde değişken ikamenin gerçekleşmesini sağlar, her çağrı için değil.

Benzer bir yöntem kullanıyorum:

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

Temel olarak, env var PACMAN'ı ayarlayın, yollarda pacmatic için test edin, bulunursa PACMAN'ı ayarlayın ve ardından diğer adı tanımlayın.

Hmm, biraz daha optimize edebilirsiniz ...

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

Taa Daa! PACMAN ayarlanmamış veya null ise 'pacman' olarak ayarlayın, aksi takdirde 'hangi' hattı ile pacmatic olarak ayarlanan PACMAN değerine ayarlayın.


Takma adlar neden yalnızca "etkileşimli kaynaklar" için çalışır?
Mikel

Varsayılan olarak bashtakma adları etkileşimli olmayan modda genişletmezsiniz, ancak bu "etkileşimli kaynaklar" ile nasıl aynıdır?
Mikel

2

Zsh'de, aliasesilişkilendirilebilir diziyi kullanarak bir takma ada kolayca ekleyebilirsiniz :

alias pacman="${aliases[pacman]-pacman} --color auto"

Diğer kabuklarda, aliasmevcut takma adlar hakkında bilgi edinmek için komutun çıktısını kullanmanız gerekir .

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

Bunu bir olasılık olarak sunarken, diğer cevapların önerdiği bir değişkeni kullanmaya devam ediyorum. Daha nettir ve hangisini kullanımda olduğuna pacmaticveya pacmanhangisinin kullanıldığına bağlı olarak bazı şeyleri farklı yapılandırmak istiyorsanız değişkenin değerini ayırt edebilirsiniz .

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'


0
pacman() ( def_args="--color auto" bin=
    [ -x ${bin:=/usr/bin/pacmatic} ] || bin=
    [ -x ${bin:=/usr/bin/pacman} ] || bin= 
    ${bin:?WHERE THE HELL IS PACMAN????} \
        $def_args "$@"
)

Takma adlar kuşlar içindir.

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.