İşlevleri içeren ortam değişkenleri bir bash hack. Zsh'da benzer bir şey yok. Birkaç kod satırına benzer bir şey yapabilirsiniz. Ortam değişkenleri karakter dizileri içerir; bash'ın eski sürümleri, Shellshock keşfedilmeden önce , fonksiyonun kodunu, adı fonksiyonun adı olan ve () {
ardından fonksiyonun kodunu takip eden bir değişkende sakladı}
. Bu kodlamaya sahip değişkenleri içe aktarmak için aşağıdaki kodu kullanabilir ve bunları bash benzeri ayarlarla çalıştırmayı deneyebilirsiniz. Zsh'nin tüm bash özelliklerini taklit edemediğini unutmayın, yapabileceğiniz tek şey biraz daha yaklaşmaktır (örneğin $foo
, değeri bölmek ve joker karakterleri genişletmek ve dizileri 0 tabanlı yapmak).
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
( Shellshock'un orijinal keşfi Stéphane Chazelas'ın belirttiği gibi, bu cevabın daha önceki bir sürümü, eğer fonksiyon tanımı yanlış biçimlendirilmişse, bu noktada isteğe bağlı kod çalıştırabilirdi. çevreden ithal edilen bir işlev olabilir.)
Bash kodlamasının Shellshock sonrası sürümleri, ortamdaki geçersiz değişken adlarını (örn. BASH_FUNC_myfunc%%
) Kullanır . Bu, zsh, bu tür değişken isimlerini ortamdan çıkarmak için bir arayüz sağlamadığından güvenilir şekilde ayrıştırmalarını zorlaştırır.
Bunu yapmanı tavsiye etmiyorum. Dışa aktarılan işlevlere komut dosyalarına güvenmek kötü bir fikirdir: komut dosyanızda görünmez bir bağımlılık oluşturur. Komut dosyanızı, işleve sahip olmayan bir ortamda (başka bir makinede, bir cron işinde, kabuk başlatma dosyalarınızı değiştirdikten sonra…) çalıştırırsanız, komut dosyanız artık çalışmaz. Bunun yerine, tüm işlevlerinizi bir veya daha fazla ayrı dosyada (bunun gibi bir şey ~/lib/shell/foo.sh
) saklayın ve kullandığı işlevleri ( . ~/lib/shell/foo.sh
) alarak komut dosyalarınızı başlatın . Bu şekilde, değiştirirseniz foo.sh
, hangi komut dosyalarının buna dayandığını kolayca arayabilirsiniz. Bir komut dosyasını kopyalarsanız, hangi yardımcı dosyalara ihtiyaç duyduğunu kolayca bulabilirsiniz.
Zsh (ve ondan önceki ksh), işlevleri kullanılan komut dosyalarına otomatik olarak yüklemek için bir yol sağlayarak bunu daha uygun hale getirir. Kısıt, dosya başına yalnızca bir işlev koyabileceğinizdir. Fonksiyonu otomatik olarak yükler ve fonksiyon tanımını, fonksiyonun adı olan bir dosyaya koyun. Bu dosyayı $fpath
( FPATH
ortam değişkeni ile yapılandırabileceğiniz) içinde listelenen bir dizine yerleştirin . Komut dosyanızda, autoloaded işlevleri ile ilan edin autoload -U foo
.
Ayrıca, zsh ayrıştırma zamanından tasarruf etmek için komut dosyalarını derleyebilir. zcompile
Bir betiği derlemek için arayın . Bu .zwc
uzantılı bir dosya oluşturur . Bu dosya varsa autoload
, kaynak kod yerine derlenmiş dosyayı yükler. Sen kullanabilirsiniz zrecompile
işlevini Bir dizindeki için (yeniden) derleme tüm işlev tanımları.