Kullanıcı tanımlı kabuk işlevini nereye koyabilirim?


14

Benim için işleri basitleştirecek bir işlev yaratmayı planlıyorum. İşlev şöyle bir şey olurdu:

function lazymode()
{
echo "Hello World!";
}

Ben komutunu kullandığınızda böylece lazymodede kabuk , bu çıkış olacak Hello World!.

Kullanıcı tanımlı işlevi hangi dosyaya koymalıyım?

Yanıtlar:


14

İşleve bağlıdır. Eğer böyle bir süper basit bir astar ise, bir takma ad oluşturabilir veya işlevi yapıştırabilirsiniz ~/.bashrc(başladığında bash yükleyen bir dosya).

Biraz daha etli bir şey oluşturuyorsanız, ~/bin/varsayılan olarak mevcut olmayan (sadece bir dizin), ancak yolunuzda olması gereken kendi yürütülebilir komut dosyasını oluşturmak daha mantıklı olabilir . Bunun için dosyanın yürütülebilir ( chmod +x filename) olması ve uygun bir #!/bin/bashstanza ile başlaması gerektiğini unutmayın .

İkinci rotanın bazı belirgin faydaları vardır:

  • Neyin mevcut olduğunu görmek daha kolay
  • Sözdizimi hatası profilinizi depolamaz
  • Komut dosyasını değiştirirseniz, bash yapılandırmanızı yeniden kaynaklamaya devam etmenize gerek yoktur
  • Tam yol kullanıldığı sürece veya ~/bin/o kabuk için de yoldaysa (çoğu durumda AFAIK olması gerekir) herhangi bir kabuk için kullanılabilir .

Daha sonraki seçeneği kullandım. İşlevim dosyaları silen komutlar içeriyor, wget's bir şey, javac ve java komutlarını yürütüyor. ve gnome terminalinde denediğimde iyi çalışmıyor. Sence bir sorun mu var?
Abel Melquiades Callejo

Bunun yerine ne yapar?
Oli

Zaten düzeltildi. Bu cevap ile giderildi
Abel Melquiades Callejo

umm ... /usr/local/binbunun yerine kullanıcı betikleri karışmamalı $PATHmı?
Braiam

Bana öyle geliyor ki, işlevleri yerine getirmenin küçük ama kayda değer bir avantajı ~/.bashrc( sourced gibi), Bash'in PATH araması yapmadan önce işlevleri aramasıdır.
Zanna

4

En iyi seçim ~/.bashrcdosya olacaktır .

Ya da içinde doğrudan kabuk işlev tanımları yazabilir ~/.bashrcbunlardan çok var ve kalabalıklaştırmasını istemiyorsanız, dosya veya ~/.bashrcsadece olmak emin kaynağına - dosyayı size seçtiğiniz başka bir dosyada hepsini koyabilirsiniz, o dosyası ~/.bashrc. Örneğin, işlevlerinizi içeren dosya adlandırılmışsa bash_functions, ~/.bashrcdosyanıza satırları eklemeniz yeterlidir :

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

Veya eşdeğer olarak:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

burada .sadece sembolik bir temsilidir source. ifTest markaları Dosyanın /path/to/bash_functionsbunu kaynak denemeden önce mevcut.

Bu teknik, varlığını test etmek ve daha sonra kaynak için yukarıdaki adda benzer bir sözdizimi kullanarak ~/.bashrcbir takma ad oluşturmaya çok benzer .~/.bash_aliases~/.bashrc


teşekkürler, işe yaradı. Bu arada, .profile ile farkı nedir? bazı linux, bashrc fonksiyonları koyamıyorum
Abel Melquiades Callejo

2
~/.profiledosya, giriş kabukları için komut yorumlayıcısı tarafından yürütülür. GUI kullandığınızda ve terminali açtığınızda, oturum açma kabuğunda olacağınız için bu dosya yürütülmez.
Radu Rădeanu

1

İşte kalıcı bir işlevi bildirmek için gerekli bir prosedür:

  1. Açık ~/.bashrcbir metin editörü dosyası. Nasıl kullanacağınızı bildiğiniz sürece ve açtığınız sürece hangi metin düzenleyicisinin önemi yoktur/home/<username>/.bashrc

  2. Deklarasyonun sonunda ~/.bashrckendi işlevinizi beyan edin, örneğin:

    find_dirs(){
        find "$1" -type d
    }
  3. Dosyayı kaydedip kapatın.

~/.bashrcDosya (Yeni terminal sekme, giriş yoluyladır interaktif kabuğu her açtığınızda okumak olduğunu sshya da açık tty1 veya diğer sanal konsol). ~/.bashrcEtkileşimli olmayan kabuklar için okunmadığından , komut dosyası dosyalarında bu kullanılamaz . Seçeneği bashile çalıştırırsanız da kullanılamaz --norc.

İşlevin şu anda açık olan sekmede hemen kullanılabilir olmasını istiyorsanız, source ~/.bashrckomutunu kullanın.


İşlevler, normal komutlar gibi argümanlar alır. Örneğin, $1yoluyla $9bir işlevi çağırdığınızda konumsal parametreleri belirtin. Yukarıdaki örnekte find_dirsyalnızca bir konum parametresi alınır ve olarak adlandırılır find_dirs /etc. $@Tüm konumsal parametrelere başvurmak için de kullanabilirsiniz . İşlevler de yeniden yönlendirmeyi kabul eder. find_dirs $1 > /dev/null; İle bir işlevi çağırabilirsiniz . biz de aşağıdaki gibi ilan edebilir:

find_dirs(){
    find "$1" -type d
}

Not man bash: "İşlevler geçerli kabuk bağlamında yürütülür; bunları yorumlamak için yeni bir işlem oluşturulmaz". Bu, kabuk yürütme ortamınızı değiştirme yeteneğine sahip işlevlerin de farkında olmanız gerektiği anlamına gelir - değişkenleri ve terminal ayarlarını değiştirin.

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.