क्या यह जांचना संभव है कि एक उपनाम कहां परिभाषित किया गया था?


24

एक उपनाम, जैसे llकि aliasकमांड के साथ परिभाषित किया गया है ।

मैं type llकिन चीजों की प्रिंट के साथ कमांड की जांच कर सकता हूं

ll is aliased to `ls -l --color=auto'

या command -v llजो प्रिंट करता है

alias ll='ls -l --color=auto'

या alias llजो प्रिंट भी करता है

alias ll='ls -l --color=auto'

लेकिन मुझे यह पता नहीं लग सकता है कि उर्फ ​​को कहां परिभाषित किया गया था, अर्थात फाइल जैसे कि .bashrc, या शायद मैन्युअल शेल में। इस बिंदु पर मैं अनिश्चित हूँ अगर यह भी संभव है।

क्या मुझे बस उन सभी फाइलों से गुज़रना चाहिए जो उनके द्वारा लोड की गई हैं bashऔर उनमें से हर एक की जाँच करें?


कफ बंद मैं चलाने कहेंगेbash -xl
जेफ स्कालर

जवाबों:


21

मैनुअल परिभाषा (इतिहास लॉग, शायद) को खोलना मुश्किल होगा, हालांकि शेल से यह दिखाने के लिए कि वह क्या कर रहा है और फिर grepउन्हें आरसी फ़ाइल में सेट खोजने में मदद करनी चाहिए:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

यदि शेल उपरोक्त इनवोकेशनों में से किसी एक के साथ आवश्यक विकल्पों को ठीक से कैप्चर नहीं कर रहा है (जो अंतःक्रियात्मक रूप से नल कमांड चलाता है), तो script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

एक अन्य विकल्प यह होगा कि शेल का स्पर्श करने वाली सभी फ़ाइलों को खोजने straceया sysdigखोजने के लिए कुछ का उपयोग करें , फिर उन पर मैन्युअल रूप से जाएं (यदि शेल या प्रोग्राम में कोई ध्वज नहीं है तो काम करें ); मानक RC फाइलें मैन्युअल फ़ाइलनाम जांच के लिए पर्याप्त नहीं हैं, अगर ओह-माय-ज़श या साइट-विशिष्ट कॉन्फ़िगरेशन जैसी कोई चीज़ कोड में खींच रही है, जो जानता है कि कहां (या वहां भी पर्यावरण चर हो सकते हैं, जैसा कि उनके उत्तर में सोरोंटर बताते हैं) ।grep-x


धन्यवाद! भले ही आउटपुट पार्स करने के लिए थोड़ा कठिन है, लेकिन मुझे वह फ़ाइल मिली जिसने उस उपनाम को परिभाषित किया था जिसकी मुझे तलाश थी। जब उपनाम उस सूची में कहीं भी मौजूद नहीं है, तो क्या यह मान लेना सुरक्षित होगा कि उपनाम मैन्युअल रूप से परिभाषित किया गया था?
पोलीमोन 22

@ पल्मोन कुछ सुरक्षित; यह उस फ़ाइल में परिभाषित किया जा सकता है (या किया गया है) जिसे पढ़ा नहीं जा रहा है क्योंकि कौन जानता है कि क्या-कारण-या-या-हटा दिया गया है (विशेषकर यदि किसी प्रकार का शेल फ्रेमवर्क है जो जटिलता को जोड़ता है जो उपयोगकर्ता नहीं करता है समझना)।
थ्रीग

1
उस बिंदु को बनाने के लिए जहां उपनाम को खोजने में थोड़ा आसान है, आप PS4 का उपयोग कर सकते हैं, जो हर पंक्ति में एक ट्रेस में PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
प्रीपेड है

5

यहाँ मुझे grep -rlबहुत उपयोगी लगता है:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

आपको बताएगा कि किस फ़ाइल में शब्द aliasका उपयोग किया गया है।

शायद में ~/.bashrcऔर सबसे निश्चित रूप से ~/.bash_aliasesअगर यह मौजूद है।


हालांकि यह सुनिश्चित करना असंभव है कि सभी विकल्पों को शामिल किया जाए। वे फाइलें किसी अन्य फाइल को कॉल या लोड भी कर सकती हैं। ईएनवी जैसा पर्यावरण चर या $BASH_ENVकुछ अन्य फाइलों को लोड करने के लिए बैश का निर्देश दे सकता है।

वातावरण में चर BASH_ENV के लिए दिखता है, यदि यह वहाँ दिखाई देता है, तो इसका मान बढ़ाता है, और विस्तारित मान का उपयोग पढ़ने और निष्पादित करने के लिए फ़ाइल के नाम के रूप में करता है।

और उपनाम भी एक चर (जोर मेरा) सेट करके परिभाषित किया जा सकता है:

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


grep -rl alias ~/.bash*मिथ्या मिलान इतिहास फ़ाइलों से हो सकता है, लेकिन BASH_ALIASES सरणी इंगित करने के लिए +1!
जेफ स्कालर

2

मैं वास्तव में अपने उपनामों के स्रोत को सूचीबद्ध करने के तरीके के बारे में नहीं जानता, लेकिन चूंकि ऐसा लगता है कि आप बैश का उपयोग कर रहे हैं, मुझे लगता है कि ये संभव संभव फाइलें हैं:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

आपको उन लोगों के माध्यम से प्राप्त करने में सक्षम होना चाहिए जैसे कि उपनाम, उदाहरण के लिए grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc


या वहाँ से शामिल फाइलें ...
जेफ स्कॉलर

@JeffSchaller - ठीक है, आपको उस तरह के लिए कुछ अधिक जटिल की आवश्यकता होगी bash -x, जैसा आपने उल्लेख किया है। मुझे लगा कि उपर्युक्त को जल्दी से चलाना आसान था और यदि यह उपनाम नहीं मिला तो आप निष्पादन चरणों के माध्यम से पढ़ सकते हैं।
एडोमन

1

संयोजन thrig के जवाब के साथ @ MarkPlotnick के सुझाव , आप चाहे परीक्षण कर सकते हैं BASH_ALIASES[ll]इसे नीचे संकीर्ण करने के लिए निर्धारित है। BASH_SOURCEसरणी और LINENOचर यहाँ विशेष रूप से उपयोगी है। दुर्भाग्य से, जांचें कि क्या BASH_ALIASES[ll]सेट किया गया है, केवल उर्फ के सेट होने के बाद ही सफल होगा , और इसलिए पहली ऐसी लाइन पूरी तरह से दूसरी फाइल में हो सकती है।

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

जैसे आउटपुट देना:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

आप इस चेक का उपयोग करके शेल को समाप्त भी कर सकते हैं:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'

0

मैं बस का उपयोग कर सफलता मिली है which

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
whichtcsh (और शायद पहले csh) और zsh में जहाँ यह एक बिल्डिन है, में एलियास को संभाल सकता है, और RedHat-family पर डिफ़ॉल्ट प्रोफ़ाइल का उपयोग करके बैश करता है, जिसमें (बाहरी) GNU प्रोग्राम चलाने के लिए एक कीचड़ है, लेकिन शेल उपनाम डेटा फ़ीड करें, अन्यथा नहीं । अधिक महत्वपूर्ण केवल यह बताता है कि उपनाम किसके लिए निर्धारित किया गया है, न कि जहां इसे सेट किया गया था, जो यहां क्यू था।
dave_thompson_085


-1

मुझे अंत llमें दो शेल स्क्रिप्ट में हमारे वेब सर्वर (CentOS) के लिए अन्य नाम मिला /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

मैंने इसे पहले उन टिप्पणियों से सीखा, जहां सिस्टम-वाइड प्रोफ़ाइल थी /etc/profile:। उस फ़ाइल में कहा गया है कि सिस्टम-वाइड एलियाज़ को परिभाषित किया गया है /etc/bashrc, और उस फ़ाइल में मैंने देखा कि यह कई शेल स्क्रिप्ट के माध्यम से लूप करती है /etc/profile.d/, और इसलिए मैंने grepउस डायरेक्टरी में उपयोग किया और अंत में परिभाषाएँ पाईं। मुझे यह भी पता चला कि एक l.उपनाम है जो सभी डॉट फ़ाइलों को सूचीबद्ध करता है:

से colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(इसमें बराबर के उपनाम हैं colorls.csh।)


-1

पहले निम्नलिखित कमांड का उपयोग करें

सभी कार्यों को सूचीबद्ध करें

functions 

सभी उपनामों की सूची बनाएं

alias 

यदि आपको उपनाम या फ़ंक्शन नहीं मिल रहा है, तो अधिक आक्रामक खोज विधि पर विचार करें

बैश संस्करण

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh संस्करण

zsh -ixc : 2>&1 | grep thingToSearchHere

विकल्पों का संक्षिप्त विवरण

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.