Tìm định nghĩa của hàm bash


41

Tôi làm việc trong một môi trường có rất nhiều phép thuật kịch bản vỏ kế thừa nằm xung quanh. Một thứ được sử dụng nhiều từ dòng lệnh là các hàm bash có nguồn gốc từ một số tệp được bao gồm từ một số tệp được bao gồm từ một số tệp ... có trong .bash_profile của tôi. Có cách nào để có được định nghĩa hoặc thậm chí tốt hơn vị trí của định nghĩa của các hàm này mà không theo dõi chúng qua 5 cấp độ bao gồm không?

Câu trả lời:



66

Giả sử bạn có một hàm có tên foo, các lệnh bên dưới sẽ lấy vị trí của định nghĩa của hàm, nghĩa là nó sẽ lấy tên của tệp trong đó hàm được xác định cũng như số dòng mà hàm được xác định trong tệp đó .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Trong trường hợp của tôi, đầu ra của các lệnh này là:

foo 32 /source/private/main/developer/cue.pub.sh

3
Hoàn hảo. Tôi vừa thực hiện điều này thành một hàm bash trong tệp bashrc của mình. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil

5
@Neil: Thật tiện dụng, cảm ơn: hãy để tôi đề xuất sử dụng một lớp con để bản địa hóa hiệu ứng shoptmà không thay đổi trạng thái của shell hiện tại: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(lưu ý sử dụng (...)thay vì {...}).
mkuity0

Tại sao các lệnh đó không hoạt động từ một tập lệnh? chức năng hoạt động chính xác
albfan

1
Đây phải là câu trả lời được chấp nhận.
giải thể

11

Để xem định nghĩa của hàm (trái ngược với nơi nó đến), hãy sử dụng:

declare -f <functionname>

Tôi nghĩ rằng cái này tốt hơn type -abởi vì nó không in dòng đầu tiên phụ thuộc địa phương gây phiền nhiễu ~ ~
yuyichao

1
nhưng vì không có vị trí nào được đưa ra nên đây là câu trả lời cho một câu hỏi không được trả lời, ít nhất là không được trả lời ở đây
iconoclast

6

bash -xsẽ loại bỏ những gì bash đang chạy khi nó khởi động, điều này sẽ cho phép bạn theo dõi nó dễ dàng hơn. Đừng quên thoát khỏi vỏ mới mở.


Đồ tiện dụng; để ghi lại dấu vết trong một tệp, sử dụng script out.txt bash -x(một lần nữa, đừng quên exit).
mkuity0

-2

một cách khác, gần đây tôi thấy đơn giản hơn:

  which <functionname>

(điều này cũng sẽ hiển thị cho dù đó là bí danh hay tập lệnh, nhưng sẽ không theo dõi nguồn gốc của bí danh)


2
Tôi không nghĩ whichcung cấp thông tin về bí danh trên BSD hoặc mac. Ngoài ra, câu hỏi này là về các chức năng, và whichkhông cung cấp thông tin về các chức năng.
dbn

Cảm ơn cho lưu ý đó. Bây giờ tôi thấy rằng "which" chỉ giải quyết các hàm trong zsh, không phải bash.
Joshua Goldberg

2
Tôi nghĩ rằng câu trả lời này có khả năng mời downvote ... dường như không giải quyết được câu hỏi nào cả, vì không có thông tin về địa điểm.
iconoclast

Tôi thấy nó hữu ích cho mục đích theo dõi khai báo để sử dụng điều này và tìm hiểu xem đó là bí danh hay hàm và để biết cú pháp được khai báo. Mặc dù chỉ có câu trả lời của @ HairOfTheDog mới cung cấp tệp trực tiếp.
Joshua Goldberg
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.