Пошук визначення функції bash


41

Я працюю в середовищі, в якому лежить багато застарілої магії сценарію оболонки. Одне з важких речей з командного рядка - це функції bash, які отримуються з якогось файлу, включеного з якогось файлу, що входить із якогось файлу ... включеного в мій .bash_profile. Чи є спосіб отримати визначення або ще краще розташування визначення цих функцій, не відстежуючи їх через 5 рівнів включень?

Відповіді:


39

Щоб отримати визначення функції:

type -a function_name


Якщо ви коли-небудь будете в Гранд-Рапідс, я придбаю вас особисто, інакше ми можемо знайти інший шлях ...
iconoclast

whence -f function_nameвzsh
децца

66

Якщо припустити, що у вас є функція, названа foo, команди нижче будуть отримувати визначення визначення функції, тобто вона отримає ім'я файлу, в якому визначена функція, а також номер рядка, при якому функція визначена в цьому файлі .

# 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

У моєму випадку вихід цих команд:

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

3
Ідеально. Я щойно перетворив це на функцію bash у своєму файлі bashrc. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Ніл

5
@Neil: Це зручно, дякую: дозвольте запропонувати використовувати підшалу для локалізації ефекту shoptбез зміни поточного стану оболонки: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(зверніть увагу на використання (...)замість {...}).
mklement0

Чому ці команди не працюють із сценарію? функція працює правильно
albfan

1
Це має бути прийнятою відповіддю.
розпущений

11

Щоб переглянути визначення функції (на відміну від того, звідки вона походить), використовуйте:

declare -f <functionname>

Я думаю, що цей кращий, ніж type -aтому, що він не друкує перший рядок, який залежить від
локальної роздратованості

1
але оскільки немає місця, це відповідь на незареєстроване запитання - принаймні тут
iconoclast

6

bash -xбуде скидати те, що баш працює під час його запуску, що дозволяє простежити його легше. Не забудьте вийти з нещодавно відкритої оболонки.


Зручні речі; щоб захопити слід у файлі, використовуйте script out.txt bash -x(знову ж, не забудьте exit).
mklement0

-2

інший спосіб, який я вважаю ще простішим останнім часом:

  which <functionname>

(це також покаже псевдонім чи сценарій, але не буде відслідковувати джерело псевдоніма)


2
Я не думаю, що whichдає інформацію про псевдоніми на BSD або mac. Також це питання стосується функцій, і whichне дає інформації про функції.
дбн

Дякую за цю замітку. Зараз я бачу, що "котрий" вирішує лише функції в zsh, а не bash.
Джошуа Голдберг

2
Я думаю, що ця відповідь, швидше за все, запросить голосні коментарі ... Схоже, це питання взагалі не стосується, оскільки немає інформації про місцезнаходження.
іконоборство

Я вважаю корисним для того, щоб відстежувати декларацію, щоб використовувати це та з’ясувати, чи це псевдонім чи функція, і знати синтаксис, з яким він був оголошений. Це правда, хоча лише відповідь @ HairOfTheDog надає файл безпосередньо.
Джошуа Голдберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.