फ़ाइल को कैसे खोजें जहां एक बश फ़ंक्शन परिभाषित है?


33

मैं यह नहीं पता लगा सकता कि फ़ाइल को कैसे ढूंढा जाए जहां एक बश फ़ंक्शन परिभाषित हो ( __git_ps1मेरे मामले में)।

मैं प्रयोग के साथ declare, type, which, लेकिन कुछ भी मेरे स्रोत फ़ाइल बताता है। मैंने कहीं पढ़ा कि declareफ़ाइल का नाम और लाइन नंबर प्रिंट कर सकते हैं, लेकिन यह नहीं बताया गया कि कैसे। के लिए helpपेज declareयह भी नहीं कहता है।

मुझे यह जानकारी कैसे मिल सकती है?


यदि फ़ंक्शन की फ़ाइल का पथ शामिल नहीं है $PATH, तो typeकाम नहीं करेगा। तुम सिर्फ findया का उपयोग करने की कोशिश करना चाहते हो सकता है locatelocateबहुत तेजी से होगा, क्योंकि यह पहले से मौजूद डेटाबेस का उपयोग करता है, लेकिन यह काम नहीं करेगा यदि कमांड हाल ही में स्थापित किया गया था।
user628544

जवाबों:


37

यदि आप फ़ंक्शन को चलाने के लिए तैयार हैं, तो आप set -xनिष्पादन का पता लगाने और PS4चर को सेट करने के लिए उपयोग करके जानकारी प्राप्त कर सकते हैं ।

  1. अतिरिक्त डिबगिंग जानकारी रिकॉर्ड --debuggerकरने के shopt -s extdebugलिए के साथ बैश शुरू करें या उपयोग करें।

  2. सेट करें PS4, जब स्रोत लाइन दिखाने के लिए ट्रेस करते समय 'प्रॉम्प्ट' प्रिंट होता है।

  3. ट्रेसिंग चालू करें।

  4. फिर आप अपना फ़ंक्शन चला सकते हैं और प्रत्येक पंक्ति के लिए आपको फ़ंक्शन का फ़ाइल नाम मिलेगा।

  5. set +xट्रेसिंग को बंद करने के लिए उपयोग करें।

तो इस मामले के लिए आप चलेंगे

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x

"-x कमांड के लिए प्रत्येक साधारण कमांड के विस्तार के बाद, कमांड कमांड, कमांड का चयन करें, या कमांड के लिए अंकगणित, PS4 के विस्तारित मूल्य को प्रदर्शित करें, उसके बाद कमांड और उसके विस्तारित तर्क या संबंधित शब्द सूची।" अच्छा!
l0b0

25

यदि आप फ़ंक्शन को चलाने के लिए तैयार नहीं हैं, तो आप अभी भी डिबगिंग सेट कर सकते हैं और जानकारी प्राप्त कर सकते हैं। कदम हैं

  1. फ़ंक्शन शुरू bash --debuggerया shopt -s extdebugपरिभाषित होने से पहले।
  2. declare -F __git_ps1

और यह रिपोर्ट करेगा कि फ़ंक्शन कहाँ परिभाषित है।

PS4 के साथ एनोटेट निष्पादन ट्रेस देखने की तुलना में इस पद्धति के फायदे हैं

  • बहुत कम उत्पादन
  • यह सीधे सवाल का जवाब देता है

निष्पादन ट्रेस के फायदे हैं

  • एक ही बार में सभी कार्यों को देखें
  • बुलाया कार्यों के बीच संबंधों को देखें
  • पुनरावृत्ति देखें

मैं दृढ़ताshopt -s extdebug से दोनों की शुरुआत में ~/.bashrcऔर ~/.bash_profileअलग- अलग मंगलाचरण मामलों में उपयोग की जाने वाली विभिन्न फाइलों को कवर करने की सलाह देता हूं ।


1
यह भी कार्य करता है अगर फ़ंक्शन परिभाषित होने के बादshopt -s extdebug कहा जाता है। यदि फ़ंक्शन के माध्यम से घोषित किया गया है तो सावधान लाइन नंबर बंद हो सकता है (एक करंट बग) । eval
स्टीफन चेज़लस

मैं vpnc के लिए एक गुमराह पूरा होने के बाद था। बाद bash --debuggerपूरा होने के समारोह में परिभाषित किया गया हो और इसे से सूचना प्राप्त करने के लिए मैं वास्तव में पूरा होने को गति प्रदान करने के लिए किया था declare -F _vpnc
हेराल्ड

9

@ इकारस का शानदार समाधान फ़ंक्शंस के लिए काम करता है, जब तक कि वे शाब्दिक रूप से परिभाषित न हों और evalकिसी अन्य फ़ाइल की सामग्री का परिणाम न हो (जिसमें फ़ाइल evalस्रोत के रूप में दिखाई देगी)। यह उपनामों, शेल बिल्ट-इन (जैसे echo) और निष्पादन योग्य (बाइनरी या नहीं) के स्रोत फ़ाइल को प्रिंट नहीं करेगा , और मेरा मानना ​​है कि यह जानकारी सामान्य रूप से उपलब्ध नहीं है। कुछ कमांड्स अपनी स्रोत फ़ाइलों को प्रिंट कर सकती हैं (और इसके बारे में सत्य भी हो सकती हैं), या तो सामान्य निष्पादन के दौरान या सिग्नल के जवाब में।

