Bash bir işlevin tanımını gösterebilir mi?


262

Bir bash işlevinin tanımını bash'da görüntülemenin bir yolu var mı?

Örneğin, fonksiyonu tanımladığımı varsayalım foobar

function foobar {
    echo "I'm foobar"
}

Daha sonra foobarçalışan kodu almanın herhangi bir yolu var mı ?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

Yanıtlar:


357

Kullanın type. Eğer foobarörneğin Sepetinde tanımlanır ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

Bu, ne foobarolduğunu bulur ve eğer bir işlev olarak tanımlanırsa, declare -fpmohandras tarafından açıklandığı gibi çağırır .

Fonksiyonun sadece gövdesini (yani kodu) yazdırmak için şunu kullanın sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit Soru açıkça bir Bash çözümü istiyor.
bfontaine

210

Bir fonksiyonun tanımını bildir komutunu kullanarak bash'da görüntüleyebilirsiniz. Örneğin:

declare -f foobar

1
Büyük, noktaya kadar, diğer yüklü komut dosyalarında tanımlanan işlevler olsa bile çalışır. Ayrıca zsh içinde çalışır.
Diego Nemo

2
Kullanırsanız linux olmayan sistemlerde eski kabuklarla çalışırtypeset -f
Emmanuel

iyi de sadece functiontanımı gösterir , bu yüzden istediğiniz şeyse ayrıştırmak zorunda değilsiniz.
ribamar

5
set | sed -n '/^foobar ()/,/^}/p'

Temelde foobar () işlev adıyla başlayan ve} ile biten set komutunuzdaki satırları yazdırır.


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

foobar işlev adıdır.


4
sorun: sadece ilk Bash için izin verilen "{...}" yuvalarını içerdiğinde her şey değil, ilk "}" görüntüler.
Destiny Architect

1
İşlev, süslü ayraç deseni içeren burada-doc / here-string içeriyorsa da başarısız olabilir
Çita
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.