जैसे ही वे निष्पादित होते हैं, शेल कमांड को कैसे इको करें


910

शेल स्क्रिप्ट में, मैं सभी शेल कमांड को कैसे गूँजता हूँ और किसी भी चर नाम का विस्तार करता हूँ?

उदाहरण के लिए, निम्नलिखित पंक्ति दी गई है:

ls $DIRNAME

मैं स्क्रिप्ट को कमांड चलाना और निम्नलिखित प्रदर्शित करना चाहूंगा

ls /full/path/to/some/dir

उद्देश्य सभी शेल कमांडों और उनके तर्कों के लॉग को सहेजना है। क्या इस तरह के लॉग को उत्पन्न करने का एक बेहतर तरीका है?

जवाबों:


1041

set -xया set -o xtraceचर का विस्तार करता है और रेखा से पहले थोड़ा + चिह्न प्रिंट करता है।

set -vया set -o verboseमुद्रण से पहले चर का विस्तार नहीं करता है।

का प्रयोग करें set +xऔर set +vऊपर दी गई सेटिंग बंद करने के लिए।

स्क्रिप्ट की पहली पंक्ति पर, कोई भी #!/bin/sh -x(या -v) स्क्रिप्ट में बाद में set -x(या -v) के समान प्रभाव डाल सकता है ।

ऊपर वाला भी साथ काम करता है /bin/sh

बैश-हैकर्स की विकी setविशेषताओं पर , और डीबगिंग पर देखें

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

7
यदि आप यह भी देखना चाहते हैं कि कौन सी क्रमांकित रेखा निष्पादित हो रही है तो देखें stackoverflow.com/a/17805088/1729501
user13107

3
क्या होगा यदि मैं कमांड और उसके परिणाम आउटपुट में अंतर करने के लिए गूंजते समय कमांड को रंग देना चाहता हूं?
लुईस चान

10
क्या होगा अगर मैं इसे गूँजने पर स्पीच-सिंथेसाइज़र की तरह प्रत्येक कमांड को गाना चाहता हूँ, तो मैं सुन सकता हूँ कि यह दूर से क्या कर रहा है और संगीत का आनंद भी ले रहा है? शायद इनपुट और आउटपुट के लिए एक अलग आवाज में।
ADJenks

(ABS के पास लंबे समय से अप्रचलित होने का अनुरोध करने का एक लंबा इतिहास है कि वे खराब-प्रैक्टिस उदाहरणों को सही करते हैं, लंबे समय तक समुदाय के सदस्यों को प्रतिस्पर्धी संसाधन बनाने के लिए ड्राइविंग के बिंदु पर; आधिकारिक बैश मैनुअल भी बेहतर संसाधन होंगे)।
चार्ल्स डफी

316

set -x आपको वही देगा जो आप चाहते हैं।

यहाँ एक उदाहरण शेल स्क्रिप्ट प्रदर्शित करने के लिए है:

#!/bin/bash
set -x #echo on

ls $PWD

यह सभी चर का विस्तार करता है और कमांड के आउटपुट से पहले पूर्ण कमांड प्रिंट करता है।

आउटपुट:

+ ls /home/user/
file1.txt file2.txt

21
शब्द "वर्बोज़" का उपयोग करना इस तरह से कुछ भी पूरा नहीं करता है। आप कर सकते हैं set -o verboseया set -v(केवल " क्रिया") या set -o xtraceया set -x(केवल "xtrace") या set -xv(दोनों) या set -o xtrace -o verbose(दोनों)।
अगली सूचना तक रोक दिया गया।

यह अच्छा काम करता है, लेकिन ध्यान रखें कि "
क्रिया

90

मैं कमांड को इको करने और चलाने के लिए एक फंक्शन का उपयोग करता हूं:

#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }

exe echo hello world

जो आउटपुट देता है

$ echo hello world
hello world

