Kabuktaki bir işlevi dışa aktarma


Yanıtlar:


106

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)) )

2
dışa aktarılmış işlevi yalnızca çocuk aramaları için kullanılabilir mi? Mevcut bash oturumuna nasıl uygulanır? .bashrc yazmayı sever, ancak yalnızca mevcut bash örneği için ...
vp_arth

3
@vp_arth: Çocuk aramalarında işleve ihtiyacınız yoksa, onu dışa aktarmanıza gerek yoktur. Geçerli oturumda her iki şekilde de kullanılabilir (bir dosyada tanımlanmışsa, dosyayı geçerli oturumda kullanılabilir hale getirmek için çalıştırmak yerine kaynak olarak kullanmanız gerekeceğini unutmayın).
Dennis Williamson


3

Ksh veya zsh kullanıyorsanız:

FPATHTüm işlevlerinizi yerleştirebileceğiniz ortam değişkenini kullanabilirsiniz .

Eğer FPATHinteraktif 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 FPATHve alt komut dosyaları da onu bulabilir.

İstediğiniz autoloadişlevleri yüklemek için kabuk komut dosyalarındaki komutu kullanabilirsiniz :

autoload fun_a fun_b

Zsh'da çalışmak autoloadiçin gereklidir FPATH. İçinde kshve yakın akrabalarında, FPATHdoğ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 FPATHve autoload:


1

İ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 sourcebir 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.


2
Bunları bir kodlama örneği ile açıklar mısınız?
İşlevimi

1
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

6
Lütfen bunun özelbash olduğunu unutmayın . ( ksh'In muadili için declare, typesetbir sahip -xseçeneği, ancak yalnızca için geçerlidir değişkenler ; ditto için değil, işlevleri zsh).
mklement0

0

İşlevler doğası gereği dışa aktarılamaz. Ancak dizeleri dışa aktarabilirsiniz, bu yüzden burada küçük bir numaram var:

func="$(typeset -f funcname)"
export func

İşlevi içe aktarmak için dışa aktarılan dizeden yeniden tanımlayın:

# in subshell
eval "$func"
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.