ฉันจะแสดงรายการฟังก์ชั่นที่กำหนดไว้ในเปลือกของฉันได้อย่างไร


223

ฉันสามารถพิมพ์นามแฝงเพื่อแสดงรายการชื่อแทนทั้งหมด

แต่สำหรับฟังก์ชั่นทั้งหมดที่ฉันสามารถทำได้คือ grep .bash_profileของฉัน

ที่ได้รับเฉพาะคนในไฟล์นั้นไม่ใช่สิ่งที่กำหนดไว้ในไฟล์ย่อยหรือแบบไดนามิก

มีวิธีที่สะดวกกว่าในการค้นหาว่าฟังก์ชั่นใดบ้างที่ถูกกำหนดไว้ในปัจจุบัน?



2
@AlastairIrvine ขอบคุณสำหรับการเสนอชื่อซ้ำ อย่างไรก็ตามฉันแก้ไขมันด้วยวิธีอื่น ๆ คำถามนี้มีจำนวนการดูมากขึ้นและมีผู้โหวตมากขึ้นรวมถึงการเลือกคำตอบที่กว้างขึ้น และคำตอบที่ได้รับการยอมรับในสำเนาที่คุณเสนอนั้นเป็นสิ่งที่คลุมเครือและไม่ถูกต้อง
tripleee

คำตอบ:


273

declare -F

ชื่อฟังก์ชั่นและคำจำกัดความอาจมีการระบุไว้พร้อมกับ-fตัวเลือก declareคำสั่ง builtin (ดู Bash Builtins) -Fตัวเลือกในการdeclare จะแสดงรายการชื่อฟังก์ชั่นเท่านั้น (และเลือกแฟ้มแหล่งที่มาและจำนวนบรรทัด)

คู่มืออ้างอิง Bash


1
ใน GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F แสดงรายชื่อ / -f แสดงรายการฟังก์ชันทั้งหมด
ceph3us

5
ในการรับไฟล์ต้นฉบับ / บรรทัด # "ทางเลือก" จะปรากฏขึ้นคุณต้องเปิดใช้งาน extdebug ( shopt -s extdebug) และให้ชื่อฟังก์ชั่นหนึ่งชื่อหรือมากกว่าเข้ากับdeclare -Fคำสั่ง IOW, declare -Fไม่ได้จัดหาชื่อไฟล์ / บรรทัด # ยิ่งเมื่อ extdebug ถูกเปิดใช้งานซึ่งไม่เป็นที่ชัดเจนจากเอกสารและไม่เป็นมันที่ใช้งานง่ายโดยเฉพาะอย่างยิ่ง IMO
Ron Burk

ดูคำตอบของ @ user495470 ด้านล่างเพื่อหาทางออกที่ดีกว่า
starbeamrainbowlabs

82

สมมติว่าทุบตีเปลือก:

typeset -f

จะแสดงรายการฟังก์ชั่น

typeset -F

จะแสดงรายการชื่อฟังก์ชั่น


8
ทุบตีของฉัน v4.1.17 (9) - ปล่อยพูดว่า:Obsolete. See `help declare'.
kevinarpe

5
มันยังดีที่รู้ว่ามันเป็นคำพ้อง
bmacnaughton

62
declare -F

จะให้ชื่อของฟังก์ชั่นทั้งหมด

type function_name

จะให้แหล่งที่มาสำหรับฟังก์ชั่นเฉพาะ


2
หรือเพียงใช้ประกาศ -f (ตัวพิมพ์เล็ก) สำหรับแหล่งที่มา
Katastic Voyage

51

declare -F พิมพ์คำสั่งประกาศจริงและไม่เพียง แต่ชื่อฟังก์ชัน:

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

คุณสามารถใช้compgen -A functionเพื่อพิมพ์ชื่อฟังก์ชันเท่านั้น:

$ compgen -A function
function1
function2

6
compgen -A functionเป็นเพียงสิ่งที่ฉันกำลังมองหา

2
ดี! ฉันต้องการนามแฝงเช่นกันในกรณีของฉัน ... คุณสามารถรับทั้งนามแฝงและฟังก์ชั่นด้วยcompgen -a -A function
Matt Byrne

+1 และฉันใช้สิ่งต่อไปนี้เพื่อส่งออกฟังก์ชั่นส่วนตัวของฉันเท่านั้น (บน Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak


4
set | grep " ()"

แทนgrepคุณสามารถใช้fgrepหรือhgrep ได้ (hgrep เป็นรายการโปรดส่วนตัวของฉันมัน grep แต่ hi-lites เป็นผลลัพธ์ 'grep-ped'

hgrepสามารถพบได้ที่นี่: ACME Labs hgrep


1
สิ่งนี้จะแสดงรายการฟังก์ชั่น แต่ยังรวมถึงตัวแปรที่มี `() 'ตามตัวอักษร
Alois Mahdal

2
@AloisMahdal set | grep " () $" | cut -d' ' -f1นี่คือหนึ่งในผลงานที่: แต่มันซับซ้อนเกินไปเมื่อเทียบกับคำตอบอื่น ๆ
wjandrea

5
grepไม่ใช่วิธีที่ดีสำหรับสิ่งนี้สตริงที่ตรงกับคำจำกัดความของฟังก์ชันจะทำให้เกิดผลบวกปลอม @wjandrea ยังคงสามารถจับได้โดยหลายสายเช่นเดียวกับ regex ใด ๆ
แมตต์

1

ฉันไม่มีความเชี่ยวชาญในเรื่องนี้ยังคงเรียนรู้ แต่หลังจากค้นหาคำถามนี้และคำตอบของคำถามนี้เพราะฉันต้องการสิ่งเดียวกันฉันเขียนสิ่งต่อไปนี้ (ตามคำตอบที่ว่า " The Archetypal Paul'sรายการที่จัดรูปแบบของทั้งนามแฝงและฟังก์ชั่น:

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"
}

นั่นคือก่อนที่ฉันจะเห็นคำตอบของ Lriและการคาดการณ์จากนั้นฉันจึงแทนที่declareและaliasบรรทัดด้วยcompgenคำสั่งที่เหมาะสมแทนเพื่อรับ:

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"
}

ทำกับสิ่งที่ฉันต้องการ แบ่งปันในกรณีที่ช่วยคนอื่น

มี "การกระทำ" compgen -A [action]อื่น ๆ อีกมากมายสำหรับ (และตัวเลือกอื่น ๆ สำหรับcompgenหลักสูตร) ฉันพบบทความที่ดีที่นี่ซึ่งมีลิงก์ไปยังหน้าคน (เพราะman compgenไม่ทำงานในบางกรณี)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.