अधिक जटिल कमांड पाइप आदि के लिए, आप eval का उपयोग कर सकते हैं:

#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }

exe eval "echo 'Hello, World!' | cut -d ' ' -f1"

जो आउटपुट देता है

$  echo 'Hello, World!' | cut -d ' ' -f1
Hello

इस जवाब के लिए कई वोट नहीं। वहाँ एक कारण यह एक बुरा विचार है? मेरे लिए काम किया है, और लगता है कि मैं क्या देख रहा हूँ ...
fru1tbat

1
यदि आप प्रत्येक कमांड मुद्रित नहीं करना चाहते हैं तो यह सबसे अच्छा उत्तर है। यह ++ set +xबंद होने पर आउटपुट से बचा जाता है, साथ ही साथ क्लीनर को भी देखता है। सिर्फ एक बयान या दो के लिए, हालांकि, एक सबस्क्रिप्शन का उपयोग करके bhassel का उत्तर सबसे सुविधाजनक है।
ब्रेंट फस्ट

यह मैं क्या देख रहा हूँ! नहीं set +x, यह सभी आदेशों को प्रभावित करता है, जो बहुत अधिक है!
Hlung

11
इसका एक प्रमुख पहलू यह है कि आउटपुट उद्धृत सूचना खो देता है। आप उदाहरण के लिए cp "foo bar" bazऔर के बीच अंतर नहीं कर सकते cp foo "bar baz"। इसलिए उपयोगकर्ता के लिए प्रगति की जानकारी प्रदर्शित करना अच्छा है; आउटपुट डिबगिंग या प्रतिलिपि प्रस्तुत करने योग्य आदेशों को रिकॉर्ड करने के लिए कम। विभिन्न उपयोग के मामले। में zsh, आप :qसंशोधक के साथ उद्धरण संरक्षित कर सकते हैं :exe() { echo '$' "${@:q}" ; "$@" ; }
एंड्रयू जंके

2
मुझे यह उत्तर पसंद नहीं है। बहुत सारे किनारे मामले हैं जहां आप जो देखते हैं वह वह नहीं है जो आपको मिलता है (विशेष रूप से व्हॉट्सएप, उद्धरण, बच गए वर्ण, चर / अभिव्यक्ति प्रतिस्थापन, आदि), इसलिए नेत्रहीन कमांड को टर्मिनल में पेस्ट न करें और मान लें कि यह चल जाएगा। उसी तरह। इसके अलावा, दूसरी तकनीक सिर्फ एक हैक है, और evalआपके कमांड से शब्द के अन्य उदाहरणों को छीन लेगी । तो यह ठीक से काम करने की उम्मीद नहीं है exe eval "echo 'eval world'"!
mwfearnley

88

आप भी कर सकते हैं टॉगल यह उन्हें में लपेटकर द्वारा अपनी स्क्रिप्ट में चुनिंदा लाइनों के लिए set -xऔर set +xउदाहरण के लिए,

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

54

चुनिंदा पंक्तियों को प्रतिध्वनित करने के लिए shuckc के उत्तर में कुछ डाउनसाइड्स हैं: आप निम्नलिखित set +xकमांड के साथ-साथ प्रतिध्वनित होते हैं, और आप बाहर निकलने वाले कोड का परीक्षण करने की क्षमता खो देते हैं $?क्योंकि यह ओवरराइट हो जाता हैset +x

एक और विकल्प एक सब-कमांड में कमांड को चलाने के लिए है:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

जो आपको आउटपुट देगा जैसे:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

यह हालांकि, कमांड के लिए एक नया उप-समूह बनाने के ओवरहेड को उकसाता है।


7
++ set +xआउटपुट से बचने का अच्छा तरीका ।
ब्रेंट फस्ट

3
इससे भी बेहतर: if [ $? -eq 0 ]साथ बदलें if (set -x; COMMAND)
अमेडी वैन गेससे

35

