Saya tidak tahu bagaimana menemukan file di mana fungsi bash didefinisikan ( __git_ps1
dalam kasus saya).
Saya bereksperimen dengan declare
, type
, which
, tapi tidak ada yang memberitahu saya file sumber. Saya membaca di suatu tempat yang declare
dapat mencetak nama file dan nomor baris, tetapi tidak dijelaskan caranya. The help
halaman untuk declare
tidak mengatakan itu baik.
Bagaimana saya bisa mendapatkan informasi ini?
$PATH
, makatype
tidak akan berfungsi. Anda mungkin ingin mencoba hanya menggunakanfind
ataulocate
.locate
akan jauh lebih cepat, karena menggunakan database yang sudah ada sebelumnya, tetapi itu tidak akan berfungsi jika perintah itu diinstal baru-baru ini.Jawaban:
Jika Anda siap untuk menjalankan fungsi, maka Anda bisa mendapatkan informasi dengan menggunakan
set -x
untuk melacak eksekusi dan mengaturPS4
variabel.Mulai bash dengan
--debugger
atau gunakanshopt -s extdebug
untuk merekam info debugging tambahan.Set
PS4
, 'prompt' dicetak saat melacak untuk menunjukkan baris sumber.Hidupkan pelacakan.
Anda kemudian dapat menjalankan fungsi Anda dan untuk setiap baris Anda akan mendapatkan nama file dari fungsi tersebut.
gunakan
set +x
untuk mematikan pelacakan.Jadi untuk kasus ini Anda akan lari
sumber
Jika Anda tidak ingin menjalankan fungsinya, Anda masih dapat mengatur debugging dan mendapatkan informasi. Langkah-langkahnya adalah
bash --debugger
ataushopt -s extdebug
sebelum fungsi didefinisikan.declare -F __git_ps1
dan itu akan melaporkan di mana fungsi didefinisikan.
Kelebihan metode ini dibandingkan dengan melihat jejak eksekusi beranotasi dengan PS4 adalah
Keuntungan dari jejak eksekusi adalah
Saya sangat merekomendasikan memiliki
shopt -s extdebug
pada awal keduanya~/.bashrc
dan~/.bash_profile
untuk menutupi file yang berbeda yang digunakan dalam kasus Doa yang berbeda .sumber
shopt -s extdebug
dipanggil setelah fungsi didefinisikan. Berhati-hatilah nomor baris tidak aktif (bug saat ini) jika fungsi dinyatakan melaluieval
.bash --debugger
saya harus benar-benar memicu penyelesaian untuk mendapatkan fungsi selesai didefinisikan dan melaporkannya darideclare -F _vpnc
.@ icarus solusi hebat bekerja untuk fungsi, selama mereka didefinisikan secara harfiah dan bukan hasil dari
eval
isi file lain (di mana file denganeval
akan muncul sebagai sumber). Itu tidak akan mencetak file sumber alias, built-in shell (sepertiecho
) dan executable (biner atau tidak), dan saya percaya informasi ini tidak tersedia secara umum. Beberapa perintah mungkin mencetak file sumber mereka (dan bahkan mungkin benar tentang hal itu), baik dalam pelaksanaan normal atau sebagai respons terhadap sinyal.__git_ps1
didefinisikan dalam/usr/share/git/git-prompt.sh
dan/usr/share/git/completion/git-prompt.sh
di sistem saya, Arch Linux, jadi mungkin sama untuk Anda.Silahkan lihat di Invocation bagian
man bash
jika Anda ingin mencari perintah khusus yang bersumber pada awal shell - mereka mungkin sumber file lainnya yang pada gilirannya sumber file lainnya.sumber
bash
?$HOME/.bashrc
dan dalam$HOME/.profile
. Lihat: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html yang menjelaskan beberapa detail kapan dan bagaimana masing-masing file berasal./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, Dan isi$ENV
dan$BASH_ENV
perlu ditambahkan ke daftar Anda.Tampaknya tidak mungkin dilakukan
bash
, tetapi ada dizsh
:sumber
find
/locate
/grep
.~/.whatever
file yang sama dengan bash secara default, dan hanya akan memberikan jawaban yang berguna untuk fungsi yang didefinisikan di lokasi bersama seperti dalam kasus ini, yang tidak didefinisikan ulang~/.bashrc
atau apa pun.Deklarasikan fungsi dengan nama yang sama dan atur agar dibaca hanya sedini mungkin, kemudian aktifkan mode xtrace, seperti:
Setelah itu ketika Anda masuk Anda akan melihat jejak informasi yang mencakup sumber file. Saat ini ada upaya untuk deklarasi fungsi readonly yang ada, Anda akan melihat pesan kesalahan. File sumber terakhir sebelum itu harus berisi deklarasi yang Anda cari.
Anda mungkin perlu memasukkan ini ke profil bash sistem. Ingat juga untuk mengembalikan perubahan setelah menemukan pelakunya.
sumber
Apakah kamu mencoba ini?
atau perintah lain yang ditemukan di sini:
Bagaimana cara menemukan semua file yang mengandung teks tertentu di Linux? | Stack Overflow
Sepertinya saya perlu memberi Anda lebih banyak penjelasan. Pertanyaan Anda bertanya "" Jadi, jika Anda menjalankan perintah berikut, ia akan mengembalikan semua file di mana fungsi bash didefinisikan.
Pemrograman BASH - Fungsi | Proyek Dokumentasi Linux
sumber