मैं कैसे देख सकता हूँ कि वास्तव में शेल या कमांड या फ़ंक्शन के माध्यम से शेल में क्या कमांड चलती थी


20

उदाहरण के लिए मेरे पास एक बैश फ़ंक्शन (या उपनाम) है function install() {sudo apt-get install $@}। कमांड चलाते समय install dicelab, मुझे जो उम्मीद है वह वास्तव में चलाया जाएगा sudo apt-get install dicelab। मैं कहां देख सकता हूं कि वास्तव में शेल द्वारा क्या चलाया गया था? मैं यह सुनिश्चित करना चाहूंगा कि मेरे अधिक जटिल उपनाम उम्मीद के मुताबिक काम कर रहे हैं।


क्या यह $@आपके उपनाम का हिस्सा है? याद रखें कि उपनाम वास्तव में तर्कों का समर्थन नहीं करते हैं, जो कि उपनाम को बुलाते हुए संदर्भ के स्थितीय मापदंडों (यदि कोई हो) का विस्तार करेगा। रनिंग का सामान्य तरीका somealias some argsसिर्फ उर्फ ​​का विस्तार करके और इसका पालन करने के लिए तर्कों को छोड़ कर काम करता है। यदि आप वास्तव में तर्कों का उपयोग करने में सक्षम होना चाहते हैं, तो एक फ़ंक्शन का उपयोग करें, और"$@"
ilkkachu


1
@AlonAviv, अच्छा। :) फिर भी, सबसे अच्छा यह उद्धृत करने की आदत डालें "$@", व्हाट्सएप या ग्लोब पात्रों के साथ तर्क अन्यथा जल जाएगा।
इलकाचु

1
@DarkHeart यह कोई डुप्लिकेट नहीं है। अन्य प्रश्न शेल फ़ंक्शन से चिंतित नहीं है।
Kusalananda

2
न तो यह तब तक था जब तक कि इसे अपने विषय को पूरी तरह से बदलने के लिए संपादित नहीं किया गया था (और मौजूदा उत्तरों में से एक को अमान्य कर दिया गया था)।
माइकल होमर

जवाबों:


29

set -xखोल में उपयोग करें ।

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

का उपयोग करते हुए set -xचालू हो जाता है xtraceखोल विकल्प ( set +xयह बंद हो जाती है) और में काम करना चाहिए सब बॉर्न की तरह गोले, की तरह bash, dash ksh93, pdkshऔर zsh। यह शेल को कमांड को प्रदर्शित करने का संकेत देता है जिसे उपनाम विस्तार और चर विस्तार आदि के बाद निष्पादित किया जाता है।

आउटपुट शेल के मानक त्रुटि स्ट्रीम पर होगा (साधारण प्रॉम्प्ट की तरह) तो यह मानक आउटपुट के पुनर्निर्देशन में हस्तक्षेप नहीं करेगा, और यह PS4शेल वेरिएबल ( +␣डिफ़ॉल्ट रूप से) के रूप में एक प्रॉम्प्ट से पहले होगा ।

कुछ कार्यों के साथ उदाहरण:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

मैं set -xडिफ़ॉल्ट रूप से अपने सभी इंटरैक्टिव गोले में चल रहा हूं । यह देखना अच्छा है कि वास्तव में क्या निष्पादित हुआ ... लेकिन मैंने देखा है कि प्रोग्राम टैब पूरा होने आदि कुछ गोले में अवांछित ट्रेस आउटपुट हो सकते हैं।


14

आप उपयोग कर सकते हैं shell-expand-line, जो डिफ़ॉल्ट रूप से Control- Alt- के लिए बाध्य है e:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

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

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

यह एक अच्छी सुविधा है। क्या आपको पता है कि zsh के पास एक समान कमांड है shell-expand-line?
the_velour_fog

क्षमा करें, मैं नहीं करता क्योंकि मैं उपयोग नहीं करता zsh। लेकिन कुछ लोग अपने स्वयं के विचारों के साथ आए हैं: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
अर्कादिअस डेर्स्कज़ीक


1

आप typeएक उपनाम या फ़ंक्शन परिभाषा जिसे आप चलाने जा रहे हैं, देखने के लिए बैश बिलिन का उपयोग कर सकते हैं :

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.