Kabuğumda tanımlanan işlevleri nasıl listeleyebilirim?


223

Tüm takma adların bir listesini göstermek için takma ad yazabilirim.

Ama fonksiyonlar için yapabileceğim tek şey grep my .bash_profile.

Bu sadece o dosyadakileri alır, ikincil dosyalarda veya dinamik olarak tanımlananları değil.

Şu anda hangi işlevlerin tanımlandığını bulmanın daha uygun bir yolu var mı?



2
@AlastairIrvine Çift adaylık için teşekkürler; ancak, bunu tam tersine çözdüm. Bu soru, daha geniş bir görüş yelpazesinin yanı sıra önemli ölçüde daha fazla görüşe ve upvote'a sahiptir; ve aday gösterdiğiniz kopyaya kabul edilen cevap kesinlikle belirsiz ve tartışmasız yanlıştır.
Üçlü

Yanıtlar:


273

declare -F

İşlev adları ve tanımları yerleşik komut -fseçeneğiyle listelenebilir declare(bkz. Bash Builtins). -FSeçeneği declare yalnızca (ve isteğe bağlı kaynak dosya ve satır numarası) İşlev adlarını listeler.

Bash Referans Kılavuzu


1
içinde GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F isimleri listeler / -f tüm işlevi listeler
ceph3us

5
"İsteğe bağlı" kaynak dosyayı / satırı # almak için, extdebug ( shopt -s extdebug) işlevini etkinleştirmeniz VE declare -Fkomuta bir veya daha fazla işlev adı girmeniz gerekir . IOW, declare -Fyok değil hat # extdebug IMO, belgelerinden belli değil, ne de özellikle sezgisel olan etkin olsa bile s / dosya tedarik ediyoruz.
Ron Burk

Daha iyi bir çözüm için @ user495470'in cevabına bakınız.
starbeamrainbowlabs

82

Bash kabuğu varsayılırsa:

typeset -f

fonksiyonları listeler.

typeset -F

yalnızca işlev adlarını listeler.


8
Benim Bash v4.1.17 (9) -Raha diyor:Obsolete. See `help declare'.
Kevinarpe

5
Bir eşanlamlı olduğunu bilmek hala güzel.
bmacnaughton

62
declare -F

size tüm fonksiyonların isimlerini verecek

type function_name

size belirli bir fonksiyon için kaynak verecektir


2
Veya sadece kaynak için declare -f (küçük harf) kullanın
Katastic Voyage

51

declare -F aslında sadece komut isimlerini değil, deklarasyon komutlarını yazdırır

$ declare -F
declare -f function1
declare -f function2

compgen -A functionYalnızca işlev adlarını yazdırmak için kullanabilirsiniz :

$ compgen -A function
function1
function2

6
compgen -A functiontam da aradığım şeydi.

2
Güzel! Benim durumumda da takma adlar istedim ... hem takma adlar hem de işlevler ile alabilirsinizcompgen -a -A function
Matt Byrne

+1 ve yalnızca kişisel işlevlerimi (Linux Debian'da) çıktılamak için aşağıdakileri kullandım:compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

dizgi eski, lütfen kullanın:

declare -f

veya

declare -f function_name

veya

type function_name

4
set | grep " ()"

Grep yerine fgrep veya hgrep kullanabilirsiniz (hgrep benim kişisel favorim, grep ama 'grep-ped' sonucunu hi-lites.

hgrep burada bulunabilir: ACME Labs hgrep


1
Bu fonksiyonların yanı sıra ``) değeri olan değişkenleri de listeleyecektir
Alois Mahdal

2
@AloisMahdal İşte biri olduğunu çalışır: set | grep " () $" | cut -d' ' -f1. Ancak diğer cevaplara kıyasla aşırı derecede karmaşık.
wjandrea

5
grepbunun için iyi bir çözüm değildir, işlev tanımlarıyla eşleşen dizeler yanlış pozitiflere neden olur. @wjandrea, herhangi bir normal ifade gibi çok satırlı dizeler tarafından yakalanmaya devam edebilir.
Matt

1

Bu konuda uzman değilim, hala öğreniyorum, ancak bu soruyu ve cevabını bulduktan sonra aynı şeyi istediğimden sonra, nihayetinde bana ne olduğumu vermek için aşağıdakileri yazdım (" Arketipik Pavlus'un ilanı " cevabına dayanarak ): hem takma adların hem de işlevlerin biçimlendirilmiş bir listesi:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

Bu Lri'nin cevabını görmeden önceydi ve bundan ötürü ekstrapolasyon yaparken, declareve aliassatırları compgenyerine uygun komutlarla değiştiriyorum :

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

Ne istediğimi bir tedavi Woks. Başkalarına yardımcı olması durumunda paylaşma.

Kullanılabilecek çok sayıda "eylem" compgen -A [action](ve compgenelbette diğer seçenekler ) vardır. Burada da man sayfasına bir bağlantı içeren iyi bir yazı buldum (çünkü man compgenbazı durumlarda işe yaramaz).

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.