सवाल बैश स्क्रिप्ट को निष्पादित करने से पहले प्रत्येक कमांड को प्रिंट करने के लिए कैसे करें?


उदाहरण के लिए, मेरे पास एक साधारण बैश फ़ाइल है

#!/bin/bash
cd ~/hello
ls

इसे निष्पादित करने से पहले मैं इसे प्रत्येक आदेश कैसे प्रदर्शित कर सकता हूं? विंडोज बैच स्क्रिप्टिंग में बस "@echo off" के विपरीत प्रभाव।


74
2018-05-31 13:39


मूल


उन लोगों के लिए जो खोज रहे हैं set विकल्प हैं, आप उन्हें पा सकते हैं इस आदमी पेज पर। - mkobit
आप बस इस तरह शेबांग का विस्तार कर सकते हैं #!/bin/bash -x - sobi3ch


जवाब:


bash -x script

या

set -x

लिपि में

आप फिर से विकल्प को अनसेट कर सकते हैं set +x। यदि आप इसे कुछ कमांड के लिए करना चाहते हैं तो आप सबहेल का उपयोग कर सकते हैं: `(set -x; command1; कमांड; ...;)


98
2018-05-31 13:44



मैंने हमेशा इसका प्रभाव बहुत अच्छा प्रभाव दिया है। आउटपुट की तुलना में आउटपुट थोड़ा गंदे दिखता है। - Scott Pack
व्यवस्थित करके PS4 आप के संकेत को ट्विक कर सकते हैं -x। उदा .: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script (date हालांकि इसे धीमा कर देगा, हालांकि) - Walter Tross


ये भी काम करते हैं:

set -v

या

#!/bin/bash -v

लेकिन -v प्रत्येक स्क्रिप्ट लाइन से पहले पीएस 4 स्ट्रिंग को प्रिंट नहीं करता है और यह व्यक्तिगत रूप से "के लिए" कथन (उदाहरण के लिए) के चरणों का पता नहीं लगाता है। यह टिप्पणियां गूंजता है जबकि -x नहीं करता है।

-V का उपयोग कर आउटपुट का एक उदाहरण यहां दिया गया है:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

-X के साथ एक ही स्क्रिप्ट का परिणाम यहां दिया गया है:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

ध्यान दें कि -v और -x के बीच अंतरों पर जोर देने के लिए मैंने "echo -n" शामिल किया था। इसके अलावा, -v "-o verbose" जैसा ही है, लेकिन बाद वाला शेबांग के हिस्से के रूप में काम नहीं करता है।


22
2018-05-31 15:28



महान स्पष्टीकरण! कोई शोध किए बिना, यह मुझे लगता है कि वर्बोज़ और एक्स्प्लिट वे हैं जो उन दो अक्षरों के लिए खड़े हैं। - Ape-inago
मुझे लगता है -x eXecute के करीब है। - Steven Parkes


यह भी काम करना चाहिए:

#!/bin/bash -x
cd ~/hello
ls

10
2018-05-31 14:18





यह काम करना चाहिए:

set -o verbose #echo on
...
set +o verbose #echo off

5
2018-05-31 13:44





set -o xtrace तथा set +o xtrace आपके दोस्त हैं (यह अधिक verbose है, की तुलना में -o verbose, और आउटपुट एसटीडीईआरआर में जाता है, वर्बोज़ के विपरीत, जो STDOUT को लॉग इन करता है)।

और सुझाव देखें यहाँ


4
2018-06-10 12:45





कुछ तरीके हैं।

#!/usr/bin/env bash -x

शेबांग लाइन के रूप में।

समेत set -x स्क्रिप्ट में ही कार्यक्षमता को सक्षम करेगा set +x इसे अक्षम कर देगा। इन दोनों विधियों में अधिक पोर्टेबल शेल के साथ भी काम करेगा।

अगर मुझे सही याद है कि perl में -x विकल्प भी है।


3
2018-05-31 19:09





की तरह चला जाता है

language -x script

भाषा = पायथन, perl, bash -x = ऑपरेटर स्क्रिप्ट = फ़ाइल नाम

आशा करता हूँ की ये काम करेगा।


2
2018-05-31 16:12



-x पाइथन में गूंजने के साथ कुछ भी नहीं है - Eugene Pankov