Yanıtlar:
Diğerlerinin söylediği gibi, bunu yapamazsın.
Ancak kodu, ana program dosyanın üstünde olacak ve diğer işlevler aşağıda tanımlanacak şekilde bir dosyaya yerleştirmek istiyorsanız, ayrı bir main
işleve sahip olarak yapabilirsiniz .
Örneğin
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
main
Dosya sonunda aradığımızda , tüm fonksiyonlar zaten tanımlanmıştır. Açıkça geçen "$@"
için main
işlev görebilir komut komut satırı değişkenleri yapmak için gereklidir.
exit
Main çağrısı ile aynı satırdaki açık zorunlu değildir, ancak komut dosyası değiştirilirse çalışan bir komut dosyasının dağılmasını önlemek için kullanılabilir. Bu olmadan, kabuk, main
dönüşten sonra komut dosyası dosyasındaki komutları okumaya devam etmeye çalışır . (bkz . Tüm kabuk betiğini çalıştırmadan önce nasıl okunur? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
ana işlevi çağırmak için kullanırım , böylece başka bir komut dosyasında Main
yürütülmeden kaynak yapabilirim . Sonra fonksiyonları tekrar kullanabilir veya kontrol etmek için testler yazabilirim.
main "$@"; exit
(ile exit
aynı satırda main
), yorumlanırken değiştirilen dosyaya karşı bir koruma olarak da yararlıdır.
exit
aynı satırda main
Peşinde dosyadan tekrar emin kabuk okumazlar şey yapmak main
getiri.
main; exit
, main; exit $?
ya main <EOF>
her durumda, çıkış kodu main
komut çıkış kodu olarak kullanılır. Bu exit
sadece birisi çalışırken senaryoyu düzenlerse, işlerin dağılmasını önlemek olacaktır.
Hayır, fonksiyonlar onları çağırırken kabuklar ortamında bulunmalıdır.
Google'ın "Kabuk Stili Kılavuzu" bunun için bir düzeltmeye sahiptir:
main
En az bir başka işlev içerecek kadar uzun komut dosyaları için çağrılan bir işlev gereklidir.
Komut dosyasının en sonunda, tüm işlevlerden sonra, bir işlevde olmayan tek ifade olarak,
main "$@"
Bu main
, komut dosyasına verilen parametrelerle işlevi çağırır . main
Fonksiyon komut dosyasının en üstünde yer alabilir (stil kılavuzu altındaki koymak için söylüyor, ama sonra tekrar, birçok şeyler söylüyor).
Kabuk main
çağrıyı aldığında , komut dosyasındaki tüm işlevler ayrıştırılır ve bu nedenle main
işlevin içinden çağrılabilir .
Hayır, işlevler kullanılmadan önce bildirilmelidir. Kabuk komut dosyaları satır satır okunur ve satır satır hareket edilir; bu nedenle bir işlev, bildirimi yürütülene kadar mevcut değildir.
C
rahat.
. yourfile
) yapabilirsiniz.
if
bir işlevin dışında çıplak ifadeleriniz yoktur. İşlevi ne zaman tanımlanmalıdır zorunda değildir beyanif
sadece zaman ihtiva eden işlevini çağırır onu.
Kabuk declaring
bir işlev kavramına sahip değildir . Dolayısıyla ileri bir beyanınız olamaz.
Sonuç olarak, çağrılmadan önce işlev uygulamasının kabuk tarafından okunması gerekir.
autoload f
bash