Làm cách nào để liệt kê các hàm được định nghĩa trong trình bao của tôi?


221

Tôi có thể nhập bí danh để hiển thị danh sách tất cả các bí danh.

Nhưng đối với các chức năng, tất cả những gì tôi có thể làm là grep my .bash_profile.

Điều đó chỉ nhận được những cái trong tệp đó, không phải những cái được xác định trong tệp phụ hoặc động.

Có cách nào thuận tiện hơn để tìm hiểu những chức năng hiện đang được xác định?



2
@AlastairIrvine Cảm ơn đề cử trùng lặp; tuy nhiên, tôi đã giải quyết nó theo cách khác. Câu hỏi này có nhiều lượt xem và nâng cao hơn đáng kể, cũng như lựa chọn câu trả lời rộng hơn; và câu trả lời được chấp nhận trên bản sao được chỉ định của bạn được quyết định tối nghĩa và được cho là sai.
tripleee

Câu trả lời:


271

declare -F

Tên và định nghĩa hàm có thể được liệt kê với -ftùy chọn cho declarelệnh dựng sẵn (xem Bash Buildins). Các -Ftùy chọn để declare sẽ liệt kê các tên hàm chỉ (và tùy chọn các file nguồn và số dòng).

Tài liệu tham khảo Bash


1
trong GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F liệt kê tên / -f liệt kê toàn bộ chức năng
ceph3us

5
Để có được tệp / dòng # "tùy chọn", có vẻ như bạn phải bật extdebug ( shopt -s extdebug) VÀ cung cấp một hoặc nhiều tên hàm cho declare -Flệnh. IOW, declare -Fkhông không cung cấp tên tập tin / dòng # là ngay cả khi extdebug được kích hoạt, mà không phải là rõ ràng từ các tài liệu, cũng không phải là đặc biệt trực quan, IMO.
Ron Burk

Xem câu trả lời của @ user495470 bên dưới để có giải pháp tốt hơn.
starbeamrainbowlabs

82

Giả sử vỏ bash:

typeset -f

sẽ liệt kê các chức năng.

typeset -F

sẽ chỉ liệt kê các tên hàm.


8
Bash v4.1.17 (9) của tôi nói:Obsolete. See `help declare'.
kevinarpe

5
Thật tốt khi biết đó là một từ đồng nghĩa.
bmacnaughton

62
declare -F

sẽ cho bạn tên của tất cả các chức năng

type function_name

sẽ cung cấp cho bạn nguồn cho một chức năng cụ thể


2
Hoặc chỉ sử dụng khai báo -f (chữ thường) cho nguồn
Katastic Voyage

51

declare -F thực sự in các lệnh khai báo và không chỉ tên hàm:

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

Bạn chỉ có thể sử dụng compgen -A functionđể in tên hàm:

$ compgen -A function
function1
function2

6
compgen -A functionchỉ là những gì tôi đang tìm kiếm.

2
Đẹp! Tôi cũng muốn có bí danh trong trường hợp của mình ... bạn có thể có cả bí danh và chức năng vớicompgen -a -A function
Matt Byrne

+1 và tôi đã sử dụng các cách sau để chỉ xuất các chức năng cá nhân của mình (trên Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

sắp chữ đã lỗi thời, vui lòng sử dụng:

declare -f

hoặc là

declare -f function_name

hoặc là

type function_name

4
set | grep " ()"

Thay cho grep, bạn cũng có thể sử dụng fgrep hoặc hgrep (hgrep là sở thích cá nhân của tôi, đó là grep nhưng nó hi-lites kết quả 'grep-ped'.

hgrep có thể được tìm thấy ở đây: ACME Labs hgrep


1
Điều này sẽ liệt kê các hàm nhưng cũng có các biến có giá trị `()`
Alois Mahdal

2
@AloisMahdal Đây là một trong những hoạt động : set | grep " () $" | cut -d' ' -f1. Nhưng nó quá phức tạp so với các câu trả lời khác.
wjandrea

5
grepkhông phải là một giải pháp tốt cho việc này, các chuỗi khớp với các định nghĩa hàm sẽ gây ra kết quả dương tính giả. @wjandrea vẫn có thể bị bắt bởi các chuỗi nhiều dòng, như bất kỳ regex nào.
Matt

1

Tôi không phải là chuyên gia về vấn đề này, vẫn đang học, nhưng sau khi tìm thấy câu hỏi này và câu trả lời của nó vì tôi cũng muốn như vậy, tôi đã viết như sau (dựa trên câu trả lời " Tuyên bố của Archetypal Paul ") để cho tôi biết cuối cùng tôi là gì: một danh sách được định dạng của cả bí danh và hàm:

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

Đó là trước khi tôi thấy câu trả lời của Lri , và vì vậy ngoại suy từ đó, tôi thay thế các dòng declarealiasdòng bằng các compgenlệnh thích hợp thay vào đó, để có được:

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

Một điều trị cho những gì tôi muốn. Chia sẻ trong trường hợp nó giúp bất cứ ai khác.

Có vô số "hành động" khác có sẵn cho compgen -A [action](và các tùy chọn khác cho compgenkhóa học). Tôi đã tìm thấy một bài viết tốt ở đây cũng bao gồm một liên kết đến trang man (vì man compgentrong một số trường hợp không hoạt động).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.