Lütfen bana bir işlevi ana kabukta (bash, sh veya ksh) nasıl dışa aktaracağımı söyleyin, böylece işlev üst süreçten çıkarılan tüm çocuk süreçler tarafından kullanılabilir.
Lütfen bana bir işlevi ana kabukta (bash, sh veya ksh) nasıl dışa aktaracağımı söyleyin, böylece işlev üst süreçten çıkarılan tüm çocuk süreçler tarafından kullanılabilir.
Yanıtlar:
Bu export -f
özellik Bash'e özeldir:
ebeveyn
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
çocuk
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
Gelen sh
, öyle değil gibi bir işlev vermek mümkün Charles Duffy tarafından kaydetti .
Ksh veya zsh kullanıyorsanız:
FPATH
Tüm işlevlerinizi yerleştirebileceğiniz ortam değişkenini kullanabilirsiniz .
Eğer FPATH
interaktif bir tercüman ayarlanır ve bir komut veya işlev geçerli kabuk ortamında bulunmayan ya PATH
, dizinleri eksik komutundan sonra adlı bir dosyanın varlığını orada aranır sıraladı. Biri bulunursa, kaynağı mevcut kabuk ortamında elde edilir ve işlevi tanımlaması beklenir.
Böylece, tüm işlevlerinizi içindeki bir konuma yerleştirebilirsiniz FPATH
ve alt komut dosyaları da onu bulabilir.
İstediğiniz autoload
işlevleri yüklemek için kabuk komut dosyalarındaki komutu kullanabilirsiniz :
autoload fun_a fun_b
Zsh'da çalışmak autoload
için gereklidir FPATH
. İçinde ksh
ve yakın akrabalarında, FPATH
doğrudan tanımlandıklarında olduğu gibi, içinde tanımlanan işlevlerin PATH'inizdeki normal komutu geçersiz kılmasına neden olduğuna inanıyorum .
Bazı ayrıntılar FPATH
ve autoload
:
İle alt ( )
kabuklar oluşturursanız, tüm tanımların, parametrelerin ve kabuk değişkenlerinin anlık görüntüsünü devralırlar.
Bunları programlar gibi çalıştırırsanız, tanımları içine koyabilirsiniz .bashrc
.
Bir PATH komutu için bir sarmalayıcı veya ikame yürütmek için mevcut bir betiği taklit etmeye çalışıyorsanız .bashrc
, yürütmenin ayrıntılarına bağlı olarak çalışacaktır. Değilse, bunun yerine sadece yapan bir sarıcı komut dosyası yürütebilir .
veya source
bir sonra tanımlar fonksiyonları ve komutları ile kabuk komut dosyası ile aynı şey ikame edilmesi anlamına dosyası içerir ait.
Sarmalayıcı komut dosyası şöyle görünebilir:
script=$1
shift
. include.sh
. $script "$@"
Buradaki fikir, ilk parametrenin gerçek komut dosyasının adı olması ve kalan parametrelerin bağımsız değişkenler olmasıdır, ardından bunun yerine yukarıdaki komut dosyası çalıştırılır.
declare -x -f NAME
Daha fazla bilgi
-f eylemi kısıtlayın veya işlev adlarına ve tanımlarına göre görüntüleme NAME'leri dışa aktarmak için -x
bash
olduğunu unutmayın . ( ksh
'In muadili için declare
, typeset
bir sahip -x
seçeneği, ancak yalnızca için geçerlidir değişkenler ; ditto için değil, işlevleri zsh
).