एक अन्य विकल्प कमांड लाइन पर अपनी स्क्रिप्ट के शीर्ष पर "-x" रखना है:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

ध्यान दें कि यह बिल्कुल ./myScriptऔर के बीच एक ही काम नहीं करता है bash myScript। फिर भी एक अच्छी बात है, धन्यवाद।
वेलेन्डी

27

के अनुसार TLDP के अध्याय 2. लेखन और डिबगिंग स्क्रिप्ट: शुरुआती के लिए बैश गाइड :

2.3.1। पूरी स्क्रिप्ट पर डिबगिंग

$ bash -x script1.sh

...

SourceForge में उपलब्ध बैश के लिए अब एक पूर्ण डिबगडर है । ये डिबगिंग फीचर बैश के अधिकांश आधुनिक संस्करणों में उपलब्ध हैं, जो 3.x से शुरू होता है।

2.3.2। स्क्रिप्ट के भाग (भागों) पर डिबगिंग

set -x            # Activate debugging from here
w
set +x            # Stop debugging from here

...

तालिका 2-1। सेट डिबगिंग विकल्पों का अवलोकन

    Short  | Long notation | Result
    -------+---------------+--------------------------------------------------------------
    set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
    set -v | set -o verbose| Prints shell input lines as they are read.
    set -x | set -o xtrace | Print command traces before executing command.

...

वैकल्पिक रूप से, इन विधियों को स्क्रिप्ट में ही निर्दिष्ट किया जा सकता है, पहली पंक्ति शेल घोषणा में वांछित विकल्प जोड़कर। विकल्पों को जोड़ा जा सकता है, जैसा कि आमतौर पर UNIX आदेशों के साथ होता है:

#!/bin/bash -xv

18

बैश स्क्रिप्ट के नाम से पहले कमांड लाइन पर "बैश -x" टाइप करें। उदाहरण के लिए, foo.sh निष्पादित करने के लिए, टाइप करें:

bash -x foo.sh

11

आप विकल्प के साथ डिबग मोड में एक बैश स्क्रिप्ट निष्पादित कर सकते हैं-x

यह सभी आदेशों को प्रतिध्वनित करेगा।

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

आप स्क्रिप्ट में -x ऑप्शन को भी सेव कर सकते हैं । बस -xशेबंग में विकल्प निर्दिष्ट करें ।

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

2
इसके अलावा bash -vxभी ऐसा ही होगा, लेकिन बिना चर प्रक्षेप
loa_in_

4

Zsh के लिए, प्रतिध्वनि

 setopt VERBOSE

और डिबगिंग के लिए,

 setopt XTRACE

2

के लिए cshऔर tcsh, आप कर सकते हैं set verboseयाset echo (या आप भी दोनों सेट कर सकते हैं, लेकिन यह कुछ दोहराव में समय के सबसे अधिक हो सकता है)।

verboseविकल्प काफी सटीक खोल अभिव्यक्ति है कि आप टाइप प्रिंट करता है।

echoविकल्प क्या उत्पन्न करने के माध्यम से क्रियान्वित की जाएगी के अधिक संकेत है।


http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo


Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.



1

कंपाउंड कमांड्स की गूंज के लिए अनुमति देने के लिए, मैं evalप्लस सोथ का उपयोग करता हूंexe कमांड को चलाने और चलाने के लिए फ़ंक्शन । यह पाइप्ड कमांड्स के लिए उपयोगी है जो अन्यथा केवल पाइप्ड कमांड का कोई भी या केवल प्रारंभिक भाग नहीं दिखाएगा।

बिना निष्कासन:

exe() { echo "\$ $@" ; "$@" ; }
exe ls -F | grep *.txt

आउटपुट:

$
file.txt

Eval के साथ:

exe() { echo "\$ $@" ; "$@" ; }
exe eval 'ls -F | grep *.txt'

जो आउटपुट देता है

$ exe eval 'ls -F | grep *.txt'
file.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.