Bash có thể hiển thị định nghĩa của hàm không?


262

Có cách nào để xem định nghĩa của hàm bash trong bash không?

Ví dụ, giả sử tôi đã xác định hàm foobar

function foobar {
    echo "I'm foobar"
}

Có cách nào để sau này có được mã foobarchạy không?

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

Câu trả lời:


357

Sử dụng type. Nếu foobarđược định nghĩa ví dụ trong ~/.profile:

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

Điều này không tìm ra cái gì foobarđã được, và nếu nó được định nghĩa là một hàm thì nó gọi declare -fnhư được giải thích bởi pmohandras.

Để chỉ in phần thân của hàm (tức là mã), hãy sử dụng sed:

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

2
@sjsupersumit Câu hỏi rõ ràng yêu cầu một giải pháp Bash.
bfontaine

210

Bạn có thể hiển thị định nghĩa của hàm trong bash bằng cách sử dụng khai báo. Ví dụ:

declare -f foobar

1
Tuyệt vời, đến mức, hoạt động ngay cả khi các chức năng được xác định trong các tệp tập lệnh được tải khác. Hoạt động cũng trong zsh.
Diego Nemo

2
Hoạt động với hệ vỏ cũ trên các hệ thống không phải linux nếu bạn sử dụngtypeset -f
Emmanuel

cũng tốt vì nó chỉ hiển thị functionđịnh nghĩa, vì vậy bạn không phải phân tích nếu đó là những gì bạn muốn.
ribamar

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

Điều này về cơ bản in các dòng từ lệnh set của bạn bắt đầu bằng tên hàm foobar () và kết thúc bằng}


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

với foobar là tên hàm.


4
vấn đề: sẽ chỉ hiển thị tối đa "}" đầu tiên, đây không phải là tất cả mọi thứ bất cứ khi nào định nghĩa chứa các tổ của "{...}" mà Bash thực sự cho phép.
Kiến trúc sư Destiny

1
Cũng có thể thất bại nếu hàm chứa chuỗi here-doc / here-chuỗi có chứa kiểu uốn cong
Cheetah
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.