Bir bash fonksiyonunun tanımını bulma


41

Etrafta pek çok eski kabuk senaryosu büyüsü olan bir ortamda çalışıyorum. Komut satırından ağır kullanılan bir şey, benim .bash_profile dosyamda yer alan bir dosyada bulunan bir dosyada bulunan bazı dosyalardan elde edilen bash işlevleridir. Tanımlamayı elde etmek için bir yol var mı veya daha iyi bir işlev var mı?

Yanıtlar:



66

Foo adında bir işleve sahip olduğunuzu varsayalım, aşağıdaki komutlar, işlevin tanımının konumunu, işlevin tanımlandığı dosyanın adını ve işlevin o dosya içinde tanımlandığı satır numarasını alır. .

# 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

Benim durumumda bu komutların çıktısı:

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

3
Mükemmel. Bunu sadece bashrc dosyamda bir bash işlevi haline getirdim. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil

5
@Neil: Bu kullanışlı, teşekkürler: shoptGeçerli kabuğun durumunu değiştirmeden etkisini yerelleştirmek için alt kabuk kullanmayı önereyim: whichfunc () ( shopt -s extdebug; declare -F "$1"; )( (...)bunun yerine kullanılmasına dikkat edin {...}).
mklement0

Bu komutlar neden bir komut dosyasından çalışmıyor? fonksiyonu düzgün çalışır
albfan

1
Bu kabul edilen cevap olmalı.
çözüldü

11

İşlevin tanımını görmek için (geldiği yerin aksine), şunları kullanın:

declare -f <functionname>

Bence bu daha iyidir type -açünkü sinir
bozucu

1
ama verilen hiçbir yer olmadığından, bu sorulmamış bir sorunun cevabıdır - en azından burada
iconoclast

6

bash -xhangi bash'in başladığını, daha kolay izlemenizi sağlayacak şekilde ne attığını bırakacaktır. Yeni açılan kabuktan çıkmayı unutma.


Kullanışlı şeyler; İzi bir dosyada yakalamak için kullanın script out.txt bash -x(tekrar unutmayın exit).
mklement0

-2

Son zamanlarda daha da basit bulduğum başka bir yol:

  which <functionname>

(bu aynı zamanda bir takma ad mı yoksa bir komut dosyası mı olacağını da gösterir, ancak takma adın kaynağını izlemez)


2
whichBSD veya mac'ta takma adlar hakkında bilgi verdiğini sanmıyorum . Ayrıca, bu soru fonksiyonlar hakkındadır ve fonksiyonlar hakkında bilgi whichvermez.
dbn

Bu not için teşekkürler. Şimdi "hangi" nin fş değil zsh işlevlerini çözdüğünü görüyorum.
Joshua Goldberg

2
Sanırım bu cevabın aşağı oy vermesi muhtemel ... sanırım konum hakkında hiçbir bilgi yok çünkü soruya değiniyor.
iconoclast

Bunu kullanmak için bildirimi izlemek ve bunun bir takma ad veya işlev olup olmadığını öğrenmek ve bununla birlikte bildirildiği sözdizimini bilmek amacıyla faydalı buldum. Sadece @ HairOfTheDog'un cevabının dosyayı doğrudan verdiği doğrudur.
Joshua Goldberg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.