shell - एक शेल स्क्रिप्ट में: निष्पादित किए जाने पर शेल कमांड को इको करें




(10)

Zsh गूंज के लिए

 setopt VERBOSE

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

 setopt XTRACE

एक शेल स्क्रिप्ट में मैं किसी भी परिवर्तनीय नामों को बुलाए और विस्तारित सभी शेल आदेशों को कैसे प्रतिबिंबित करूं? उदाहरण के लिए, निम्नलिखित पंक्ति दी गई है:

ls $DIRNAME

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

ls /full/path/to/some/dir

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


आप set -x में उन्हें लपेटकर और set +x उदा 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

उपर्युक्त कोई पोस्ट किया गया:

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

और यह आशाजनक लग रहा है, लेकिन मैं अपने जीवन के लिए यह नहीं समझ सकता कि यह क्या करता है। मैंने "\ $" और "$ @" के लिए मैन बैश पेज में गुगल किया है और खोजा है, और बिल्कुल कुछ भी नहीं मिला है

मैं समझता हूं कि एक फ़ंक्शन बनाया जा रहा है, जिसका नाम "exec ()" है। मैं समझता हूं कि घुंघराले-ब्रैकेट फ़ंक्शन की शुरुआत और अंत को चिह्नित करते हैं। मुझे लगता है कि मैं समझता हूं कि सेमी-कोलन एक बहु-पंक्ति कमांड के बीच "हार्ड रिटर्न" चिह्नित करता है, ताकि '{echo "\ $ $ @"; "$ @"; } 'संक्षेप में बन जाता है:

{
echo "\$ [email protected]"
"[email protected]"

}

क्या कोई मुझे एक संक्षिप्त स्पष्टीकरण दे सकता है, या यह जानकारी कहां मिल सकती है, क्योंकि जाहिर है कि मेरा google-fu मुझे विफल कर रहा है?

(पुराने धागे पर एक नया प्रश्न शुरू करने के अर्थ के बिना, मेरा लक्ष्य आउटपुट को फ़ाइल में दोबारा शुरू करना है। "सेट-एक्स; [कमांड]; सेट + एक्स" विधि मेरे लिए पर्याप्त रूप से अच्छी तरह से काम करेगी, लेकिन मैं ' टी को स्क्रीन के बजाय किसी फ़ाइल में परिणामों को प्रतिबिंबित करने का तरीका पता नहीं है, इसलिए मैं इस अन्य विधि को समझने की कोशिश कर रहा था कि मैं एक ही चीज करने के लिए मुझे पुनर्निर्देशन / पाइप / टी / आदि की बहुत खराब समझ का उपयोग कर सकता हूं।)

धन्यवाद!

लेटर संपादित करें:

कुछ tinkering के साथ, मुझे विश्वास है कि मैंने इसे समझ लिया। मुझे जो चाहिए उसकी आवश्यकता के लिए मेरा समकक्ष कोड यहां दिया गया है:

SCRIPT_LOG="\home\buddy\logfile.txt"
exe () {
  params="[email protected]"                       # Put all of the command-line into "params"
  printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"   # Print the command to the log file
  $params                           # Execute the command
}

exe rm -rf /Library/LaunchAgents/offendingfile
exe rm -rf /Library/LaunchAgents/secondoffendingfile

Logfile.txt में परिणाम कुछ ऐसा दिखते हैं:

Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/offendingfile
Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/secondoffendingfile

मुझे जिस चीज की जरूरत थी। धन्यवाद!


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

$ cat ./server
#!/bin/bash -x
ssh [email protected]

$ ./server
+ ssh [email protected]
[email protected]'s password: ^C
$

(चुने गए उत्तर पर टिप्पणी करने के लिए अपर्याप्त प्रतिनिधि।)


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

bash -x foo.sh

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

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

exe echo hello world

कौन सा आउटपुट

$ echo hello world
hello world

संपादित करें:

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

#!/bin/bash
#function to display commands
exe() { echo "\$ ${@/eval/}" ; "[email protected]" ; }

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

कौन सा आउटपुट

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

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

2.3.1। पूरी लिपि पर डिबगिंग

$ bash -x script1.sh

...

बैश के लिए अब एक पूर्ण डीबगर है, जो SourceForge पर उपलब्ध 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.  

...

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

#!/bin/bash -xv

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.


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

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

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

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

उपरोक्त /bin/sh साथ भी काम करता है।

http://www.faqs.org/docs/abs/HTML/options.html

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

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

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

आउटपुट निम्नानुसार है:







shell