Bash fonksiyonları nasıl çağırılır


28

Belki de buna yanlış yoldan bakıyorum .. Ama burada yapmaya çalıştığım şeyi yapıyorum. İşlerimin çoğunu Java ile yapın, ancak sadece bir unix (bash) ortamına dönüştüm. Bunu yapıyorum:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Ancak dosyamda iki fonksiyon var ve onları komut satırından ayrı olarak çağırmak istiyorum. Yani: myFunc.ls2()hatta sadece ls2. İşlevleri dosyama ekleyebileceğimi biliyorum, .bashrcancak bu işlevleri ekleyerek bunları yürütmem için başka bir yol var .bashrcmı?

Yanıtlar:


25

Bunu yapmanın bir yolu, biraz daha fazla yazı yazmayı içeren sourcekomuttur. MyFunc'tan bir fonksiyon çağırmak için kullanabilirsiniz source myFunc; ls2ve Hello World'ün çıktısını alır.

Mesela bende bir dosya var say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

şimdi talk()komut satırından onun işlevini çağırmak istiyorum :

[john @ awesome ~] $ kaynak say.sh; konuşma
Merhaba!

başka bir bash betiğinden çağırmak için:

#!/bin/bash
source say.sh
talk

Ayrıca, her birini ayrı bir komut dosyasına koyabilir ve PATH değişkeninizde bulunan bir dizine ekleyebilirsiniz.

Bu nedenle, örneğin denilen tek bir komut dosyasında hello:

#!/bin/bash
echo "Hello World"

şimdi onu PATH'unuzdaki, dizinlere göre çalıştırarak görüntüleyebileceğiniz dizinlerden birine koyun echo $PATH. Mevcut bir dizini istersen veya kullanmak istersen, PATH'ine başka bir dizin ekleyebilirsin. Dosyayı oraya kopyaladıktan sonra, çalıştırılabilir olmasını sağlayın chmod +x filename.


3
Sadece açık olmak gerekirse: dosyayı her komut dosyası veya kabuk başlangıcı için yalnızca bir kez kaynaklamanız gerekir. Kaynak dosyaya tekrar gönderme yapmadan, işlevi bundan sonra istediğiniz kadar çağırabilirsiniz.
sonraki duyuruya kadar duraklatıldı.

5

Başka bir yaklaşım functions.sh( ~/binörneğin dizinde) adında bir komut dosyası oluşturmak olacaktır .

Bu komut dosyasında, tüm kişisel işlev tanımlarınızı eklersiniz (diyelim ki, bu işlevi her eklediğinizde, bu dosyaya eklediğiniz ...)

Sonunda source ~/bin/functions.shsatırı .bashrcdosyaya eklemelisin . Bu şekilde onları komut satırından arayabileceksiniz, .bashrctemiz kalacaksınız ve kişisel işlevleriniz için özel bir yeriniz olacak.


5

Benim gibiyseniz, ortamınızı işlevlerle karıştırmak istemezsiniz. Ayrıca ne yaptıklarına göre bir araya gelen bir fonksiyonlar grubunuz var, bu yüzden onları aynı script dosyasına koymak mantıklı. (Birden fazla dosya içeren bir klasörün aynı amaca hizmet edebileceğini biliyorum). İşte komut dosyasında belirli bir işlevi çağırmanıza olanak sağlayan olası bir çözüm:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

Bunu source, iki farklı sh dosyasında aynı ismin iki fonksiyonuna sahip olmaktan daha fazla seviyorum . Ben değiştirerek parametrelerin isteğe bağlı sayıda işlemek için bunu rafine $1 $2 $3 $4 $5ileFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: Neden çemberin içinden atlamak? Sadece son satırı olarak değiştir "$@". Not: Yaklaşımınız aslında yanlış; Son kısım "$FUNC_CALL" "$@"  (yani,  $FUNC_CALLtırnak içinde olmalıdır) olmalıdır.
Scott,

Nedir "$FUNC_CALL"?
ctrl-alt-delor

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.