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 mainiş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
mainDosya sonunda aradığımızda , tüm fonksiyonlar zaten tanımlanmıştır. Açıkça geçen "$@"için mainişlev görebilir komut komut satırı değişkenleri yapmak için gereklidir.
exitMain ç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, maindö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 Mainyürütülmeden kaynak yapabilirim . Sonra fonksiyonları tekrar kullanabilir veya kontrol etmek için testler yazabilirim.
main "$@"; exit(ile exitaynı satırda main), yorumlanırken değiştirilen dosyaya karşı bir koruma olarak da yararlıdır.
exitaynı satırda mainPeşinde dosyadan tekrar emin kabuk okumazlar şey yapmak maingetiri.
main; exit, main; exit $?ya main <EOF>her durumda, çıkış kodu mainkomut çıkış kodu olarak kullanılır. Bu exitsadece 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:
mainEn 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 . mainFonksiyon 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 mainiş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.
Crahat.
. yourfile) yapabilirsiniz.
ifbir 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 declaringbir 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 fbash