__git_ps1में /usr/share/git/git-prompt.shऔर /usr/share/git/completion/git-prompt.shमेरे सिस्टम पर, आर्क लिनक्स में परिभाषित किया गया है , इसलिए यह आपके लिए समान हो सकता है।

यदि आप विशेष रूप से शेल की शुरुआत में आदेशित आदेशों को देखना चाहते हैं , तो मंगलाचरण अनुभाग पर एक नज़र डालें man bash- वे अन्य फ़ाइलों को स्रोत कर सकते हैं जो बदले में अन्य फ़ाइलों को स्रोत करते हैं।


क्या कोई उन फ़ाइलों की सूची प्राप्त कर सकता है जो शुरू होने पर खट्टी हो जाती हैं bash?
pfnuesel

@pfnuesel - यह आपके ऊपर है। चूक अंदर $HOME/.bashrcऔर अंदर हैं $HOME/.profile। देखें: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html जो प्रत्येक फ़ाइल को कब और कैसे खट्टा किया जाता है, इसके कुछ विवरण बताता है।
जो

2
@Joe gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html एक बेहतर संदर्भ है। /etc/profile, $HOME/.bash_profile, $HOME/.bash_login, और की सामग्री $ENVऔर $BASH_ENVजरूरत अपनी सूची में जोड़े जाने के लिए।
इकारस

@icarus - धन्यवाद। यह एक बेहतर व्याख्या है।
जो

8

यह संभव नहीं लगता है bash, लेकिन यह इसमें है zsh:

$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh

सवाल बैश निर्दिष्ट करता है ...
जेफ स्कालर

4
@JeffSchaller: इस उत्तर का उपयोग करने का स्पष्ट तरीका zsh को उन्हीं फाइलों को सोर्स करने के लिए सेट करना है जो बैश होती हैं, फिर परिभाषा खोजने के लिए इसका उपयोग करें। यह जवाब zsh पर स्विच करने का सुझाव नहीं दे रहा है, बस यह स्पष्ट रूप से एक उपयोगी उपकरण है जो शेल सिंटैक्स को जेनेरिक टूल जैसे find/ locate/ से बेहतर समझता है grep
पीटर कॉर्डेस

मेरा दावा है, तो, @PeterCordes, कि यह उत्तर वर्तमान में वह नहीं करता है जो आप कहते हैं कि प्रश्न का उत्तर देने के लिए इसे करना चाहिए। मुझे नहीं पता कि अगर zsh मूल रूप से वही फाइलें पढ़ता है जो बैश करता है।
जेफ स्कालर

@JeffSchaller: इस उत्तर से सहमत हैं कि सुधार की आवश्यकता है। zsh लगभग निश्चित ~/.whateverरूप से डिफ़ॉल्ट रूप से बैश के रूप में एक ही फाइल नहीं पढ़ता है , और केवल इस तरह साझा किए गए स्थानों में परिभाषित कार्यों के लिए उपयोगी उत्तर देगा, जो कि ~/.bashrcया जो कुछ भी फिर से परिभाषित नहीं किया गया है ।
पीटर कॉर्डेस

-1

एक ही नाम के साथ एक फ़ंक्शन को घोषित करें और इसे जितनी जल्दी हो सके सेट करें, फिर xtrace मोड को सक्रिय करें, कुछ इस तरह से:

__git_ps1(){ :;}
readonly -f __git_ps1
set -x

उसके बाद जब आप लॉग इन करेंगे तो ट्रेस जानकारी देखेंगे जिसमें फाइलों की सोर्सिंग शामिल है। पल में मौजूदा रीडोनली फ़ंक्शन की घोषणा के लिए एक प्रयास है, आपको एक त्रुटि संदेश दिखाई देगा। इससे पहले की अंतिम खामियों वाली फाइल में वह घोषणा होनी चाहिए, जिसकी आपको तलाश है।

आपको इसे सिस्टम बैश प्रोफाइल में डालना होगा। अपराधी को खोजने के बाद परिवर्तनों को वापस करना भी याद रखें।


-3

क्या आपने यह कोशिश की?

grep -rnw '/path/to/somewhere/' -e "pattern" 

या यहां मिलने वाली कोई भी अन्य कमांड:

मुझे लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे मिलेंगी? | स्टैक ओवरफ़्लो

ऐसा लगता है कि मुझे आपको स्पष्टीकरण देने की आवश्यकता है। आपका प्रश्न पूछता है "" इस प्रकार यदि आप निम्न कमांड चलाते हैं, तो उसे उन सभी फाइलों को वापस कर देना चाहिए, जहां एक बैश फ़ंक्शन परिभाषित है।

grep -rnw 'Path2Search' -e "#!/bin/bash"

BASH प्रोग्रामिंग - कार्य | लिनक्स प्रलेखन परियोजना


1
लिंक केवल उत्तर बिल्कुल प्रोत्साहित नहीं कर रहे हैं। कृपया कुछ स्पष्टीकरण जोड़ें।
हेमेयेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.