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.